জেনেরিকদের অপব্যবহার কী?


35

কিছু কোড পর্যালোচনা করার সময়, আমি জেনেরিকগুলি ব্যবহার করার জন্য এটি পরিবর্তন করার সুযোগটি লক্ষ্য করেছি। (অবরুদ্ধ) কোডটি দেখে মনে হচ্ছে:

public void DoAllTheThings(Type typeOfTarget, object[] possibleTargets)
{
    var someProperty = typeOfTarget.GetProperty(possibleTargets[0]);
    ...
}

এই কোডটি জেনেরিকগুলি দ্বারা প্রতিস্থাপন করা যেতে পারে, যেমন:

public void DoAllTheThings<T>(object[] possibleTargets[0])
{
    var someProperty = type(T).getProperty(possibleTargets[0]);
    ...
}

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

আমার প্রশ্ন দুটি অংশে আসে:

  1. এর মতো জেনারিকগুলিতে যাওয়ার কোনও সুবিধা আছে কি? (পারফরম্যান্স? পঠনযোগ্যতা?)
  2. জেনেরিক্স অ্যাবিজ কী? এবং প্রতিবার কোনও ধরণের পরামিতি অপব্যবহারের পরে জেনেরিক ব্যবহার করছেন ?

2
আমি বিভ্রান্ত আপনি সম্পত্তির নাম আগেই জানেন তবে কোনও ধরণের প্রকারটি নয় তাই আপনি কোনও মূল্য পেতে প্রতিবিম্বটি ব্যবহার করেন?
মেটাফাইট

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

12
আমি সর্বদা বিবেচনা করেছি যে জেনেরিক উপস্থিতিগুলির সাধারণ কারণ (সুস্বাদু পাং উদ্দেশ্য নয়)। আপনি যখন টাইপ কৌশলটি নিজের টাইপ সিস্টেমটি আপনার জন্য করতে পারেন তবে তা কেন নিজেরাই করেন?
মেটাফাইট

2
আপনার উদাহরণটি জঘন্য, তবে আমার মনে হচ্ছে এটি অনেকটা আইওডি গ্রন্থাগারগুলি হ'ল
ইওয়ান

14
কোনও উত্তর নয়, তবে এটি লক্ষণীয় যে দ্বিতীয় উদাহরণটি প্রথমটির চেয়ে কম নমনীয়। ফাংশনটিকে জেনেরিক করে তোলা একটি রানটাইম টাইপে পাস করার আপনার ক্ষমতা সরিয়ে দেয়; জেনারিকদের সংকলনের সময়টি জানতে হবে।
কেচালাক্স

উত্তর:


87

জেনেরিকগুলি যথাযথভাবে প্রয়োগ করা হয়, তারা কেবল পুনরায় সাজানোর পরিবর্তে কোড সরিয়ে দেয়। প্রাথমিকভাবে, জেনেরিকগুলি যে কোডটি অপসারণে সেরা তা হ'ল টাইপকাস্ট, প্রতিবিম্ব এবং গতিশীল টাইপিং। অতএব জেনেরিক অপব্যবহারকে জেনেরিক প্রয়োগ তৈরির তুলনায় টাইপকাস্টিং, প্রতিবিম্ব বা গতিশীল টাইপিংয়ে উল্লেখযোগ্যভাবে হ্রাস না করে জেনেরিক কোড তৈরির হিসাবে সংজ্ঞায়িত করা যেতে পারে।

আপনার উদাহরণের বিষয়ে, আমি জেনেরিকগুলির যথাযথ ব্যবহারটি object[]একটি T[]বা অনুরূপতে পরিবর্তন করতে এবং এড়ানো Typeবা typeসম্পূর্ণভাবে এড়াতে আশা করব । এর জন্য অন্য কোথাও উল্লেখযোগ্য রিফ্যাক্টরিংয়ের প্রয়োজন হতে পারে, তবে জেনারিকগুলি যদি এই ক্ষেত্রে উপযুক্ত হয় তবে আপনার কাজ শেষ হওয়ার পরে এটি সামগ্রিকভাবে সহজ হওয়া উচিত।


3
এটি একটি দুর্দান্ত বিষয়। আমি কোডটি স্বীকার করব যা আমাকে এই ভেবে পেয়েছিল যে প্রতিফলন পড়ার জন্য কিছু কঠোর পরিশ্রম করছিল। আমি পরিবর্তন object[]করতে পারেন কিনা তা দেখতে পাবেন T[]
সিনট্যাক্স রুলস

3
আমি সরানো বনাম পুনরায় সাজানো বৈশিষ্ট্যটি পছন্দ করি।
তামার.হাট

13
আপনি জেনেরিকের একটি কী ব্যবহার মিস করেছেন - যা হ'ল সদৃশতা হ্রাস করা। (যদিও আপনি উল্লেখ করেছেন এমন অন্য কোনও পাপের প্রবর্তনের মাধ্যমে নকলকে হ্রাস করতে পারবেন)। যদি এটি কোনও টাইপকাস্ট, প্রতিবিম্ব বা গতিশীল টাইপিং আইএমও বাদ না দিয়ে অনুলিপি হ্রাস করে তবে তা ঠিক।
মাইকেল অ্যান্ডারসন

4
দুর্দান্ত উত্তর। আমি যুক্ত করব যে এই বিশেষ ক্ষেত্রে, ওপিকে জেনেরিকের পরিবর্তে কোনও ইন্টারফেসে যেতে হবে। দেখে মনে হচ্ছে যেন বস্তুর নির্দিষ্ট বৈশিষ্ট্য অ্যাক্সেস করতে প্রতিবিম্বটি ব্যবহৃত হচ্ছে; সংকলককে এই জাতীয় বৈশিষ্ট্যগুলি আসলে বিদ্যমান কিনা তা নির্ধারণ করতে একটি ইন্টারফেস অনেক বেশি উপযুক্ত।
jpmc26


5

আমি নন-ননসেন্স রুলটি ব্যবহার করব: সমস্যা সমাধানের জন্য অন্যান্য প্রোগ্রামিং কনস্ট্রাক্টের মতো জেনেরিক্সও বিদ্যমান । জেনারিকদের সমাধান করতে যদি সমস্যা না হয় তবে সেগুলি ব্যবহার করা আপত্তিজনক।

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

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


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


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

@ ক্রিস্টোফ এটি সত্যিই একটি জটিল প্রশ্ন। হ্যাঁ, কিছু পরিস্থিতি রয়েছে যেখানে আমার নিয়ম উপেক্ষা করা সত্যই ভাল (প্রোগ্রামিংয়ে ব্যতিক্রম ছাড়া কোনও নিয়ম নেই!)। তবে, নির্দিষ্ট স্ট্রিং রূপান্তর কেসটি আসলে পরিবর্তে জড়িত: ১. আপনাকে স্বাক্ষরযুক্ত এবং স্বাক্ষরযুক্ত স্বাক্ষরযুক্ত পূর্ণসংখ্যার প্রকারগুলি আলাদাভাবে চিকিত্সা করা উচিত। ২. আপনার ভাসা রূপান্তরগুলি পূর্ণসংখ্যার রূপান্তর থেকে পৃথক করে চিকিত্সা করা দরকার। ৩. আপনি ছোট ধরণের জন্য বৃহত্তম উপলব্ধ পূর্ণসংখ্যার ধরণের জন্য একটি প্রয়োগকরণ পুনরায় ব্যবহার করতে পারেন। Theালাই করার জন্য আপনি জেনেরিক মোড়কে প্রক্রিয়ায় সক্রিয়ভাবে লিখতে ইচ্ছুক হতে পারেন তবে মূলটি জেনেরিক ছাড়াই হবে।
মাস্টার

1
আমি সম্ভাব্য YAGNI হিসাবে জেনেরিক (পুনরায় ব্যবহারের পরিবর্তে প্রাক-ব্যবহার) লেখার পক্ষে সক্রিয়ভাবে তর্ক করব। আপনার যখন এটির প্রয়োজন হবে, তারপরে রিফ্যাক্টর।
নিল_উইকে

এই প্রশ্নটি লেখার পরে আমি "ভবিষ্যতের সম্ভাব্য পুনঃব্যবহারের সংরক্ষণ করতে যদি সম্ভব হয় তবে এটি জেনেরিক হিসাবে লিখুন" এর আরও অবস্থান নিয়েছিলাম। আমি জানতাম যে এটি কিছুটা চরম। এখানে আপনার দৃষ্টিকোণটি দেখতে সতেজ হয়। ধন্যবাদ!
সিনট্যাক্সরুলস

0

কোডটি বিজোড় দেখাচ্ছে। তবে আমরা যদি এটি কল করি তবে জেনেরিক হিসাবে প্রকারটি নির্দিষ্ট করা ভাল লাগে।

https://stackoverflow.com/questions/10955579/passing-just-a-type-as-a-parameter-in-c-sharp

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

তবে আপনাকে স্বীকার করতে হবে যে এর একটি জনপ্রিয় নিম্নলিখিত রয়েছে। এমনকি মাইক্রোসফ্ট উদাহরণস্বরূপ এটি unityক্যতে ব্যবহার করে

container.RegisterType<IInterface,Concrete>()

0

আমার কাছে দেখে মনে হচ্ছে আপনি এখানে সঠিক পথে ছিলেন, কিন্তু কাজ শেষ করেননি।

আপনি কি পরবর্তী পদক্ষেপের জন্য object[]প্যারামিটারটি পরিবর্তন করার বিষয়টি বিবেচনা করেছেন Func<T,object>[]?

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