বর্তমানের উভয় উত্তরই কেবল আংশিকভাবে চিহ্নটিকে আঘাত করেছে বলে মনে হয় এবং তারা মূল ধারণাকে মেঘ আপ করার উদাহরণগুলিতে মনোনিবেশ করে। এটি (সম্পূর্ণরূপে) কোনও ওওপি নীতিও নয় তবে সাধারণভাবে একটি সফ্টওয়্যার ডিজাইনের নীতি।
এই বাক্যটিতে যে জিনিসটি "পরিবর্তিত" হয় তা হ'ল কোড। ক্রিস্টোফ এই কথাটি বলতে চাইছেন যে এটি সাধারণত এমন কিছু যা পরিবর্তিত হতে পারে, আপনি এটি প্রায়শই অনুমান করেন । লক্ষ্যটি কোডের ভবিষ্যতের পরিবর্তনগুলি থেকে নিজেকে রক্ষা করা। এটি ইন্টারফেসের বিরুদ্ধে প্রোগ্রামিংয়ের সাথে ঘনিষ্ঠভাবে সম্পর্কিত । যাইহোক, ক্রিস্টোফ এটি "প্রয়োগের বিশদগুলিতে" সীমাবদ্ধ করতে ভুল। আসলে, এই পরামর্শটির মান প্রায়শই প্রয়োজনীয় পরিবর্তনের কারণে হয় ।
এটি কেবল পরোক্ষভাবে encapsulating রাজ্যের সাথে সম্পর্কিত, যা আমি বিশ্বাস করি ডেভিড আরনো ভাবছেন। এই পরামর্শটি সর্বদা (তবে প্রায়শই হয়) এনক্যাপসুলেটিং স্থিতির পরামর্শ দেয় না এবং এই পরামর্শটিও পরিবর্তনযোগ্য বস্তুর ক্ষেত্রে প্রযোজ্য। প্রকৃতপক্ষে, কেবলমাত্র ধ্রুবকগুলির নামকরণ হ'ল পরিবর্তিত হয়ে যাওয়া এনপ্যাপুলেট করার একটি (খুব প্রাথমিক) ফর্ম।
ক্যানডিডআরেঞ্জ স্পষ্টভাবে "বিবরণ" সহ "কী পরিবর্তিত হয়" তা কনফ্লেট করে। এটি কেবল আংশিকভাবে সঠিক। আমি সম্মত হই যে যে কোনও কোডের পরিবর্তিত হয় কোনও অর্থে "বিশদ", তবে "বিশদ" আলাদা নাও হতে পারে (আপনি যদি এই টোটোলজিকাল করতে "বিশদ" সংজ্ঞায়িত না করেন)। বিভিন্ন-বিবিধ বিশদটি অবিচ্ছিন্ন করার কারণ থাকতে পারে, তবে এই আদেশটি এক নয়। মোটামুটি কথা বলতে গেলে, যদি আপনি অত্যন্ত আত্মবিশ্বাসী হন যে "কুকুর", "বিড়াল" এবং "হাঁস" হ'ল একমাত্র প্রকারের সাথে আপনি মোকাবেলা করতে চান তবে এই ডিকমটি রিফেক্টরিং ক্যান্ডিডআরঞ্জ সম্পাদনের পরামর্শ দেয় না।
ক্যান্ডিডেঞ্জের উদাহরণটিকে ভিন্ন প্রসঙ্গে কাস্ট করা, ধরে নিন আমাদের সি এর মতো একটি পদ্ধতিগত ভাষা আছে যদি আমার কাছে এমন কিছু কোড থাকে যা:
if (pet.type() == dog) {
pet.bark();
} else if (pet.type() == cat) {
pet.meow();
} else if (pet.type() == duck) {
pet.quack()
}
আমি যুক্তিযুক্তভাবে আশা করতে পারি যে এই কোডের টুকরটি ভবিষ্যতে পরিবর্তিত হবে। আমি কেবল একটি নতুন পদ্ধতি সংজ্ঞায়িত করে এটি "encapsulate" করতে পারি:
void speak(pet) {
if (pet.type() == dog) {
pet.bark();
} else if (pet.type() == cat) {
pet.meow();
} else if (pet.type() == duck) {
pet.quack()
}
}
এবং কোডের ব্লকের পরিবর্তে এই নতুন পদ্ধতিটি ব্যবহার করা (অর্থাত্ একটি "এক্সট্র্যাক্ট পদ্ধতি" রিফ্যাক্টরিং)। এই মুহুর্তে একটি "গরু" টাইপ যুক্ত করুন বা যা কেবলমাত্র speak
প্রক্রিয়াটি আপডেট করার প্রয়োজন । অবশ্যই, ওও ভাষায় আপনি ক্যান্ডিডআরঞ্জের উত্তর অনুসারে ডায়নামিক প্রেরণের পরিবর্তে গতিশীল পাঠাতে পারেন le এই স্বাভাবিকভাবেই ঘটতে আপনি অ্যাক্সেস যদি হবে pet
একটি ইন্টারফেসের মাধ্যমে। গতিশীল প্রেরণের মাধ্যমে শর্তসাপেক্ষ যুক্তি নির্মূল করা একটি অস্থিগত উদ্বেগ যা আমি এই পদ্ধতিগত উপস্থাপনাটি কেন করেছি তারই একটি অংশ। আমি এটিও জোর দিয়ে বলতে চাই যে এটির জন্য ওওপি-র নির্দিষ্ট বৈশিষ্ট্যের প্রয়োজন নেই। এমনকি একটি ওও ভাষায়, কী পরিবর্তিত হয় তা এনক্যাপসুলেট করার অর্থ কোনও নতুন শ্রেণি বা ইন্টারফেস তৈরি করা প্রয়োজন হয় না।
আরও প্রত্নতাত্ত্বিক উদাহরণ হিসাবে (যা নিকটে তবে বেশ ওও নয়), বলুন আমরা একটি তালিকা থেকে সদৃশগুলি সরাতে চাই। ধরা যাক আমরা এটিকে অন্য তালিকায় এখনও অবধি দেখানো আইটেমগুলির তালিকাকে ধরে রেখে তালিকার উপরে পুনরাবৃত্তি করে এবং আমরা দেখেছি এমন কোনও আইটেম সরিয়ে এটি প্রয়োগ করেছি। এটি ধরে নেওয়া যুক্তিসঙ্গত যে আমরা কমপক্ষে পারফরম্যান্সের কারণে দেখা আইটেমগুলিতে আমরা কীভাবে নজর রাখি তা পরিবর্তন করতে চাই। যা পরিবর্তিত হয় তা এনক্যাপসুলেট করার ডিকোম থেকে বোঝা যায় যে দেখা আইটেমগুলির সেটটি উপস্থাপনের জন্য আমাদের একটি বিমূর্ত ডেটা টাইপ তৈরি করা উচিত। আমাদের অ্যালগরিদম এখন এই বিমূর্ত সেট ডেটা টাইপের বিপরীতে সংজ্ঞায়িত করা হয়েছে এবং আমরা যদি বাইনারি অনুসন্ধানের ট্রিতে স্যুইচ করার সিদ্ধান্ত নিই, আমাদের অ্যালগরিদম পরিবর্তন বা যত্নের প্রয়োজন নেই। ওও ভাষায়, আমরা এই বিমূর্ত ডেটা ক্যাপচারের জন্য কোনও শ্রেণি বা ইন্টারফেস ব্যবহার করতে পারি। এসএমএল / ও'র মতো ভাষায়
প্রয়োজনীয়তা-চালিত উদাহরণের জন্য বলুন যে আপনাকে কিছু ব্যবসায়িক যুক্তির সাথে কিছু ক্ষেত্র বৈধ করতে হবে valid আপনার এখন নির্দিষ্ট প্রয়োজনীয়তা থাকতে পারে তবে আপনি দৃ strongly়ভাবে সন্দেহ করেন যে সেগুলি বিকশিত হবে। আপনি বর্তমান যুক্তিটিকে তার নিজস্ব পদ্ধতি / ফাংশন / নিয়ম / শ্রেণিতে আবদ্ধ করতে পারেন।
যদিও এটি একটি অরথোগোনাল উদ্বেগ যা "কী কী পরিবর্তিত হয়" এর অংশ নয়, এটি প্রায়শই বিমূর্তভাবে বিসর্জন দেওয়া স্বাভাবিক, এটি এখন এনক্যাপসুলেটেড যুক্তি দ্বারা প্যারামিটারাইজ করা। এটি সাধারণত আরও নমনীয় কোডের দিকে নিয়ে যায় এবং এনক্যাপসুলেটেড লজিক পরিবর্তনের পরিবর্তে বিকল্প বাস্তবায়নের পরিবর্তে যুক্তিকে পরিবর্তিত হতে দেয়।