আমি মার্টিন ফোলারের রিফ্যাক্টরিং বইতে প্রচলিত কোডের গন্ধ সম্পর্কে পড়ছি । সেই প্রসঙ্গে, আমি একটি কোড বেসে যে প্যাটার্নটি দেখছি তা নিয়ে আমি ভাবছিলাম, এবং অন্যটি অবাস্তবভাবে এটিকে একটি অ্যান্টি-প্যাটার্ন হিসাবে বিবেচনা করতে পারে।
প্যাটার্নটি হ'ল এক যেখানে কোনও বস্তু এক বা একাধিক পদ্ধতির আর্গুমেন্ট হিসাবে প্রেরণ করা হয়, এর সবকটিই বস্তুর স্থিতি পরিবর্তন করে, তবে এর মধ্যে কোনওটিই বস্তুটিকে ফেরত দেয় না। সুতরাং এটি পাসের উপর নির্ভর করে (এই ক্ষেত্রে) সি # /। নেট এর রেফারেন্স প্রকৃতির দ্বারা।
var something = new Thing();
// ...
Foo(something);
int result = Bar(something, 42);
Baz(something);
আমি দেখতে পেয়েছি (বিশেষত যখন পদ্ধতিগুলির যথাযথ নামকরণ করা হয় না) অবজেক্টের অবস্থা পরিবর্তিত হয়েছে কিনা তা বোঝার জন্য আমাকে এই জাতীয় পদ্ধতিগুলি খতিয়ে দেখার দরকার। এটি কোড বোঝাটিকে আরও জটিল করে তোলে, যেহেতু আমার কল-স্ট্যাকের একাধিক স্তর ট্র্যাক করা দরকার।
আমি নতুন রাষ্ট্রের সাথে অন্য কোনও (ক্লোনড) অবজেক্ট, বা কল-সাইটটিতে অবজেক্টটি পরিবর্তন করার জন্য প্রয়োজনীয় যে কোনও কিছু ফেরত দেওয়ার জন্য এই জাতীয় কোডটি উন্নত করার প্রস্তাব দিতে চাই।
var something1 = new Thing();
// ...
// Let's return a new instance of Thing
var something2 = Foo(something1);
// Let's use out param to 'return' other info about the operation
int result;
var something3 = Bar(something2, out result);
// If necessary, let's capture and make explicit complex changes
var changes = Baz(something3)
something3.Apply(changes);
আমার কাছে মনে হয় অনুমানের উপর প্রথম প্যাটার্নটি বেছে নেওয়া হয়েছে
- এটি কম কাজ, বা কোডের কম লাইনের প্রয়োজন that
- এটি আমাদের উভয়কে অবজেক্টটি পরিবর্তন করতে এবং কিছু অন্যান্য তথ্য ফেরত দেওয়ার অনুমতি দেয়
- যেহেতু আমাদের কম উদাহরণ রয়েছে সেহেতু এটি আরও কার্যকর
Thing
।
আমি একটি বিকল্প চিত্রিত করেছি, তবে এটির প্রস্তাব দেওয়ার জন্য, আমাদের মূল সমাধানটির বিরুদ্ধে যুক্তি থাকা দরকার। আসল সমাধানটি একটি বিরোধী-নিদর্শন হিসাবে কেস তৈরি করতে যুক্তি দেওয়া যেতে পারে?
এবং আমার বিকল্প সমাধানে কোনটি যদি ভুল হয়?