অ্যারে কেন আইলিস্ট প্রয়োগ করে?


141

সিস্টেম.আরয়ের শ্রেণির সংজ্ঞা দেখুন

public abstract class Array : IList, ...

তাত্ত্বিকভাবে, আমার এই বিটটি লিখতে এবং খুশি হওয়া উচিত

int[] list = new int[] {};
IList iList = (IList)list;

আইলিস্ট থেকে আমার যে কোনও পদ্ধতি কল করতে সক্ষম হওয়া উচিত

 ilist.Add(1); //exception here

আমার প্রশ্নটি কেন আমি ব্যতিক্রম পাই না, বরং অ্যারে কেন IList প্রয়োগ করে ?


22
ভাল প্রশ্ন। আমি ফ্যাট ইন্টারফেসের ধারণাটি পছন্দ করি না (এটি এই ধরণের ডিজাইনের প্রযুক্তিগত শব্দ)।
কনরাড রুডলফ


2
আসলেই কি কেউ এলএসপিকে যত্ন করে? এটি আমার কাছে বেশ একাডেমিক বলে মনে হচ্ছে।
গ্যাবে

13
@ গ্যাবে, তারপরে আপনার আরও বৃহত্তর কোডবেস নিয়ে কাজ করা দরকার। একটি আচরণ বাস্তবায়ন (একটি ইন্টারফেস থেকে উত্তরাধিকার সূত্রে) এবং তারপরে আপনি যে জিনিসগুলি পছন্দ করেন না / সমর্থন করতে পারবেন না সেগুলি কেবল উপেক্ষা করার ফলে দুর্গন্ধযুক্ত, অবহেলা, ingালাই এবং শেষ পর্যন্ত: বগি কোড।
মারিউস

3
@ এটির সংগ্রহটি গ্যাবে যা পরিবর্তিত ইঙ্গিত দেয় যা এতে অন্তর্ভুক্ত সত্তা নয়। আপনি আপনার শ্রেণীর সদস্যকে এমন ধরণের সদস্য করতে পারেন যা IRWList <> এবং IReadList <> উভয়ই প্রয়োগ করে, আপনার শ্রেণিতে অভ্যন্তরীণভাবে IRWList <> হিসাবে ব্যবহার করুন এবং এটি IReadList হিসাবে প্রকাশ করুন। হ্যাঁ, আপনি কোথাও জটিলতা ফেলতে হবে, তবে আমি কেবল দেখতে পাচ্ছি না যে এটি কীভাবে খুব ভাল ডিজাইনের নীতি হিসাবে এলএসপিকে উপেক্ষা করার ক্ষেত্রে প্রযোজ্য (আইআরলিস্টকে গ্রাহক দৃষ্টিকোণ থেকে আরও জটিল করে তোলে যদিও আইসরিডঅনলি সম্পত্তি সম্পর্কে জানে না)
মারিয়াস

উত্তর:


94

কারণ একটি অ্যারে সূচক দ্বারা দ্রুত অ্যাক্সেসের অনুমতি দেয় এবং IList/ IList<T>এটি হ'ল একমাত্র সংগ্রহ ইন্টারফেস যা এটি সমর্থন করে। সুতরাং সম্ভবত আপনার আসল প্রশ্নটি "ইনডেক্সারদের সাথে ধ্রুবক সংগ্রহের কোনও ইন্টারফেস নেই কেন?" এবং তার কাছে আমার কোনও উত্তর নেই।

সংগ্রহের জন্য কোনও পঠনযোগ্য ইন্টারফেস নেই। এবং আমি এগুলি আরও বেশি মিস করছি ইনডেক্সার ইন্টারফেসের সাথে ধ্রুব আকারের।

আইএমওতে সংগ্রহের বৈশিষ্ট্যগুলির উপর নির্ভর করে আরও কয়েকটি (জেনেরিক) সংগ্রহ ইন্টারফেস থাকতে হবে। নামগুলিও আলাদা হওয়া উচিত ছিল কারণ Listসূচকের সাথে থাকা কোনও কিছুর জন্য সত্যই বোকা আইএমও।

  • শুধু গণনা IEnumerable<T>
  • কেবলমাত্র পঠনযোগ্য তবে কোনও সূচক নেই (.মাউন্ট, .আপনি ...)
  • আকার পরিবর্তনযোগ্য তবে কোনও সূচক নয়, যেমন (যুক্ত, সরান, ...) বর্তমান হিসাবে সেট করুন ICollection<T>
  • সূচক সহ কেবল পঠনযোগ্য (সূচক, সূচক, ...)
  • সূচক সহ ধ্রুব আকার (সেটারের সাথে সূচক)
  • সূচকের সাথে পরিবর্তনশীল আকার (সন্নিবেশ, ...) বর্তমান IList<T>

আমি মনে করি বর্তমান সংগ্রহের ইন্টারফেসগুলি খারাপ ডিজাইন। তবে যেহেতু তাদের কাছে সম্পত্তি রয়েছে যা বলছে কোন পদ্ধতিগুলি বৈধ (এবং এটি এই পদ্ধতির চুক্তির অংশ) এটি প্রতিস্থাপনের নীতিটি ভঙ্গ করে না।


14
উত্তর করার জন্য ধন্যবাদ. তবে আমি বরং প্রশ্নটি ছেড়ে দিই। কারণটি সহজ। ইন্টারফেস একটি পাবলিক চুক্তি। যদি কেউ এটি প্রয়োগ করে তবে একজনকে অবশ্যই সমস্ত সদস্যকে পুরোপুরি বাস্তবায়ন করতে হবে, অন্যথায় এটি এলএসপি ভেঙে দেয় এবং সাধারণত দুর্গন্ধযুক্ত হয়, তাই না?
ওলেকসেই

16
এটি এলএসপি ভেঙে দেয়। যদি এটি তালিকাভুক্ত না করে A তবে (আইটেম) কংক্রিটের ধরণ নির্বিশেষে তালিকায় আইটেম যুক্ত করা উচিত। ব্যতিক্রম মামলা বাদে। অ্যারে প্রয়োগে অ-ব্যতিক্রমী ক্ষেত্রে একটি ব্যতিক্রম ছুঁড়ে, যা এটির পক্ষে খারাপ অভ্যাস
রুন এফএস

2
@ স্যামলেচ আমি দুঃখিত তবে আপনি তখন এলএসপিতে ভুল পেয়েছিলেন। একটি অ্যারে বাস্তবায়িত হয় না addএবং সুতরাং যখন সেই ক্ষমতা প্রয়োজন হয় তখন এমন কিছুর জন্য প্রতিস্থাপন করা যায় না।
রুন এফএস

7
আমি স্বীকার করি যে এটি প্রযুক্তিগতভাবে কেবল এলএসপি লঙ্ঘন করে না কারণ ডকুমেন্টেশনে বলা হয়েছে যে আপনার সম্পত্তি IsFixedSizeএবং IsReadOnlyবৈশিষ্ট্যগুলি পরীক্ষা করা উচিত , এটি অবশ্যই বলুন, জিজ্ঞাসা করুন নীতি এবং নূন্যতম বিস্ময়ের নীতি লঙ্ঘন করে । আপনি যখন 9 টি পদ্ধতির মধ্যে 4 টির জন্য কেবল ব্যতিক্রম ছুঁড়ে ফেলছেন তখন কেন একটি ইন্টারফেস কার্যকর করবেন?
ম্যাথু

11
আসল প্রশ্নের পরে কিছুটা সময় কেটে গেছে। তবে এখন নেট নেট ৪.৫ এর সাথে রয়েছে অতিরিক্ত ইন্টারফেস IReadOnlyList এবং IReadOnly Col લેક્શન
টোবিয়াস

43

বিভাগে মন্তব্য ডকুমেন্টেশন জন্য IListবলেছেন

আইলিস্ট আইকোলিকেশন ইন্টারফেসের বংশধর এবং সমস্ত অ-জেনেরিক তালিকার বেস ইন্টারফেস। IList বাস্তবায়নগুলি তিনটি বিভাগে পড়ে: কেবলমাত্র পঠনযোগ্য, স্থির-আকার এবং ভেরিয়েবল-আকার । কেবল পঠনযোগ্য IList সংশোধন করা যায় না। একটি স্থির আকারের আইলিস্ট উপাদানগুলির যোগ বা অপসারণের অনুমতি দেয় না তবে এটি বিদ্যমান উপাদানগুলির পরিবর্তনের অনুমতি দেয়। একটি পরিবর্তনশীল-আকারের আইলিস্ট উপাদানগুলির সংযোজন, অপসারণ এবং পরিবর্তনের অনুমতি দেয়।

স্পষ্টতই অ্যারেগুলি স্থির-আকারের শ্রেণিতে পড়ে, সুতরাং ইন্টারফেসের ত্রুটিযুক্ত হয়ে এটি বোঝা যায়।


4
আমার ধারণা তারা অনেক ইন্টারফেসের সাথে শেষ হয়ে যেত। IListFixedSize, IListReadOnly ...
ম্যাগনাস

9
ডকুমেন্টেশনের দৃষ্টিকোণ থেকে এটি আসলে একটি ভাল উত্তর। তবে আমার কাছে এটি হ্যাকের মতো দেখাচ্ছে। কোনও শ্রেণীর সমস্ত সদস্যকে বাস্তবায়নের জন্য ইন্টারফেসগুলি অবশ্যই পাতলা এবং সহজ হতে হবে।
ওলেকসেই

1
@ ইলেক্সেই: আমি সম্মত ইন্টারফেস এবং রানটাইম ব্যতিক্রম সর্বাধিক মার্জিত সমন্বয় নয়। এর প্রতিরক্ষায় পদ্ধতিটি স্পষ্টভাবে Arrayবাস্তবায়ন করে Add, যা দুর্ঘটনাক্রমে এটিকে ডাকার ঝুঁকি হ্রাস করে।
ব্রায়ান রাসমুসেন

যতক্ষণ না আমরা এর বাস্তবায়ন তৈরি করি ততক্ষণ IListপরিবর্তন এবং সংযোজন / অপসারণ উভয়ই অস্বীকার করে । তারপরে ডকুমেন্টেশনগুলি আর সঠিক নয়। : পি
টিমো

1
@ ম্যাগনাস -। নেট 4.5 এ, আইআরইডঅনলিলিস্ট এবং আইআরইডঅনলি কলেকশন অতিরিক্ত ইন্টারফেস রয়েছে
আরবিটি

17

কারণ সমস্ত IListগুলি পরিবর্তনীয় নয় (দেখুন IList.IsFixedSizeএবং IList.IsReadOnly), এবং অ্যারে অবশ্যই স্থির আকারের তালিকার মতো আচরণ করে।

যদি আপনার প্রশ্নটি সত্যিই "কেন এটি একটি জেনেরিক ইন্টারফেস প্রয়োগ করে ", তবে উত্তরটি হ'ল জেনেরিকগুলি বরাবর আসার আগে এগুলি প্রায় ছিল।


10
@ অ্যালেক্সি: না, এটি এলএসপি ভাঙবে না, কারণ ইন্টারফেস IList নিজেই আপনাকে বলে যে এটি পরিবর্তনীয় হতে পারে না। যদি এটি প্রকৃতপক্ষে পরিবর্তনযোগ্য হওয়ার গ্যারান্টিযুক্ত ছিল এবং অ্যারে আপনাকে অন্যথায় বলেছিল, তবে এটি নিয়ম ভঙ্গ করবে।
ব্যবহারকারী541686

আসলে, অ্যারে জেনেরিকের ক্ষেত্রে এলএসপি IList<T>ভেঙে দেয় এবং নন-জেনেরিকের ক্ষেত্রে এটি ভাঙে না IList: enterprisecraftsmanship.com/2014/11/22/…
ভ্লাদিমির

5

এটি এমন একটি উত্তরাধিকার যা আমাদের সময় থেকে এটি যখন কেবলমাত্র পঠন সংগ্রহগুলি কীভাবে মোকাবেলা করা যায় এবং অ্যারে কেবল পঠিত হয় কি না তা স্পষ্ট ছিল না। আইলিস্ট ইন্টারফেসে রয়েছে ইসফিক্সড সাইজ এবং ইসআরডিআনলি ফ্ল্যাগ। ইসআরেডঅনলি ফ্ল্যাগের অর্থ হ'ল সংগ্রহটি কোনওভাবেই পরিবর্তন করা যায় না এবং ইসফিক্সডসাইজ মানে যে সংগ্রহটি সংশোধন করার অনুমতি দেয় তবে আইটেমগুলি যুক্ত বা সরিয়ে না দেয়।

নেট 4.5 সময়ে এটা স্পষ্ট ছিল যে কিছু "অন্তর্বর্তী" ইন্টারফেসগুলি কেবল পঠন সংগ্রহের সঙ্গে কাজ করার প্রয়োজন হয়, তাই IReadOnlyCollection<T>এবং IReadOnlyList<T>প্রবর্তন করা হয়।

বিশদটি বর্ণনা করে এখানে একটি দুর্দান্ত ব্লগ পোস্ট রয়েছে:। নেট এ কেবলমাত্র সংকলনগুলি পড়ুন


0

আইএলিস্ট ইন্টারফেসের সংজ্ঞাটি হল "অবজেক্টের একটি অ-জেনেরিক সংগ্রহের প্রতিনিধিত্ব করে যা স্বতন্ত্রভাবে সূচক দ্বারা অ্যাক্সেস করা যায়"। অ্যারে এই সংজ্ঞাটি সম্পূর্ণরূপে সন্তুষ্ট করে, তাই ইন্টারফেসটি প্রয়োগ করতে হবে। অ্যাড () পদ্ধতিতে কল করার সময় ব্যতিক্রমটি "সিস্টেম। নটসপোর্টড এক্সেক্সশন: সংগ্রহটি একটি নির্দিষ্ট আকারের ছিল" এবং ঘটেছিল কারণ অ্যারে তার ক্ষমতাটি গতিশীলভাবে বৃদ্ধি করতে পারে না। অ্যারে অবজেক্ট তৈরির সময় এর ক্ষমতা সংজ্ঞায়িত করা হয়।


0

আইলিস্ট প্রয়োগ করে (এবং ট্রানজিটিভলি, আইকোলিকেশন) লিনাক 2 ওবজেক্টস ইঞ্জিনকে সহজতর করা হয়েছে, যেহেতু আইএনলিস্টারে আইলিস্ট / আইকোলিকেশনটি আইএনলিস্টারে কাস্ট করাও অ্যারেগুলির জন্য কাজ করবে।

উদাহরণস্বরূপ, একটি গণনা () শেষ করে অ্যারে কল করে। দৈর্ঘ্যের নীচে হুড, যেহেতু এটি আইকোলিকেশনটিতে জড়িত এবং অ্যারের প্রয়োগটি দৈর্ঘ্য দেয় returns

এটি ছাড়াই, লিনক টু ওবজেক্ট ইঞ্জিনের অ্যারেগুলির জন্য বিশেষ চিকিত্সা এবং ভয়াবহভাবে সঞ্চালন করতে হবে না, বা তাদের অ্যারেগুলির জন্য বিশেষ-ক্ষেত্রে চিকিত্সা যুক্ত কোড দ্বিগুণ করতে হবে (যেমন তারা আইলিস্টের জন্য করেন)। তারা অবশ্যই পরিবর্তে অ্যারে IList প্রয়োগ করতে পছন্দ করেছেন।

এটা আমার "কেন" গ্রহণ।


0

আইলিস্টের জন্য লিনক্যু শেষ চেকগুলি বাস্তবায়নের বিবরণ, যদি এটি তালিকাটি কার্যকর না করে তবে তাদের দুটি শেষ চেক কমিয়ে আনা হবে বা একটি অ্যারে নেওয়ার পরে ও (এন) এ শেষ হবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.