যাক, উদাহরণস্বরূপ, আপনার কাছে একটি অ্যাপ্লিকেশন রয়েছে যা একটি বিস্তৃত অংশীদারি শ্রেণীর সাথে ডাকা হয় User। এই শ্রেণিটি ব্যবহারকারী, তাদের আইডি, নাম, প্রতিটি মডিউল অ্যাক্সেসের স্তর, টাইমজোন ইত্যাদি সম্পর্কিত সমস্ত তথ্য প্রকাশ করে
ব্যবহারকারীর ডেটাগুলি পুরো সিস্টেম জুড়ে স্পষ্টতই রেফারেন্স করা হয়, তবে যে কোনও কারণেই সিস্টেমটি সেট আপ করা হয়েছে যাতে এটির উপর নির্ভর করে শ্রেণীর মধ্যে এই ব্যবহারকারীর অ্যাক্সেসের পরিবর্তে, আমরা কেবল এটি থেকে পৃথক বৈশিষ্ট্যে চলে যাচ্ছি।
যে ক্লাসটির জন্য ব্যবহারকারী আইডি প্রয়োজন, কেবলমাত্র userIdপ্যারামিটার হিসাবে জিইউডি প্রয়োজন , কখনও কখনও আমাদের ব্যবহারকারীর নামও প্রয়োজন হতে পারে, যাতে এটি পৃথক প্যারামিটার হিসাবে পাস করা হয়। কিছু ক্ষেত্রে, এটি পৃথক পদ্ধতিতে পাস করা হয়, সুতরাং মানগুলি শ্রেণি পর্যায়ে মোটেই অনুষ্ঠিত হয় না।
প্রত্যেকবার যখনই আমি ব্যবহারকারী শ্রেণীর কাছ থেকে বিভিন্ন ধরণের তথ্যে অ্যাক্সেসের দরকার পড়ে তখন আমাকে পরামিতি যুক্ত করে পরিবর্তন করতে হবে এবং যেখানে নতুন ওভারলোড যুক্ত করা উপযুক্ত নয়, সেখানে আমাকে পদ্ধতি বা শ্রেণি নির্মাতার প্রতিটি রেফারেন্সও পরিবর্তন করতে হবে।
ব্যবহারকারী কেবল একটি উদাহরণ। এটি আমাদের কোডে ব্যাপকভাবে অনুশীলিত হয়।
আমি কি ভেবে ভেবে ঠিক বলছি যে এটি উন্মুক্ত / বন্ধ নীতি লঙ্ঘন? কেবল বিদ্যমান ক্লাসগুলি পরিবর্তনের কাজ নয়, তাদেরকে প্রথম স্থানে স্থাপন করা যাতে ভবিষ্যতে ব্যাপক পরিবর্তনগুলির খুব সম্ভবত প্রয়োজন হয়?
আমরা যদি কেবলমাত্র Userঅবজেক্টে পাস করি তবে আমি যে ক্লাসের সাথে কাজ করছি তার মধ্যে আমি একটি ছোট পরিবর্তন আনতে পারি। যদি আমাকে কোনও প্যারামিটার যোগ করতে হয় তবে ক্লাসের রেফারেন্সে আমাকে কয়েক ডজন পরিবর্তন করতে হতে পারে।
এই অনুশীলন দ্বারা অন্য কোন নীতি ভেঙে দেওয়া হয়? নির্ভরতা বিপর্যয় সম্ভবত? যদিও আমরা কোনও বিমূর্তিটি উল্লেখ করছি না, কেবলমাত্র এক ধরণের ব্যবহারকারীর রয়েছে, তাই ব্যবহারকারীর ইন্টারফেসের কোনও আসল প্রয়োজন নেই।
বেসিক ডিফেন্সিভ প্রোগ্রামিং নীতিগুলির মতো কি অন্যান্য, নন-সলিড নীতিগুলি লঙ্ঘিত হচ্ছে?
আমার নির্মাতাকে এইরকম দেখতে হবে:
MyConstructor(GUID userid, String username)
অথবা এটা:
MyConstructor(User theUser)
পোস্ট সম্পাদনা:
পরামর্শ দেওয়া হয়েছে যে "পাস আইডি বা অবজেক্ট?" এ প্রশ্নের উত্তর দেওয়া হয়েছে। এটি যেভাবেই কোনও সিদ্ধান্ত নেওয়ার সিদ্ধান্তটি সলিড নীতিগুলি অনুসরণ করার প্রয়াসকে প্রভাবিত করে, এই প্রশ্নের উত্তর দেয় না, যা এই প্রশ্নের মূলে রয়েছে।
Iমধ্যে SOLID? MyConstructorমূলত এখন বলে "আমার দরকার একটি Guidএবং একটি string"। সুতরাং কেন একটি ইন্টারফেস একটি Guidএবং একটি সরবরাহ করে না string, Userসেই ইন্টারফেসটি MyConstructorবাস্তবায়ন করে সেই ইন্টারফেসটি বাস্তবায়নের কোনও উদাহরণের উপর নির্ভর করে? এবং যদি MyConstructorপরিবর্তনের প্রয়োজন হয় তবে ইন্টারফেসটি পরিবর্তন করুন। - এটি সরবরাহকারীর পরিবর্তে গ্রাহকের সাথে "সম্পর্কিত" ইন্টারফেসের কথা চিন্তা করতে আমাকে ব্যাপকভাবে সহায়তা করেছে । সুতরাং ভাবেন " ভোক্তা হিসাবে আমার এমন কিছু প্রয়োজন যা এটি করে এবং সরবরাহকারী হিসাবে" পরিবর্তে " আমি এটি করতে পারি এবং এটি"।