আমি এই এপিআই ফাংশন আছে:
public ResultEnum DoSomeAction(string a, string b, DateTime c, OtherEnum d,
string e, string f, out Guid code)
আমি এটা পছন্দ করি না। কারণ প্যারামিটার ক্রম অকারণে তাৎপর্যপূর্ণ হয়ে ওঠে। নতুন ক্ষেত্র যুক্ত করা শক্ত হয়ে যায়। চারপাশে কী পার হচ্ছে তা দেখা মুশকিল। ছোট অংশগুলিতে রিফ্যাক্টর পদ্ধতিটি শক্ত, কারণ এটি সাব ফাংশনগুলিতে সমস্ত পরামিতিগুলি পাস করার আরেকটি ওভারহেড তৈরি করে। কোড পড়া শক্ত হয়।
আমি সর্বাধিক সুস্পষ্ট ধারণা নিয়ে হাজির হয়েছি: একটি বস্তু ডেটা encapsulating এবং প্রতিটি পরামিতি এক এক করে পাস করার পরিবর্তে এটি পাস। আমি এখানে যা এলাম:
public class DoSomeActionParameters
{
public string A;
public string B;
public DateTime C;
public OtherEnum D;
public string E;
public string F;
}
এটি আমার এপিআই ঘোষণাটি এতে কমিয়ে দিয়েছে:
public ResultEnum DoSomeAction(DoSomeActionParameters parameters, out Guid code)
খুশী হলাম। দেখতে খুব নিরীহ মনে হচ্ছে তবে আমরা বাস্তবে একটি বিশাল পরিবর্তন প্রবর্তন করেছি: আমরা পরিবর্তনের পরিচয় দিয়েছি। কারণ আমরা যা করছিলাম তা আসলে একটি বেনাম অনিবার্য বস্তু: স্ট্যাকের ফাংশন পরামিতিগুলি পাস করা। এখন আমরা একটি নতুন শ্রেণী তৈরি করেছি যা খুব পরিবর্তনযোগ্য। আমরা কলারের স্থিতিতে কারসাজি করার ক্ষমতা তৈরি করেছি । যে স্তন্যপান। আমি এখন আমার অবজেক্টকে চাই, আমি কী করব?
public class DoSomeActionParameters
{
public string A { get; private set; }
public string B { get; private set; }
public DateTime C { get; private set; }
public OtherEnum D { get; private set; }
public string E { get; private set; }
public string F { get; private set; }
public DoSomeActionParameters(string a, string b, DateTime c, OtherEnum d,
string e, string f)
{
this.A = a;
this.B = b;
// ... tears erased the text here
}
}
আপনি দেখতে পাচ্ছেন যে আমি আসলে আমার মূল সমস্যাটি আবার তৈরি করেছি: অনেকগুলি পরামিতি। এটা সুস্পষ্ট যে এটি যাওয়ার উপায় নয়। আমি কি করতে পারি? এইরকম অপরিবর্তনীয়তা অর্জনের শেষ বিকল্পটি হ'ল "পঠনযোগ্য" কাঠামোটি এভাবে ব্যবহার করা:
public struct DoSomeActionParameters
{
public readonly string A;
public readonly string B;
public readonly DateTime C;
public readonly OtherEnum D;
public readonly string E;
public readonly string F;
}
এটি আমাদের অনেক বেশি পরামিতি সহ নির্মাণকারীদের এড়াতে এবং অপরিবর্তনীয়তা অর্জন করতে দেয়। আসলে এটি সমস্ত সমস্যার সমাধান করে (প্যারামিটার ক্রম ইত্যাদি)। এখনো:
- সকলেই (এফএক্সকপ এবং জন স্কিটি সহ) সম্মত হন যে সার্বজনীন ক্ষেত্রগুলি প্রকাশ করা খারাপ ।
- এরিক Lippert এট বলতে হয় মিথ্যা অপরিবর্তনীয়তা জন্য কেবলমাত্র ক্ষেত্র উপর নির্ভর ।
আমি তখনই বিভ্রান্ত হয়ে পড়েছিলাম এবং এই প্রশ্নটি লেখার সিদ্ধান্ত নিয়েছি: "# অনেকগুলি পরামিতি" সমস্যা এড়াতে সি # এর সবচেয়ে সোজা উপায় কী? সেই উদ্দেশ্যে কী কেবল পঠনযোগ্য কাঠামো ব্যবহার করা সম্ভব এবং তবুও কোনও খারাপ এপিআই নকশা নেই?
ব্যাখ্যা:
- অনুগ্রহ করে একক দায়িত্বের নীতি লঙ্ঘন নেই অনুমান। আমার আসল ক্ষেত্রে ফাংশনটি কেবল একটি একক ডিবি রেকর্ডে প্রদত্ত প্যারামিটারগুলি লিখে দেয়।
- আমি প্রদত্ত ফাংশনটির সুনির্দিষ্ট সমাধান চাইছি না। আমি এ জাতীয় সমস্যার জন্য সাধারণীকরণের পদ্ধতি চাইছি। আমি পরিবর্তনের পরিবর্তন বা কোনও ভয়ানক নকশা প্রবর্তন না করেই "খুব বেশি পরামিতি" সমস্যা সমাধানে আগ্রহী।
হালনাগাদ
এখানে প্রদত্ত উত্তরের বিভিন্ন সুবিধা / অসুবিধা রয়েছে। সুতরাং আমি এটি একটি সম্প্রদায় উইকিতে রূপান্তর করতে চাই। আমি মনে করি কোড নমুনা এবং পেশাদার / কনস সহ প্রতিটি উত্তর ভবিষ্যতে অনুরূপ সমস্যার জন্য একটি ভাল গাইড তৈরি করবে। আমি এখন এটি কীভাবে করব তা জানার চেষ্টা করছি।
DoSomeActionParameters
একটি নিক্ষেপযোগ্য বস্তু, যা পদ্ধতি কলের পরে বাতিল করা হবে।