জেনেরিক ধরণের থেকে উত্তরাধিকারী হওয়া কি ভাল অনুশীলন?


35

List<string>টাইপ টীকাগুলিতে বা StringListকোথায় ব্যবহার করা ভালStringList

class StringList : List<String> { /* no further code!*/ }

আমি গাড়ীতে আঘাত বিভিন্ন এর এই মধ্যে বিদ্রূপ


আপনি যদি জেনেরিক ধরণের থেকে উত্তরাধিকারী না হন তবে তারা কেন সেখানে আছেন?
মওগ

7
@ মাওগ এগুলি কেবল ইনস্ট্যান্টেশনের জন্য উপলব্ধ।
থিওডোরোস চ্যাটজিগিয়ানানাকিস

3
কোডে দেখার জন্য এটি আমার প্রিয়তম জিনিসগুলির মধ্যে একটি
কিক

4
ইশ। গুরুতরভাবে না. মধ্যে শব্দার্থিক পার্থক্য কি StringListএবং List<string>? কোনওটি নেই, তবুও আপনি (জেনেরিক "আপনি") কোড বেসটিতে আরও একটি বিশদ যুক্ত করতে সক্ষম হয়েছেন যা কেবলমাত্র আপনার প্রকল্পের জন্য অনন্য এবং কোডটি অধ্যয়ন করার পরে অন্য কারও কাছে কিছুই বোঝায় না। স্ট্রিংগুলির তালিকার নামটি কেন কেবল স্ট্রিংয়ের তালিকাকে বলা চলে? অন্যদিকে, আপনি যদি করতে চান তবে BagOBagels : List<string>আমি এটি আরও বোধ করি বলে মনে করি। আপনি এটিকে অগণিত হিসাবে পুনরাবৃত্তি করতে পারেন, বহিরাগত গ্রাহকরা বাস্তবায়নের - ধার্মিকতা 'সম্পর্কে মোটেই চিন্তা করেন না।
ক্রেগ

1
এক্সএএমএল-এর একটি সমস্যা রয়েছে যেখানে আপনি জেনেরিকগুলি ব্যবহার করতে পারবেন না এবং আপনাকে তালিকা তৈরি করতে এই জাতীয় টাইপ তৈরি করতে হবে
ড্যানিয়েল লিটল

উত্তর:


27

জেনেরিক ধরণের থেকে আপনি উত্তরাধিকারী হওয়ার জন্য আরও একটি কারণ থাকতে পারে।

মাইক্রোসফ্ট পদ্ধতি স্বাক্ষরগুলিতে জেনেরিক ধরণের নেস্টিং এড়ানো পরামর্শ দেয় ।

আপনার কিছু জেনেরিকের জন্য ব্যবসায়ের-ডোমেন নামের প্রকার তৈরি করা এখন ভাল ধারণা। একটি থাকার পরিবর্তে, IEnumerable<IDictionary<string, MyClass>>একটি প্রকার তৈরি করুন MyDictionary : IDictionary<string, MyClass>এবং তারপরে আপনার সদস্য একটি হয়ে যান IEnumerable<MyDictionary>, যা অনেক বেশি পাঠযোগ্য। এটি আপনাকে আপনার কোডের ব্যাখ্যাটি বাড়িয়ে বিভিন্ন স্থানে মাই ডিকোরিয়াস ব্যবহার করতে দেয়।

এটি বিশাল সুবিধার মতো নাও লাগতে পারে তবে বাস্তব-বিশ্বের ব্যবসায়ের কোডে আমি এমন জেনেরিক দেখেছি যা আপনার চুলগুলি শেষের দিকে দাঁড়াবে। মত জিনিস List<Tuple<string, Dictionary<int, List<Dictionary<string, List<double>>>>>। এই জেনেরিকটির অর্থ কোনওভাবেই স্পষ্ট নয়। তবুও, যদি এটি স্পষ্টতভাবে তৈরি বিভিন্ন ধরণের সিরিজ দিয়ে নির্মিত হয় তবে মূল বিকাশকারী এর উদ্দেশ্যটি আরও পরিষ্কার হতে পারে। তবুও যদি সেই জেনেরিক প্রকারটি কোনও কারণে পরিবর্তিত হওয়ার প্রয়োজন হয়, তবে জেনেরিক ধরণের সমস্ত উদাহরণ সন্ধান এবং প্রতিস্থাপন ব্যতীত শ্রেণীর পরিবর্তনের তুলনায় সত্যিকারের ব্যথা হতে পারে।

অবশেষে, অন্যরকম কারণ রয়েছে যে কেউ জেনেরিক থেকে উদ্ভূত তাদের নিজস্ব ধরণের তৈরি করতে ইচ্ছুক। নিম্নলিখিত ক্লাস বিবেচনা করুন:

public class MyClass
{
    public ICollection<MyItems> MyItems { get; private set; }
    // plumbing code here
}

public class MyOtherClass
{
    public ICollection<MyItems> MyItemCache { get; private set; }
    // plumbing code here
}

public class MyConsumerClass
{
    public MyConsumerClass(ICollection<MyItems> myItems)
    {
        // use the collection
    }
}

এখন আমরা কীভাবে ICollection<MyItems>মাইকনসমারক্লাসের কনস্ট্রাক্টরে পাস করব? যদি আমরা উদ্ভূত ক্লাসগুলি তৈরি করি class MyItems : ICollection<MyItems>এবং class MyItemCache : ICollection<MyItems>, মাইকনসুমারক্লাস তখন দুটি সংগ্রহের মধ্যে আসলে এটি কী চায় তা সম্পর্কে অত্যন্ত সুনির্দিষ্ট হতে পারে। এটি তখন আইওসি পাত্রে খুব সুন্দরভাবে কাজ করে, যা দুটি সংগ্রহ খুব সহজেই সমাধান করতে পারে। এটি প্রোগ্রামারটিকে আরও নির্ভুল MyConsumerClassহতেও দেয় - যদি কোনও আইকোলিকেশন নিয়ে কাজ করার জন্য এটি যদি বোধগম্য হয় তবে তারা জেনেরিক নির্মাণকারী নিতে পারে। তবে যাইহোক, এটি কখনই ব্যবসায়িকভাবে দুটি উদ্ভূত প্রকারের মধ্যে একটির ব্যবহার করতে বোঝায় না, বিকাশকারী নির্ধারক প্যারামিটারকে নির্দিষ্ট ধরণের মধ্যে সীমাবদ্ধ করতে পারেন।

সংক্ষেপে, প্রায়শই জেনেরিক প্রকার থেকে প্রকারভেদ করা সার্থক - এটি আরও স্পষ্ট কোডের জন্য উপযুক্ত যেখানে উপযুক্ত এবং পাঠযোগ্যতা এবং রক্ষণাবেক্ষণে সহায়তা করে।


12
এটি একেবারে হাস্যকর মাইক্রোসফ্টের প্রস্তাবনা।
টমাস এডিং

7
আমি মনে করি না যে এটি সর্বজনীন এপিআইয়ের জন্য হাস্যকর। নেস্টেড জেনেরিকগুলি এক নজরে বোঝা মুশকিল এবং আরও অর্থবহ ধরণের নাম প্রায়শই পঠনযোগ্যতায় সহায়তা করতে পারে।
স্টিফেন

4
আমি মনে করি এটি হাস্যকর নয় এবং প্রাইভেট এপিআইগুলির জন্য এটি অবশ্যই ঠিক আছে ... তবে সর্বজনীন এপিআইয়ের জন্য আমি এটি একটি ভাল ধারণা বলে মনে করি না। এমনকি মাইক্রোসফ্ট যখন আপনি জনসাধারণের ব্যবহারের জন্য বোঝানো এপিআই লিখছেন তখন ধরণের বেস বেস গ্রহণ এবং ফিরিয়ে দেওয়ার পরামর্শ দেয়।
পল 20'15

35

নীতিগতভাবে জেনেরিক ধরণের থেকে উত্তরাধিকারী হওয়া এবং অন্য কোনও কিছু থেকে উত্তরাধিকারের মধ্যে কোনও পার্থক্য নেই।

তবে, কেন পৃথিবীতে আপনি কোনও শ্রেণি থেকে প্রাপ্ত এবং আরও কিছু যোগ করবেন না?


17
আমি রাজী. কোনও অবদান না রেখে আমি "স্ট্রিংলিস্ট" পড়ে মনে মনে ভাবতাম, "এটি আসলে কী করে ?"
নীল

1
আমিও সম্মতি জানাই, উত্তরাধিকারসূত্রে ভাষাতে আপনি "প্রসারিত" কী শব্দটি ব্যবহার করেন, এটি একটি ভাল অনুস্মারক যে আপনি যদি কোনও শ্রেণীর উত্তরাধিকারী হয়ে চলেছেন তবে আপনার আরও কার্যকারিতা সহ এটি প্রসারিত করা উচিত।
ইলিয়ট ব্ল্যাকবার্ন

14
-1, এটি বুঝতে না পেরে যে এটি আলাদা নাম চয়ন করে বিমূর্তি তৈরির একমাত্র উপায় - একটি বিমূর্ততা তৈরি করা এই শ্রেণীর কোনও কিছু না যুক্ত করার জন্য খুব ভাল কারণ হতে পারে।
ডক ব্রাউন 21

1
আমার উত্তরটি বিবেচনা করুন, কেউ কেউ এটি করার সিদ্ধান্ত নিতে পারে এমন কয়েকটি কারণগুলিতে আমি চলে যাই go
এনপিএসএফ 3000

1
"কেন পৃথিবীতে আপনি কোনও শ্রেণি থেকে প্রাপ্ত এবং আরও কিছু যুক্ত করবেন না?" আমি এটি ব্যবহারকারী নিয়ন্ত্রণের জন্য করেছি। আপনি একটি জেনেরিক ব্যবহারকারী নিয়ন্ত্রণ তৈরি করতে পারেন তবে আপনি এটি উইন্ডো ফর্ম ডিজাইনারে ব্যবহার করতে পারবেন না, সুতরাং আপনাকে এর থেকে উত্তরাধিকারী হতে হবে, প্রকারটি উল্লেখ করে এবং এটি ব্যবহার করতে হবে।
জর্জ টি

13

আমি সি # খুব ভাল জানি না, তবে আমি বিশ্বাস করি এটি বাস্তবায়নের একমাত্র উপায় typedef, যা সি ++ প্রোগ্রামার সাধারণত কয়েকটি কারণে ব্যবহার করে:

  • এটি আপনার কোডগুলি কোণ বন্ধনীগুলির সমুদ্রের মতো দেখতে এড়াতে সহায়তা করে।
  • এটি যদি আপনার প্রয়োজনীয়তাগুলি পরে পরিবর্তন হয় তবে আপনাকে বিভিন্ন অন্তর্নিহিত পাত্রে পরিবর্তন করতে দেয় এবং এটি পরিষ্কার করার মাধ্যমে আপনি এটি করার অধিকার সংরক্ষণ করেছেন।
  • এটি আপনাকে এমন একটি নাম দেয় যা প্রসঙ্গে প্রাসঙ্গিক।

তারা মূলত বোরিং, জেনেরিক নামগুলি বেছে নিয়ে শেষ সুবিধাটি ছুঁড়ে ফেলেছিল, তবে অন্য দুটি কারণ এখনও রয়েছে।


7
এহ ... এরা এক রকম নয়। সি ++ এ আপনার একটি আক্ষরিক নাম আছে। StringList এটি একটি List<string>- তারা পরস্পরের পরিবর্তে ব্যবহার করতে পারে। অন্যান্য API গুলি (বা আপনার এপিআই প্রকাশের সময়) এর সাথে কাজ করার সময় এটি গুরুত্বপূর্ণ, যেহেতু বিশ্বের প্রত্যেকেই ব্যবহার করে List<string>
টেলাস্টিন

2
আমি বুঝতে পারি যে তারা ঠিক একই জিনিস নয়। যেমন পাওয়া যায় তত কাছাকাছি। দুর্বল সংস্করণে অবশ্যই ত্রুটি রয়েছে।
কার্ল বিলেফেল্ড

24
না, using StringList = List<string>;এটি টাইপয়েফের নিকটতম সি # সমতুল্য। এই জাতীয় সাবক্লাসিং যুক্তিযুক্ত কোনও নির্মাণকারীর ব্যবহারকে আটকাবে।
পিট কিরখাম

4
@ পেটকিরখাম: একটি স্ট্রিংলিস্ট সংজ্ঞায়িত usingকরে সোর্স কোড ফাইলটিতে সীমাবদ্ধ করে যেখানে usingস্থাপন করা হয়েছে। এই দৃষ্টিকোণ থেকে, উত্তরাধিকার কাছাকাছি typedef। এবং একটি সাবক্লাস তৈরি করা একজনকে প্রয়োজনীয় সমস্ত কন্সট্রাক্টর যুক্ত করা থেকে বিরত রাখে না (যদিও এটি ক্লান্তিকর হতে পারে)।
ডক ব্রাউন 21

2
@ Random832: আমাকে এই ভিন্নভাবে প্রকাশ করার: সি ++ একটি typedef নাম নির্ধারণ করতে ব্যবহার করা যাবে এক জায়গায় , তবে তা "সত্যের একক উৎস" করা। সি # তে, usingএই উদ্দেশ্যে ব্যবহার করা যাবে না, তবে উত্তরাধিকার হতে পারে। এটি দেখায় যে আমি পিট কিরখমের উর্ধ্বমুখী মন্তব্যের সাথে কেন একমত নই - আমি usingসি ++ এর আসল বিকল্প হিসাবে বিবেচনা করি না typedef
ডক ব্রাউন

9

আমি কমপক্ষে একটি ব্যবহারিক কারণ সম্পর্কে ভাবতে পারি।

জেনেরিক ধরণের (এমনকি কিছু না বাড়িয়েও) উত্তরাধিকার সূত্রে প্রাপ্ত অ জেনেরিক প্রকারের ঘোষণা দিয়ে, সেই ধরণের স্থানগুলি যেখানে তারা অন্যথায় অনুপলব্ধ হতে পারে বা যেখানে সেগুলি হওয়া উচিত তার চেয়ে আরও বেশি সংশ্লেষিত উপায়ে পাওয়া যায় allows

ভিজ্যুয়াল স্টুডিওতে সেটিংস সম্পাদকের মাধ্যমে সেটিংস যুক্ত করার সময় এরকম একটি ঘটনা হ'ল, যেখানে কেবল অ-জেনেরিক প্রকার উপলব্ধ। আপনি যদি সেখানে যান, আপনি লক্ষ্য করবেন যে সমস্ত System.Collectionsক্লাস উপলব্ধ, তবে কোনও সংগ্রহ System.Collections.Genericপ্রযোজ্য হিসাবে উপস্থিত হবে না ।

আরেকটি ক্ষেত্রে হ'ল ডাব্লুপিএফ-এ এক্সএএমএল-এর মাধ্যমে প্রকারের ইনস্ট্যান্ট করা। ২০০৯-এর পূর্বের স্কিমা ব্যবহার করার সময় এক্সএমএল সিনট্যাক্সে টাইপ আর্গুমেন্টগুলি পাস করার জন্য কোনও সমর্থন নেই। 2006 এর স্কিমাটি নতুন ডাব্লুপিএফ প্রকল্পগুলির জন্য ডিফল্ট বলে মনে হচ্ছে এটিকে আরও খারাপ করা হয়েছে।


1
ডাব্লুসিএফ ওয়েব সার্ভিস ইন্টারফেসে আপনি ভাল কৌশল সংগ্রহের ধরণের নাম প্রদানের জন্য এই কৌশলটি ব্যবহার করতে পারেন (উদাঃ অ্যারেঅফপার্সনের পরিবর্তে ব্যক্তি সংগ্রহ বা যে কোনও কিছু)
রিকো

7

আমার মনে হয় আপনার কিছু ইতিহাস সন্ধান করা উচিত ।

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

অন্যথায় থিওডোরোস চ্যাটজিগিয়ানানাকিসের সর্বোত্তম উত্তর ছিল, উদাহরণস্বরূপ এখনও প্রচুর সরঞ্জাম রয়েছে যা জেনেরিক প্রকারগুলি বোঝে না। অথবা তার উত্তর এবং ইতিহাসের মিশ্রণও হতে পারে।


3
"সি # এর জেনেরিক ধরণের তুলনায় অনেক বেশি সময় ধরে ব্যবহৃত হচ্ছে।" আসলেই নয়, জেনারিক ব্যতীত সি # প্রায় 4 বছর ধরে ছিল (জানুয়ারী 2002 - নভেম্বর 2005), যখন জেনেরিক সহ সি # এখন 9 বছর বয়সী।
সুইভিক


4

কিছু ক্ষেত্রে জেনেরিক প্রকারগুলি ব্যবহার করা অসম্ভব, উদাহরণস্বরূপ আপনি এক্সএএমএল-তে জেনেরিক প্রকারটি উল্লেখ করতে পারবেন না। এই ক্ষেত্রে আপনি একটি নন-জেনেরিক প্রকার তৈরি করতে পারেন যা আপনি জেনেরিক টাইপটি পেয়েছিলেন যা আপনি মূলত ব্যবহার করতে চেয়েছিলেন from

যদি সম্ভব হয় তবে আমি এড়াতে চাই

একটি টাইপডেফের বিপরীতে, আপনি একটি নতুন ধরণের তৈরি করেন। আপনি যদি কোনও পদ্ধতির ইনপুট প্যারামিটার হিসাবে স্ট্রিংলিস্ট ব্যবহার করেন তবে আপনার কলাররা একটি পাস করতে পারবেন না List<string>

এছাড়াও, স্ট্রিংলিস্টের উদাহরণে আপনি যেমন বলতে পারবেন না এমন স্ট্রিংলিস্টের উদাহরণে আপনি যে সমস্ত কনস্ট্রাক্টর ব্যবহার করতে চান তা স্পষ্টভাবে অনুলিপি করতে হবে, new StringList(new[]{"a", "b", "c"})যদিও এই List<T>জাতীয় নির্মাণকারীকে সংজ্ঞায়িত করা হয়।

সম্পাদনা:

গৃহীত উত্তরটি আপনার ডোমেন মডেলের অভ্যন্তরে প্রাপ্ত উপকরণগুলি ব্যবহার করার সময় প্রোগুলির উপর দৃষ্টি নিবদ্ধ করে। আমি সম্মত হই যে তারা এই ক্ষেত্রে সম্ভাব্যরূপে কার্যকর হতে পারে, তবুও, আমি ব্যক্তিগতভাবে তাদের এমনকি সেখানে এড়াতে পারি।

তবে আপনার (আমার মতে) এগুলি কখনই কোনও সর্বজনীন এপিআইতে ব্যবহার করা উচিত নয় কারণ আপনি হয় নিজের কলারের জীবনকে আরও কঠোর করুন বা কর্মক্ষমতা নষ্ট করবেন (আমি সাধারণভাবে প্রকৃত রূপান্তর পছন্দ করি না)।


3
আপনি বলছেন, " আপনি এক্সএএমএল-তে জেনেরিক ধরণের উল্লেখ করতে পারবেন না ", তবে আপনি কী উল্লেখ করছেন তা আমি নিশ্চিত নই। এক্সএএমএল
জেনারিকস

1
এটি উদাহরণ হিসাবে বোঝানো হয়েছিল। হ্যাঁ, এটি ২০০৯ এর এক্সএএমএল স্কিমা দ্বারা সম্ভব, তবে আফিক 2006 এর স্কিমার সাথে নয়, যা এখনও ভিএস ডিফল্ট।
Lukas Rieger

1
আপনার তৃতীয় অনুচ্ছেদটি ঠিক অর্ধেক সত্য, আপনি প্রকৃত রূপান্তরকারীদের সাথে
এটির

1
@ কিনার্ড, সত্য, তবে আপনি 'স্পষ্টতই' একটি নতুন অবজেক্ট তৈরি করুন। আপনি যদি আরও অনেক বেশি কাজ না করেন তবে এটি ডেটার একটি অনুলিপিও তৈরি করবে। সম্ভবত ছোট তালিকাগুলির সাথে কিছু আসে যায় না, তবে মজা করুন, কেউ যদি কয়েক হাজার উপাদান দিয়ে কোনও তালিকা পাস করে =)
লুকাশ রিগ্রার

@ লুকাসরিজার আপনি ঠিক বলেছেন: পিআই কেবল সেটিকেই নির্দেশ করতে চেয়েছিল: পি
কেনার্ড

2

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

প্রকল্পের কোডঅ্যানালাইসিসে আপনি এই সংজ্ঞাটি পেতে পারেন:

/// <summary>
/// Common base class for C# and VB PE module builder.
/// </summary>
internal abstract class PEModuleBuilder<TCompilation, TSourceModuleSymbol, TAssemblySymbol, TTypeSymbol, TNamedTypeSymbol, TMethodSymbol, TSyntaxNode, TEmbeddedTypesManager, TModuleCompilationState> : CommonPEModuleBuilder, ITokenDeferral
    where TCompilation : Compilation
    where TSourceModuleSymbol : class, IModuleSymbol
    where TAssemblySymbol : class, IAssemblySymbol
    where TTypeSymbol : class
    where TNamedTypeSymbol : class, TTypeSymbol, Cci.INamespaceTypeDefinition
    where TMethodSymbol : class, Cci.IMethodDefinition
    where TSyntaxNode : SyntaxNode
    where TEmbeddedTypesManager : CommonEmbeddedTypesManager
    where TModuleCompilationState : ModuleCompilationState<TNamedTypeSymbol, TMethodSymbol>
{
  ...
}

তারপরে প্রকল্পে CSharpCodeanalysis এই সংজ্ঞা আছে:

internal abstract class PEModuleBuilder : PEModuleBuilder<CSharpCompilation, SourceModuleSymbol, AssemblySymbol, TypeSymbol, NamedTypeSymbol, MethodSymbol, SyntaxNode, NoPia.EmbeddedTypesManager, ModuleCompilationState>
{
  ...
}

এই নন-জেনেরিক পেমোডুল বিল্ডার শ্রেণিটি সিএসআরএপকোডেনালাইসিস প্রকল্পে ব্যাপকভাবে ব্যবহৃত হয় এবং সেই প্রকল্পের বেশ কয়েকটি শ্রেণি প্রত্যক্ষ বা অপ্রত্যক্ষভাবে এর উত্তরাধিকার সূত্রে প্রাপ্ত হয়।

এবং তারপরে প্রকল্প বেসিক কোডানালাইসিসে এই সংজ্ঞা রয়েছে:

Partial Friend MustInherit Class PEModuleBuilder
    Inherits PEModuleBuilder(Of VisualBasicCompilation, SourceModuleSymbol, AssemblySymbol, TypeSymbol, NamedTypeSymbol, MethodSymbol, SyntaxNode, NoPia.EmbeddedTypesManager, ModuleCompilationState)

যেহেতু আমরা (আশাবাদী) ধরে নিতে পারি যে রোজলিন সি # এর বিস্তৃত জ্ঞানসম্পন্ন লোকেরা লিখেছিলেন এবং কীভাবে এটি ব্যবহার করা উচিত আমি ভাবছি এটি কৌশলটির একটি সুপারিশ।


হ্যাঁ। এবং এগুলি সরাসরি ঘোষণা করার সময় যেখানে ক্লজটি পরিমার্জন করতে ব্যবহার করা যেতে পারে।
সেন্টিনেল

1

আমার মাথার উপরে থেকে কেউ কেন এটি করার চেষ্টা করবে তার সম্ভাব্য তিনটি কারণ রয়েছে:

1) ঘোষণা সহজ করার জন্য:

অবশ্যই StringListএবং ListStringএকই দৈর্ঘ্যের সম্পর্কে তবে এর পরিবর্তে কল্পনা করুন যে আপনি UserCollectionবাস্তবে Dictionary<Tuple<string,Type>, IUserData<Dictionary,MySerializer>>বা অন্য কোনও বড় জেনেরিক উদাহরণ দিয়ে কাজ করছেন।

2) এওটি সাহায্য করতে:

কখনও কখনও আপনার সময় সংকলন ঠিক সময়ের সংকলন নয় - যেমন আইওএসের জন্য বিকাশ করা দরকার। কখনও কখনও এওটি সংকলকটি সময়ের আগে সমস্ত জেনেরিক প্রকারগুলি বের করতে অসুবিধা হয় এবং এটি কোনও ইঙ্গিত প্রদান করার চেষ্টা হতে পারে।

3) কার্যকারিতা যুক্ত করতে বা নির্ভরতা অপসারণ করতে:

মনে হয় তারা নির্দিষ্ট কার্যকারিতা আছে তারা বাস্তবায়ন করতে চান StringList(একটি এক্সটেনশন পদ্ধতি লুকানো যেতে পারে এখনো যোগ করেনি, বা ঐতিহাসিক) যে তারা হয় যোগ করতে পারবেন না List<string>তা থেকে উত্তরাধিকার সূত্রে প্রাপ্ত ছাড়া বা তাদের যেটি দূষিত চাই না যে List<string>সঙ্গে ।

বিকল্পভাবে তারা StringListট্র্যাকটি ডাউন করার বাস্তবায়ন পরিবর্তন করতে চাইতে পারে , সুতরাং এখনই ক্লাসটি একটি মার্কার হিসাবে ব্যবহার করেছে (সাধারণত আপনি উদাহরণস্বরূপ ইন্টারফেসগুলি তৈরি / ব্যবহার করতে চান IList)।


আমি আরও নোট করব যে আপনি এই কোডটি আয়রনীতে পেয়েছেন, যা একটি ভাষা পার্সার - মোটামুটি অস্বাভাবিক ধরনের অ্যাপ্লিকেশন। এটি ব্যবহৃত হয়েছিল এমন আরও কিছু নির্দিষ্ট কারণ থাকতে পারে।

এই উদাহরণগুলি প্রমাণ করে যে এই জাতীয় ঘোষণাটি লেখার বৈধ কারণ থাকতে পারে - এমনকি এটি খুব সাধারণ না হলেও। যে কোনও কিছুর সাথে বিভিন্ন বিকল্প বিবেচনা করুন এবং চয়ন করুন যা আপনার জন্য সেরা।


যদি আপনার উত্স কোডটি একবার দেখে থাকে তবে এটি বিকল্প 3 এর উপস্থিতি হিসাবে মনে হয় - তারা কার্যকরীতা যোগ করতে / সংগ্রহ বিশেষায়িত করতে এই কৌশলটি ব্যবহার করে:

public class StringList : List<string> {
    public StringList() { }
    public StringList(params string[] args) {
      AddRange(args);
    }
    public override string ToString() {
      return ToString(" ");
    }
    public string ToString(string separator) {
      return Strings.JoinStrings(separator, this);
    }
    //Used in sorting suffixes and prefixes; longer strings must come first in sort order
    public static int LongerFirst(string x, string y) {
      try {//in case any of them is null
        if (x.Length > y.Length) return -1;
      } catch { }
      if (x == y) return 0;
      return 1; 
    }

1
কখনও কখনও ঘোষণাকে সরল করার কোয়েস্ট (বা যা কিছু সরল করুন) এর ফলে জটিলতা হ্রাসের পরিবর্তে জটিলতা বৃদ্ধি পেতে পারে। যে কেউ ভাষাটি মাঝারিভাবে জানেন List<T>তারা কী কী তা জানেন তবে StringListপ্রকৃতপক্ষে এটি কী তা বোঝার জন্য তাদের প্রসঙ্গে পরিদর্শন করতে হবে । বাস্তবে, এটি ঠিক List<string>, আলাদা নামে চলছে। সত্যিই এমন সাধারণ ক্ষেত্রে এটি করার কোনও অর্থগত সুবিধা বলে মনে হচ্ছে না। আপনি সত্যিই ঠিক পরিচিত নামটি একই ধরণের সাথে আলাদা নামের সাথে প্রতিস্থাপন করছেন।
ক্রেগ

@ ক্রেইগ আমি সম্মত, যেমন আমার ব্যবহারের ব্যাখ্যার (দীর্ঘকালীন ঘোষণা) এবং অন্যান্য সম্ভাব্য কারণ দ্বারা উল্লিখিত হয়েছে।
NPSF3000

-1

আমি বলব এটি ভাল অনুশীলন নয়।

List<string>"স্ট্রিংগুলির একটি সাধারণ তালিকা" যোগাযোগ করে commun স্পষ্টতই List<string> এক্সটেনশন পদ্ধতিগুলি প্রযোজ্য। কম জটিলতা বুঝতে প্রয়োজন; শুধুমাত্র তালিকা প্রয়োজন।

StringList"একটি পৃথক শ্রেণীর প্রয়োজন" যোগাযোগ করে। হতে পারে List<string> এক্সটেনশন পদ্ধতিগুলি প্রয়োগ হয় (এটির জন্য প্রকৃত প্রকারের প্রয়োগ পরীক্ষা করুন)। কোডটি বোঝার জন্য আরও জটিলতার প্রয়োজন; তালিকা এবং উত্পন্ন শ্রেণি প্রয়োগের জ্ঞান প্রয়োজন।


4
এক্সটেনশন পদ্ধতিগুলি যেভাবেই প্রযোজ্য।
থিওডোরোস চ্যাটজিগিয়ানানাকিস

2
অবশ্যই. তবে আপনি জানেন না যে অবিরত আপনি স্ট্রিংলিস্টটি পরিদর্শন করেন এবং দেখুন এটি থেকে প্রাপ্ত List<string>
রুডজাহ

@ থিডোরোস চ্যাটিজিগিয়ানানাকিস আমি অবাক হয়েছি যে, "এক্সটেনশন পদ্ধতি প্রয়োগ হয় না" এর মাধ্যমে রুদজাহ তার অর্থ কী তা ব্যাখ্যা করতে পারতেন। এক্সটেনশন পদ্ধতিগুলি কোনও শ্রেণীর সাথে সম্ভাবনা । অবশ্যই, জেনেরিক সংগ্রহের ক্লাসে প্রযোজ্য অনেকগুলি এক্সটেনশন পদ্ধতি সহ .NET ফ্রেমওয়ার্ক লাইব্রেরি জাহাজগুলিকে বলা হয় যা জেনেরিক সংগ্রহের ক্লাসগুলিতে প্রয়োগ হয়, তবে এর অর্থ এই নয় যে এক্সটেনশন পদ্ধতিগুলি অন্য কোনও ক্লাসে প্রযোজ্য নয়? হতে পারে রুডজাহ এমন একটি পয়েন্ট তৈরি করছেন যা প্রথম নজরে সুস্পষ্ট নয়? ;-)
ক্রেগ

"এক্সটেনশন পদ্ধতি প্রয়োগ হয় না।" আপনি কোথায় এটি পড়েন? আমি বলছি "এক্সটেনশন পদ্ধতিগুলি প্রয়োগ হতে পারে
রুডজাহ

1
প্রকারের প্রয়োগটি আপনাকে বলবে না এক্সটেনশন পদ্ধতিগুলি প্রয়োগ হয় কি না, তবে ঠিক? শুধু যে এটি একটি বর্গ মানে এক্সটেনশন পদ্ধতি এর কি প্রযোজ্য। আপনার ধরণের যে কোনও গ্রাহক আপনার কোড থেকে সম্পূর্ণ স্বাধীনভাবে এক্সটেনশন পদ্ধতি তৈরি করতে পারেন। আমার ধারণা আমি যা পাচ্ছি বা জিজ্ঞাসা করছি। আপনি কি লিনকিউ সম্পর্কে কথা বলছেন? লাইনকিউ এক্সটেনশন পদ্ধতি ব্যবহার করে প্রয়োগ করা হয়। তবে একটি নির্দিষ্ট ধরণের জন্য লিনকিউ-নির্দিষ্ট এক্সটেনশন পদ্ধতির অনুপস্থিতির অর্থ এই নয় যে এই ধরণের এক্সটেনশন পদ্ধতিগুলি বিদ্যমান নেই বা নেই। এগুলি যে কোনও সময়ে যে কোনও সময়ে তৈরি হতে পারে।
ক্রেগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.