আমার প্রোগ্রামগুলি পরিকল্পনা করার সময়, আমি প্রায়শই এই জাতীয় চিন্তার সাথে শুরু করি:
একটি ফুটবল দল ফুটবল খেলোয়াড়দের কেবল একটি তালিকা। সুতরাং, আমার সাথে এটি উপস্থাপন করা উচিত:
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
কি করতে পারেন এবং আরো ।