সি # তে জেনেরিক ধরণের নামকরণের একটি ভাল কনভেনশন কী? [বন্ধ]


16

আমি এই প্রশ্নটি স্ট্যাক ওভারফ্লোয়ের পরিবর্তে এখানে জিজ্ঞাসা করার সিদ্ধান্ত নিয়েছি কারণ এটি বরং বিষয়ভিত্তিক।

সি # তে সাধারণত আমি খুব জরুরী নাম সহ জেনেরিক প্রকারগুলি দেখতে পাই। বিশেষত, "টি" সাধারণত ব্যবহৃত হয় তবে এটি নিজে অর্থবোধক নাম নয়। উদাহরণ স্বরূপ:

class Fruit<T>
{
    T fruit;
}

যদিও এটি সাধারণ পদ্ধতির, কেউ কি এর বিরুদ্ধে সুপারিশ করবে? এবং যদি তা হয় তবে জেনেরিক ফাংশন এবং ক্লাসগুলির জন্য সি # এর প্রসঙ্গে জেনেরিক ধরণের জন্য যুক্তিসঙ্গত নামকরণ কনভেনশনটি কী হবে?

আমার আগের উদাহরণে, ধরে নেওয়া যাক জেনেরিক টাইপ Tসর্বদা এক ধরণের ফল হতে হবে, যেমন Appleবা Orange। প্রকারটি Tএটি স্পষ্ট করে তোলে যে এটি এক ধরণের ফলের, তাই সম্ভবত আরও ভাল নাম হতে পারে FruitType, তাই আমরা শেষ পর্যন্ত:

class Fruit<FruitType>
{
    FruitType fruit;
}

এটি আমি আপনাকে যা খুঁজছি তার একটি ধারণা দেওয়ার জন্যই guys এই সমস্যার জন্য গ্রহণযোগ্য "থাম্বের নিয়ম" কী?


3
এটি কোন গঠনমূলক প্রশ্ন নয়। এটি কেবল পোস্টারের পছন্দসই স্টাইলে উত্তরগুলি পাবে।
মাইকেল কে

1
: আপনার উদাহরণ বিবেচনা সীমাবদ্ধতার কটাক্ষপাত আছে, msdn.microsoft.com/en-us/library/d5x73970.aspx#Y426
Matthieu

2
@ মিশেল সেখানে বেশ কয়েকটি উত্তর থাকবে, এবং স্বীকৃত উত্তরগুলি রবার্টের প্রিয় হবে, তবে অন্যান্য বিভিন্ন উত্তর ভোট দেবে।
স্টুপারউজার

5
@ মিশেল একটি বিষয়গত প্রশ্নের একটি বিষয়গত উত্তর পেয়েছে। প্রশ্নটি এখনও গঠনমূলক কারণ এটি যে কেউ এই বিশেষ সমস্যার বিভিন্ন ধারণা / সমাধান চায় তার জন্য একটি রেফারেন্স পয়েন্ট হিসাবে কাজ করে। আমি যেটিকে উত্তর হিসাবে চিহ্নিত করেছি তা একমাত্র এবং কেবলমাত্র দরকারী বিটকে উপস্থাপন করে না।
void.pointer

সম্ভবত এটি একটি সম্প্রদায় উইকিতে পরিণত করুন, ভাল হিসাবে, যদিও বিষয়ভিত্তিক, সংস্থান?
টাইলারম্যাক

উত্তর:


22

এটা আসলে বিষয়গত ... ইশ
যেহেতু কিছু লোকেরা iলুপ ভেরিয়েবলের জন্য পুরোপুরি বৈধ, তাই কেউ কেউ Tজেনেরিক শ্রেণিতে টাইপ প্লেস-হোল্ডারের পক্ষে পুরোপুরি বৈধ বলে মনে করেন ।

আমি ব্যক্তিগতভাবে এই পদ্ধতির সমর্থন করি, এটি একটি সাধারণ সম্মেলন এবং লোকেরা সাধারণত আপনার অর্থ কী তা বোঝে know

প্রকারটি অর্থপূর্ণ যেখানে আমি একটি অর্থপূর্ণ নাম ব্যবহার করব তবে সাধারণত এটি টি দিয়ে শুরু করব আমি সম্প্রতি একটি জেনেরিক অভিধানের ক্লাস তৈরি করেছি (জিজ্ঞাসা করবেন না) এবং ঘোষণাটি ছিল

public class Dictionary<TKey, TValue>

তবে, টুপলের মতো কিছু, যেখানে প্রকারগুলি মূলত অর্থহীন, আমি নিম্নলিখিতগুলি পুরোপুরি গ্রহণযোগ্য বলে বিবেচনা করি।

public class Tuple<T1, T2, T3>

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

2
@ কনরাড: আপনার একটা কথা আছে । । তবে প্রশ্নটি বিষয়বহুল হিসাবে ট্যাগ করা হয়নি, প্রশ্নকর্তা স্বীকার করেছেন যে এটি একটি বিষয়গত বিষয় মনে করে যে লোকেরা নামকরণের সম্মেলনে তাদের নিজস্ব পছন্দ রয়েছে। সুতরাং যদিও প্রশ্নটি বিষয়গত নাও হতে পারে (এবং সত্যিকার অর্থে এটি সঠিক উত্তর হিসাবে নয় যেমন উত্তরটি মাইক্রোসফ্ট অফিসিয়াল গাইডলাইনে লিঙ্ক করে) বিষয়টি বিষয়ভিত্তিক, কারণ আমি নিশ্চিত যে কেউ পোস্ট করবে " iএবং Tএটি মন্দ । কোনও একক অক্ষরের নাম কখনও ব্যবহার করা উচিত নয়" টাইপ উত্তর। সকলকে সন্তুষ্ট করতে সাহায্য করার জন্য একটি ইশ যোগ করেছেন :)
বাইনারি

1
আমি মনে করি এই পোস্টে যুক্ত করা মন্তব্যগুলি এটিকে একটি অত্যন্ত মূল্যবান প্রতিক্রিয়া হিসাবে চিহ্নিত করে, যদিও উত্তরটি নিজেই খুব সহায়ক। Tযখন আমরা কোনও বাধা ছাড়াই এমন কোনও প্রকারের কথা বলছি তখন TFruitতা বোধগম্য হয় কারণ এটি আমাকে বলে "সীমাবদ্ধতার সাথে যে কোনও প্রকার এটি একটি ফল" says জেনেরিক ধরণের পরামিতিগুলির নামকরণের জন্য এটি একটি ভাল "থাম্বের নিয়ম" বলে মনে হচ্ছে। ধন্যবাদ !!
void.pointer

1
কেবল লক্ষণীয়, এটি এমএসডিএন থেকে লাইব্রেরি বিকাশকারীদের জন্য .NET ফ্রেমওয়ার্ক ডিজাইন নির্দেশিকাগুলির সাথে একত্রিত হয়। দেখুন: জেনেরিক টাইপ পরামিতিগুলির নাম
গ্রান্ট থমাস

7

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

আপনি টি একটি উপসর্গ হিসাবে বেছে নিতে পারেন, অনেক লোকের মত ইন্টারফেসের জন্য আমি বেছে নিই। এইভাবে

class Juice<TFruit> where TFruit...

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

এর নেতিবাচক দিকটি হ'ল, টাইপটি টি দিয়ে শুরু হওয়ার সাথে সাথে এটি খারাপ দেখতে লাগবে So

class SomeAlgorithm<TypeT> where TypeT : Type

দয়া করে মনে রাখবেন এটি কেবল আমার মতামত এবং অত্যন্ত বিষয়ভিত্তিক। তবে আমার মনে হয় যে প্রত্যয়টির সাথে উপসর্গের পছন্দকে আমি একটি ছোটখাটো পয়েন্ট পেয়েছি।


ব্যবহারের Tধরণ পরামিতি এবং উপসর্গ Iইন্টারফেস নামের জন্য হয় স্পষ্টভাবে প্রয়োজনীয় ( " আপনি কি ফ্রেমওয়ার্ক ডিজাইন নির্দেশিকাতে ..." নিয়ম)।
রিচার্ড

1
এটি TFruitএখানে কী ব্যবহার করে টেবিলটি নিয়ে আসে তা প্রশ্নবিদ্ধ T। যেমন নাম ব্যবহার TTypeবা TypeTঅবশ্যই আজেবাজে কথা হয়। এটি ঠিক কোন তথ্য যোগ করে নাT । ঠিক একই তথ্য জানানো হয়।
কনরাড রুডলফ

@ কনরাদ রুডল্ফ: টাইপটি-এর আমার উদাহরণটি ঘনিষ্ঠভাবে দেখুন, এটি সিস্টেম.প্রকারের সাথে কাজ করার সময় একটি বিশেষ কেসকে কভার করে। আমি মনে করি যে আমার নামগুলি কেবলমাত্র টাইপের জন্য টি ব্যবহারের চেয়ে উচ্চতর এনট্রপি রয়েছে, বিশেষত যদি জেনেরিকটিও সীমাবদ্ধ থাকে।
ফ্যালকন

7

মাইক্রোসফ্টের জেনেরিক সম্পর্কিত একটি অফিসিয়াল গাইডলাইন রয়েছে: ক্লাসের নাম, স্ট্রাক্টস এবং ইন্টারফেসগুলি ( এখানে उद्धृत করা হয়েছে এবং বইয়ের আকারে: ফ্রেমওয়ার্ক ডিজাইনের গাইডলাইন )।

আপনার নির্দিষ্ট প্রশ্ন সম্পর্কে এটি বলে:

বর্ণনামূলক নামগুলির সাথে জেনেরিক ধরণের পরামিতিগুলির নাম রাখুন, যদি না একক অক্ষরের নাম সম্পূর্ণ স্ব ব্যাখ্যাযোগ্য হয় এবং বর্ণনামূলক নামের মান যোগ না করে।

IDictionary<TKey, TValue> 

এই ইন্টারফেসের একটি উদাহরণ যা এই গাইডলাইনটি অনুসরণ করে।

একটি একক-বর্ণের টাইপ পরামিতি সহ ধরণের প্যারামিটার নাম হিসাবে T অক্ষরটি ব্যবহার করার বিষয়টি বিবেচনা করুন।

টি অক্ষর দিয়ে বর্ণনামূলক প্রকারের প্যারামিটারের নামগুলি উপসর্গ করুন।

প্যারামিটারের নামে কোনও টাইপ প্যারামিটারে স্থাপন করা সীমাবদ্ধতাগুলি বিবেচনা করুন। উদাহরণস্বরূপ, আইসেশনের সীমাবদ্ধ একটি প্যারামিটারকে টিএসশন বলা যেতে পারে।


আরও ভাল রেফারেন্স হ'ল এমএসডিএন-তে ফ্রেমওয়ার্ক ডিজাইন গাইডলাইনস বই বা (সংক্ষিপ্তসার), বিশেষত ক্লাস, স্ট্রাক্ট এবং ইন্টারফেসের নাম
রিচার্ড

@ রিচার্ড: আপনার মন্তব্য বিবেচনা করে আমার উত্তর সামঞ্জস্য করলেন, ধন্যবাদ!
ম্যাথিউউ

2

জেনেরিক্সের পুরো বিষয়টি হ'ল কার্যকারিতা পেশ করা - জেনেরিক শ্রেণি একটি কাজ করে, তার যুক্তি অন্যটি করে। পাঠ্যপুস্তকের উদাহরণটি একটি জেনেরিক সংগ্রহ: সংগ্রহটি 'জিনিসগুলি' সঞ্চয় করে তবে এই জিনিসগুলি কী তা বিবেচ্য নয়। একটি জেনেরিক নাম (sic!), এটির জন্য একটি নির্দিষ্ট যুক্তি রয়েছে - আমরা এটি বর্ণনামূলক হতে চাই না, কারণ "এটি জেনেরিক ধরণের আর্গুমেন্ট" ব্যতীত বর্ণনা করার মতো কিছুই নেই, যা নামটি পরিচ্ছন্নভাবে Tঅন্তর্ভুক্ত করে (বিবেচনা করে) কনভেনশন)। বর্ণনামূলক হওয়া ভাল তবে অত্যধিক বর্ণনামূলক হওয়া সীমাবদ্ধতার প্রস্তাব দেয় that

কখনও কখনও, তবে জেনেরিক শ্রেণি বা পদ্ধতিতে একাধিক ধরণের প্যারামিটার থাকে এবং এই মুহুর্তে, তাদের আরও বর্ণনামূলক নাম দেওয়া বোধগম্য হয়, যাতে তাদের ভূমিকা সুস্পষ্ট হয়ে যায়। একটি ভাল উদাহরণ একটি মূল-মান সংগ্রহের ধরণের জন্য হবে, যেখানে কী এবং মান উভয়ই জেনেরিক; তাদের কল করা Tএবং বলা S( এবং Qবা যাই হোক না কেন) তাদের কল করা, বলা, KeyTypeএবং ValueType, TKeyএবং এবং এর চেয়ে কম কার্যকর হবে TVal


1

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

নিম্নলিখিত আমি শিখেছি এবং অনুসরণ করা সম্মেলনগুলি হল:

  • জেনেরিক ধরণের পরামিতিগুলি কখনই কংক্রিটের ক্লাসগুলির জন্য ভুল হওয়া উচিত নয়। এটি সাধারণত যা যা অনুসরণই Tকরুক না কেন, অনেকটা ইন্টারফেসের মতোই সাধারণত উপস্থাপিত হয় এমন একটি প্রবন্ধকে উত্সাহ দেয় I

  • কোনও শ্রেণি বা পদ্ধতিতে একটি একক জেনেরিক ধরণের পরামিতি সাধারণত লেবেলযুক্ত হওয়া উচিত T। এটি সি -+ টেমপ্লেটগুলির সাথে ডেটিং-এর কাছাকাছি-সর্বজনীন-বোঝা কনভেনশন।

  • একই শ্রেণি বা পদ্ধতি ঘোষণায় একাধিক জেনেরিক ধরণের প্যারামিটারগুলি সমস্ত টি দিয়ে শুরু হওয়া উচিত তবে কিছু সংক্ষিপ্ত তবে বোধগম্য উপায় দ্বারা পৃথক হওয়া উচিত। TInএবং TOut, উদাহরণস্বরূপ, একটি পদ্ধতির জন্য সাধারণ এবং ভালভাবে বোঝা জিটিপিগুলি যা দৃ strongly়ভাবে টাইপযুক্ত জেনেরিক ইনপুট গ্রহণ করে এবং দৃ strongly়ভাবে টাইপযুক্ত জেনেরিক আউটপুট উত্পাদন করে।

  • একাধিক পৃথক পৃথক তবে অবিস্মরণীয় প্রকারের মতো, যেমন নেট এর টিপল বা ফানক, প্রেডিকেট এবং অ্যাকশনের মতো প্রতিনিধি প্রকারগুলিকে টি 1, টি 2, টি 3 ইত্যাদি লেবেলযুক্ত করা যেতে পারে তবে "লক্ষণীয়" জিটিপি ঘোষণা (একটি নির্দিষ্ট উদ্দেশ্য এবং / অথবা খুব নির্দিষ্ট ধরণের বিধিনিষেধের) আরও কিছু বর্ণনামূলক থাকতে হবে।

  • কোনও পদ্ধতিতে একটি একক জেনেরিক প্রকার, যা একটি সাধারণ শ্রেণীর সমন্বিত শ্রেণীর জেনেরিক ধরণের থেকে পৃথক হয়, হয় কোনও শ্রেণিতে বা পদ্ধতিতে একাধিক প্রকারের বিষয়ে পূর্ববর্তী নিয়মটি অনুসরণ করতে পারে, বা যদি প্রকারটি ভিন্ন হওয়ার চেয়ে অবিস্মরণীয় হয় তবে এটি আলাদা দেওয়া যেতে পারে একক চিঠি, প্রায়শই Uবা V। এটি আবার সি ++ টেমপ্লেটগুলির সাথে ডেটাভেশন convention

  • আপনি যা করতে বেছে নিন, এটি ধারাবাহিক রাখুন; প্রথম শ্রেণিতে দ্বিতীয় শ্রেণীর ব্যবহারের জন্য অনুপলব্ধ না হয়ে অন্য শ্রেণীর জন্য একটি জিটিপি Tএবং পরবর্তীটির জন্য লেবেল করবেন না unlessTParamT

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