Ptionচ্ছিক পরামিতি বা ওভারলোডেড কনস্ট্রাক্টর


28

আমি একটি বাস্তবায়ন করছি DelegateCommand, এবং যখন আমি কনস্ট্রাক্টর (গুলি) বাস্তবায়ন করতে যাচ্ছিলাম, আমি নিম্নলিখিত দুটি নকশা পছন্দ নিয়ে এসেছি:

1: একাধিক ওভারলোডেড কনস্ট্রাক্টর রয়েছে

public DelegateCommand(Action<T> execute) : this(execute, null) { }

public DelegateCommand(Action<T> execute, Func<T, bool> canExecute)
{
    this.execute = execute;
    this.canExecute = canExecute;
}

2: alচ্ছিক প্যারামিটার সহ কেবলমাত্র একজন কনস্ট্রাক্টর রয়েছে

public DelegateCommand(Action<T> execute, Func<T, bool> canExecute = null)
{
    this.execute = execute;
    this.canExecute = canExecute;
}

আমি কোনটি ব্যবহার করব তা আমি জানি না কারণ প্রস্তাবিত দুটি উপায়ের মধ্যে কোনওটি কীভাবে সম্ভাব্য সুবিধা / অসুবিধাগুলি নিয়ে আসে তা আমি জানি না । উভয়কে এভাবে বলা যেতে পারে:

var command = new DelegateCommand(this.myExecute);
var command2 = new DelegateCommand(this.myExecute, this.myCanExecute);

কেউ দয়া করে আমাকে সঠিক দিক নির্দেশ করে প্রতিক্রিয়া জানাতে পারেন?


4
KISS এবং YAGNI I সন্দেহের ক্ষেত্রে উভয়ই বাস্তবায়ন করুন। কিছুক্ষণ পরে উভয় কনস্ট্রাক্টরের রেফারেন্স অনুসন্ধান করুন। যদি সেগুলির মধ্যে কোনও একটিও বাহ্যিকভাবে গ্রহণ না করা অবাক হয় না। বা প্রান্তিকভাবে গ্রাস করা হয়। কোডটির স্থিতিশীল বিশ্লেষণ সম্পাদন করা এটি সহজ কিছু।
লাইভ

1
স্ট্যাটিক কনস্ট্রাক্টর (যেমন Bitmap.FromFile) এছাড়াও একটি বিকল্প
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

3
কোড বিশ্লেষণের নিয়ম রাখুন CA1026: ডিফল্ট পরামিতিগুলি মনে রাখা উচিত নয়
ড্যান

2
@ লাইভ আমি কিছু মিস করছি? সেগুলি একইভাবে ব্যবহৃত হয় এবং একইভাবে স্বাক্ষর থাকে। আপনি রেফারেন্সগুলি অনুসন্ধান করতে পারবেন না এবং ফোন করতে পারেন বলে কলকারীটি যা ভাবছিলেন তা বলতে পারেন না। এটি আরও বেশি শোনাচ্ছে যেমন আপনি ওপি-তে সেই দ্বিতীয় যুক্তি থাকা উচিত কিনা তা উল্লেখ করছেন, তবে এটি ওপি যা জিজ্ঞাসা করছে না তা নয় (এবং তারা অবশ্যই নিশ্চিতভাবে জানতে পারে যে তাদের উভয়ের উভয় ক্ষেত্রেই প্রয়োজন, তাই তাদের জিজ্ঞাসা করছেন)।
ক্যাট

2
ওপেনডেজের জন্য @ ভো সংকলক | অগ্রগতি 10.2 বি তাদের উপেক্ষা করে। খুব আমাদের অ-ব্রেকিং পদ্ধতি পরিবর্তন কৌশলকে হত্যা করেছে; পরিবর্তে, আমাদের একই প্রভাবের জন্য ওভারলোডিং ব্যবহার করতে হবে।
ব্রেট

উত্তর:


24

আমি ডিফল্ট মানগুলির চেয়ে একাধিক কনস্ট্রাক্টরকে পছন্দ করি এবং ব্যক্তিগতভাবে আমি আপনার দুটি নির্মাণকারীর উদাহরণ পছন্দ করি না, এটি আলাদাভাবে প্রয়োগ করা উচিত।

একাধিক কনস্ট্রাক্টর ব্যবহারের কারণ হ'ল প্রধানটি কেবল যাচাই করতে পারে যে সমস্ত প্যারামিটারগুলি নাল নয় এবং সেগুলি বৈধ কিনা অন্য অন্য নির্মাণকারীরা মূলটির জন্য ডিফল্ট মান সরবরাহ করতে পারে।

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

এর অর্থ এইভাবে প্রয়োগ করা হলে এটি পরিষ্কার এবং আরও ভালভাবে পৃথক হবে:

public DelegateCommand(Action<T> execute) : this(execute, _ => true) { }

public DelegateCommand(Action<T> execute, Func<T, bool> canExecute)
{
    this.execute = execute ?? throw new ArgumentNullException(..);
    this.canExecute = canExecute ?? throw new ArgumentNullException(..);
}

_ => trueপ্রাথমিক কন্সট্রাক্টরকে পাসের বিষয়টি লক্ষ্য করুন যা এখন সমস্ত পরামিতিগুলি পরীক্ষা nullকরে এবং কোনও ডিফল্টের যত্ন করে না।


তবে সর্বাধিক গুরুত্বপূর্ণ বিষয় হ'ল এক্সটেনসিবিলিটি। একাধিক নির্মাতারা নিরাপদ যখন আপনি ভবিষ্যতে আপনার কোড প্রসারিত করার একটি সম্ভাবনা আছে। আপনি যদি আরও প্রয়োজনীয় প্যারামিটার যুক্ত করেন এবং alচ্ছিকগুলি অবশ্যই শেষে আসতে হবে, আপনি আপনার সমস্ত বর্তমান প্রয়োগগুলি ভেঙে ফেলবেন। আপনি পুরানো কনস্ট্রাক্টর তৈরি করতে [Obsolete]এবং ব্যবহারকারীদের অবহিত করতে পারেন যে তাদের কোডটি তাত্ক্ষণিকভাবে ভঙ্গ না করে নতুন বাস্তবায়নে মাইগ্রেট করার সময় দিয়ে এটিকে সরানো হবে।


অন্যদিকে অনেকগুলি পরামিতিগুলি metersচ্ছিকভাবে তৈরি করাও বিভ্রান্তিকর হবে কারণ সেগুলির কয়েকটি যদি একটি দৃশ্যে প্রয়োজন হয় এবং অন্য একটিতে alচ্ছিক প্রয়োজন হয় তবে কেবলমাত্র তার প্যারামিটারগুলি দেখে সঠিক কনস্ট্রাক্টর বাছাইয়ের পরিবর্তে আপনাকে ডকুমেন্টেশন অধ্যয়ন করতে হবে।


12
অন্যদিকে অনেকগুলি পরামিতি optionচ্ছিক করা বিভ্রান্তিকর হবে ... সত্যি কথা বলতে অনেক প্যারামিটার থাকা (তারা alচ্ছিক না হলেও নির্বিশেষে) বিভ্রান্তিকর।
অ্যান্ডি

1
@ ডেভিডপ্যাকার আমি আপনার সাথে একমত, তবে কতগুলি পরামিতি অনেক বেশি তা অন্য একটি গল্প বলে আমি মনে করি ;-)
t3chb0t

2
কনস্ট্রাক্টর থাকার মধ্যে অন্য পার্থক্য রয়েছে যা প্যারামিটারের জন্য ডিফল্ট ডিফল্ট কনস্ট্রাক্টর বনাম একটি পরামিতি বাদ দেয়। প্রথম ক্ষেত্রে, কলার স্পষ্ট করে প্যারামিটারটি এড়াতে পারে, তবে পরবর্তী ক্ষেত্রে কলার পারে না - কারণ কোনও পরামিতি পাস করা ডিফল্ট মান পাস করার মতো নয়। যদি কনস্ট্রাক্টরকে এই পার্থক্যটি তৈরি করতে হয় তবে দুটি কনস্ট্রাক্টরই একমাত্র উপায়।
গ্যারি ম্যাকগিল

1
উদাহরণস্বরূপ, আমি একটি বর্গ যে ফরম্যাটের স্ট্রিং, যা আমি পারেন অনুমান করা ঐচ্ছিকভাবে একটি সঙ্গে গঠন করা CultureInfoবস্তু। আমি একটি API যা অনুমোদিত পছন্দ করেন CultureInfoপ্যারামিটার একটি অতিরিক্ত প্যারামিটার মাধ্যমে সরবরাহ করা, কিন্তু জোর দিয়ে বলে যে যদি এটি ছিল তারপর সরবরাহকৃত এটি করা উচিত নয় হতে null। এইভাবে দুর্ঘটনাজনিত nullমানগুলি "কিছুই নয়" অর্থ হিসাবে ভুল ব্যাখ্যা হয় না don't
গ্যারি ম্যাকগিল

আমি নিশ্চিত নই যে এক্সটেনসিবিলিটি হ'ল al চ্ছিক পরামিতিগুলির বিরুদ্ধে কারণ ; আপনার যদি মোটামুটি প্যারামিটারের প্রয়োজন হয় এবং সেগুলির সংখ্যাটি সর্বদা পরিবর্তন করেন তবে আপনাকে নতুন Obsoleteভাঙা তৈরি করতে হবে এবং পুরানো একটি তৈরি করতে হবে যদি আপনি জিনিস ভাঙ্গা এড়াতে চান, আপনার কাছে বৈকল্পিক পরামিতিও আছে বা না। Alচ্ছিক পরামিতিগুলির সাহায্যে আপনার কেবলমাত্র Obsoleteযদি আপনি এটি অপসারণ করেন।
হিরোহতার ২

17

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

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


3

আমি মনে করি দুটি পৃথক ক্ষেত্রে রয়েছে যার জন্য প্রতিটি পদ্ধতির আলোকিত হতে পারে।

প্রথমত, যখন আমাদের সাধারণ কনস্ট্রাক্টর থাকে (যা সাধারণত আমার অভিজ্ঞতায় হয়) তখন আমি optionচ্ছিক যুক্তিগুলি আলোকিত করার জন্য বিবেচনা করব।

  1. তারা কোডটি ন্যূনতম করে যা লিখতে হবে (এবং এইভাবে এটি পড়তে হবে)।
  2. আপনি নিশ্চিত করতে পারেন যে ডকুমেন্টেশন এক জায়গায় রয়েছে এবং পুনরাবৃত্তি হয়নি (যা খারাপ কারণ এটি একটি অতিরিক্ত ক্ষেত্র খালি করে যা পুরানো হতে পারে)।
  3. আপনার যদি অনেক alচ্ছিক যুক্তি থাকে তবে আপনি কনস্ট্রাক্টরের সংমিশ্রণগুলির একটি খুব বিভ্রান্তিকর সেট এড়াতে পারবেন। হেক, এমনকি মাত্র 2 টি .চ্ছিক যুক্তিযুক্ত (একে অপরের সাথে সম্পর্কিত), যদি আপনি পৃথক, ওভারলোডেড কনস্ট্রাক্টর চান, আপনার কাছে 4 জন কনস্ট্রাক্টর (কোনও সংস্করণ ছাড়াই, প্রতিটিটির সাথে সংস্করণ এবং উভয়ের সাথে সংস্করণ) থাকতে হবে। এটি স্পষ্টতই ভাল স্কেল হয় না।

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


একাধিক alচ্ছিক পরামিতি সহ ক্রম বিস্ফোরণ উল্লেখ করার জন্য +1।
জেপসি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.