আমার প্রোগ্রামগুলি পরিকল্পনা করার সময়, আমি প্রায়শই এই জাতীয় চিন্তার সাথে শুরু করি:
একটি ফুটবল দল ফুটবল খেলোয়াড়দের কেবল একটি তালিকা। সুতরাং, আমার সাথে এটি উপস্থাপন করা উচিত:
var football_team = new List<FootballPlayer>();এই তালিকার ক্রমটি ক্রমকে প্রতিনিধিত্ব করে যাতে খেলোয়াড়দের রোস্টারে তালিকাভুক্ত করা হয়।
তবে আমি পরে বুঝতে পেরেছি যে খেলোয়াড়দের নিছক তালিকা ছাড়াও দলগুলিরও অন্যান্য সম্পত্তি রয়েছে that উদাহরণস্বরূপ, এই মরসুমে চলমান মোট স্কোর, বর্তমান বাজেট, ইউনিফর্ম রঙ, stringদলের নাম উপস্থাপনা ইত্যাদি etc
তাহলে আমার মনে হয়:
ঠিক আছে, একটি ফুটবল দল খেলোয়াড়ের তালিকার মতো, তবে অতিরিক্ত, এর একটি নাম (ক
string) এবং চলমান মোট স্কোর (একটিint) রয়েছে। .NET ফুটবল দলগুলি সঞ্চয় করার জন্য কোনও শ্রেণি সরবরাহ করে না, তাই আমি নিজের ক্লাস তৈরি করব। সর্বাধিক অনুরূপ এবং প্রাসঙ্গিক বিদ্যমান কাঠামো হ'লList<FootballPlayer>, সুতরাং আমি এটি থেকে উত্তরাধিকারী হব:class FootballTeam : List<FootballPlayer> { public string TeamName; public int RunningTotal }
তবে দেখা যাচ্ছে যে কোনও গাইডলাইন আপনাকে উত্তরাধিকার সূত্রে উত্তম হওয়া উচিত নয়List<T> । আমি দুটি দিক থেকে এই নির্দেশিকাটি থেকে পুরোপুরি বিভ্রান্ত।
কেন না?
দৃশ্যত Listকোনওভাবে পারফরম্যান্সের জন্য অনুকূলিত । তা কিভাবে? যদি আমি প্রসারিত করি তবে কোন পারফরম্যান্স সমস্যা হতে পারে List? ঠিক কী ভাঙবে?
আমি দেখেছি এমন আরও একটি কারণ Listহ'ল মাইক্রোসফ্ট সরবরাহ করেছে এবং এর উপর আমার কোনও নিয়ন্ত্রণ নেই, সুতরাং "পাবলিক এপিআই" প্রকাশের পরে আমি এটিকে পরিবর্তন করতে পারি না । তবে আমি এটি বুঝতে লড়াই করি। সার্বজনীন এপিআই কী এবং আমার কেন যত্ন নেওয়া উচিত? যদি আমার বর্তমান প্রকল্পটি এই সর্বজনীন এপিআই না করে এবং সম্ভবত না থাকে, তবে আমি কী নিরাপদে এই নির্দেশিকাটি উপেক্ষা করতে পারি? যদি আমি উত্তরাধিকার সূত্রে পাই List এবং এটি প্রমাণিত হয় যে আমার একটি পাবলিক এপিআই দরকার, আমার কী অসুবিধা হবে?
কেন এটা এমনকি কোন ব্যাপার? একটি তালিকা একটি তালিকা। কী সম্ভবত পরিবর্তন হতে পারে? আমি সম্ভবত কি পরিবর্তন করতে চাই?
এবং সবশেষে, যদি মাইক্রোসফ্ট আমাকে উত্তরাধিকার সূত্রে Listনা চায় তবে তারা ক্লাসটি কেন করেনি sealed?
আমার আর কী ব্যবহার করার কথা?
স্পষ্টতই, কাস্টম সংগ্রহের জন্য, মাইক্রোসফ্ট একটি Collectionক্লাস সরবরাহ করেছে যা এর পরিবর্তে প্রসারিত করা উচিত List। কিন্তু এই শ্রেণীর খুব বেয়ার, এবং অনেক দরকারী জিনিস, নেই যেমনAddRange উদাহরণস্বরূপ,। jvitor83 এর উত্তরটি সেই নির্দিষ্ট পদ্ধতির জন্য পারফরম্যান্সের যুক্তি সরবরাহ করে, তবে ধীর গতির AddRangeচেয়ে কীভাবে ভাল হয় না AddRange?
উত্তরাধিকার Collectionসূত্রে প্রাপ্তির চেয়ে উত্তমরূপে কাজ হ'ল Listএবং আমি কোনও লাভ দেখছি না। নিশ্চয়ই মাইক্রোসফ্ট আমাকে অকারণে অতিরিক্ত কাজ করতে বলবে না, তাই আমি অনুভব করতে সাহায্য করতে পারি না যে আমি কোনওভাবে ভুল বোঝাবুঝি করছি, এবং উত্তরাধিকার সূত্রে প্রাপ্ত Collectionহওয়া আমার সমস্যার সঠিক সমাধান নয়।
আমি বাস্তবায়ন হিসাবে পরামর্শ দেখেছি IList। শুধুই না. এটি কয়েক মিলিয়ন লাইনের বয়লারপ্লেট কোড যা আমার কিছুই লাভ করে না।
সবশেষে, কেউ কেউ Listকিছুতে মোড়ানো পরামর্শ দেয় :
class FootballTeam
{
public List<FootballPlayer> Players;
}
এটির সাথে দুটি সমস্যা রয়েছে:
এটি আমার কোডটিকে অকারণে ভার্বোস করে। আমার এখন অবশ্যই ন্যায়বিচারের
my_team.Players.Countপরিবর্তে কল করা উচিতmy_team.Count। ধন্যবাদ, সি # দিয়ে আমি সূচকে স্বচ্ছ করতে সূচকগুলি সংজ্ঞায়িত করতে পারি, এবং অভ্যন্তরের সমস্ত পদ্ধতি ফরোয়ার্ড করতে পারিList... তবে এটি প্রচুর কোড! এই সমস্ত কাজের জন্য আমি কী পেতে পারি?এটা ঠিক প্লেইন কোন মানে করে না। একটি ফুটবল দলে খেলোয়াড়ের একটি তালিকা "থাকে না"। এটা তোলে হয় খেলোয়াড়দের তালিকা। আপনি বলবেন না "জন ম্যাকফুটবলার সামটিমের খেলোয়াড়দের সাথে যোগ দিয়েছেন"। আপনি বলছেন "জন সোমারটিয়ামে যোগ দিয়েছেন"। আপনি "স্ট্রিংয়ের অক্ষরগুলিতে" একটি চিঠি যোগ করবেন না, আপনি একটি স্ট্রিংয়ে একটি চিঠি যুক্ত করবেন। আপনি একটি লাইব্রেরির বইগুলিতে কোনও বই যুক্ত করবেন না, আপনি একটি লাইব্রেরিতে একটি বই যুক্ত করুন।
আমি বুঝতে পারি যে "হুডের নীচে" যা ঘটেছিল তা "ওয়াইয়ের অভ্যন্তরীণ তালিকায় এক্স যোগ করা" বলা যেতে পারে, তবে এটি বিশ্ব সম্পর্কে চিন্তাভাবনার একটি খুব পাল্টা-স্বজ্ঞাত পদ্ধতি বলে মনে হচ্ছে।
আমার প্রশ্ন (সংক্ষিপ্ত)
একটি ডাটা স্ট্রাকচার, যা, "কথাটি" ( "মানুষের মনের থেকে" বলতে হয় যে,) শুধু একটি হল প্রতিনিধিত্বমূলক সঠিক C # এর উপায় কি listএর thingsকয়েক ঘন্টাধ্বনি এবং whistles সঙ্গে?
থেকে উত্তরাধিকারসূত্রে প্রাপ্ত List<T>সর্বদা গ্রহণযোগ্যতা না? কখন তা গ্রহণযোগ্য? কেন কেন না? একজন প্রোগ্রামারকে অবশ্যই কোন বিষয় বিবেচনা করতে হবে, যখন উত্তরাধিকারী হতে হবে কিনা তা সিদ্ধান্ত নেওয়ার সময় List<T>?
stringসবকিছু একটি করার প্রয়োজন হয় objectকি করতে পারেন এবং আরো ।

