এটি এখনও সেই ভাষা নকশাগুলির আর একটি বিষয় যা আপনি খনন শুরু না করা এবং আপনি বুঝতে না পারছেন যে এটি আসলে একটি খারাপ ধারণা।
এই মেলটিতে এই বিষয়ে অনেক কিছুই রয়েছে (এবং অন্যান্য বিষয়েও।) বেশ কয়েকটি ডিজাইন ফোর্স ছিল যা আমাদের বর্তমান নকশায় নিয়ে এসেছিল:
- উত্তরাধিকারের মডেলটি সহজ রাখার ইচ্ছা;
- সত্য যে একবার আপনি স্পষ্ট উদাহরণগুলি (যেমন,
AbstractList
একটি ইন্টারফেসে রূপান্তরিত ) অতীতের দিকে তাকান , আপনি বুঝতে পারবেন যে উত্তরাধিকার সমান / হ্যাশকোড / টুস্ট্রিং একক উত্তরাধিকার এবং রাষ্ট্রের সাথে দৃ strongly়ভাবে আবদ্ধ এবং ইন্টারফেসগুলি বহুগুণ উত্তরাধিকারসূত্রে এবং রাষ্ট্রহীন;
- এটি সম্ভবত কিছু আশ্চর্যজনক আচরণের দরজা খুলে দিয়েছে।
আপনি ইতিমধ্যে "এটিকে সহজ রাখুন" লক্ষ্যটি স্পর্শ করেছেন; উত্তরাধিকার এবং দ্বন্দ্ব-সমাধানের নিয়মগুলি খুব সাধারণ হিসাবে ডিজাইন করা হয়েছে (ক্লাসগুলি ইন্টারফেসের উপর জয়লাভ করে, উত্পন্ন ইন্টারফেসগুলি সুপারিনটারফেসে জয়ী করে এবং অন্য যে কোনও দ্বন্দ্ব বাস্তবায়নকারী শ্রেণীর দ্বারা সমাধান করা হয়)) অবশ্যই এই নিয়মগুলি একটি ব্যতিক্রম করার জন্য টুইট করা যেতে পারে, তবে আমি মনে করি আপনি যখন এই স্ট্রিংটিতে টানা শুরু করবেন তখন আপনি খুঁজে পাবেন যে বর্ধমান জটিলতা আপনার মনে হয় তত ছোট নয়।
অবশ্যই, কিছু সুবিধা রয়েছে যা আরও জটিলতার ন্যায্যতা জানায়, তবে এই ক্ষেত্রে এটি সেখানে নেই। আমরা এখানে যে পদ্ধতিগুলির কথা বলছি তা হ'ল সমান, হ্যাশকোড এবং টোস্ট্রিং। এই পদ্ধতিগুলি সমস্ত বিষয়বস্তুর রাষ্ট্র সম্পর্কে অন্তর্নিহিত, এবং এই শ্রেণীরই রাষ্ট্রের মালিকানা রয়েছে, ইন্টারফেস নয়, যারা এই শ্রেণীর জন্য সাম্যতা কী বোঝায় তা নির্ধারণ করার জন্য সর্বোত্তম অবস্থানে রয়েছে (বিশেষত সমতার চুক্তিটি বেশ শক্তিশালী; কার্যকর দেখুন) কিছু আশ্চর্যজনক পরিণতির জন্য জাভা); ইন্টারফেস লেখকরা খুব দূরে সরানো হয়েছে।
AbstractList
উদাহরণটি বের করা সহজ ; এটি সুন্দর হবে যদি আমরা AbstractList
আচরণ থেকে মুক্তি পেয়ে List
ইন্টারফেসে রাখতে পারি। তবে একবার আপনি এই সুস্পষ্ট উদাহরণের বাইরে চলে গেলে আর অনেক ভাল উদাহরণ পাওয়া যায় না। মূলটি, AbstractList
একক উত্তরাধিকারের জন্য ডিজাইন করা হয়েছে। তবে ইন্টারফেসগুলি একাধিক উত্তরাধিকারের জন্য ডিজাইন করা আবশ্যক।
আরও, আপনি এই ক্লাসটি লিখছেন তা কল্পনা করুন:
class Foo implements com.libraryA.Bar, com.libraryB.Moo {
// Implementation of Foo, that does NOT override equals
}
Foo
Supertypes এ লেখক সৌন্দর্য, সমান কোন বাস্তবায়ন দেখেন, এবং যে রেফারেন্স সমতা পেতে উপসংহারে, সমস্ত তিনি প্রয়োজন থেকে উত্তরাধিকারী সমান হয় Object
। তারপরে, পরের সপ্তাহে, বারের জন্য লাইব্রেরি রক্ষণাবেক্ষণকারী "সহায়কভাবে" একটি ডিফল্ট equals
বাস্তবায়ন যুক্ত করে। ওপস! এখন এর অর্থশাস্ত্রগুলি Foo
অন্য একটি রক্ষণাবেক্ষণ ডোমেনের "ইন্টারফেসলি" একটি সাধারণ পদ্ধতির জন্য একটি ডিফল্ট যোগ করে একটি ইন্টারফেস দ্বারা ভেঙে গেছে।
ডিফল্টকে ডিফল্ট বলে মনে করা হয়। কোনও ইন্টারফেসে ডিফল্ট যুক্ত করা যেখানে কোনও ছিল না (শ্রেণিবদ্ধের কোথাও) কংক্রিট বাস্তবায়নকারী ক্লাসগুলির শব্দার্থকে প্রভাবিত করবে না। তবে ডিফল্টরা যদি অবজেক্ট পদ্ধতিগুলিকে "ওভাররাইড" করতে পারে তবে এটি সত্য হবে না।
সুতরাং, যদিও এটি একটি নিরীহ বৈশিষ্ট্যটির মতো বলে মনে হচ্ছে, এটি আসলে বেশ ক্ষতিকারক: এটি সামান্য বর্ধনশীল অভিব্যক্তির জন্য অনেক জটিলতা যুক্ত করেছে এবং এটি স্বতন্ত্রভাবে, নিরীহ-চেহারা পরিবর্তনকে পৃথকভাবে সংকলিত ইন্টারফেসগুলিকে হ্রাস করার পক্ষে অনেক সহজ করে তুলেছে ক্লাস বাস্তবায়নের উদ্দেশ্যসত্তা।