আমি ওপেন-ক্লোজড প্রিন্সিপাল (ওসিপি) বনাম লিসকোভের সাবস্টিটিউশন নীতি (এলএসপি) -এর আগে একটি উত্তর লিখেছিলাম এবং সেগুলি উভয়ই নীতি একে অপরের সাথে অনেকটা সম্পর্কিত, তবে এখনও একে অপরের সাথে না থাকার কয়েকটি স্বীকৃত উদাহরণের সাথে ধারণাগতভাবে পৃথক। এই উত্তরের কারণে আমি কেবলমাত্র ওসিপির সাথে সংক্ষিপ্তভাবে স্পর্শ করব এবং ডিআইপি আরও গভীরভাবে বাস করব এবং কী এই টিকটি তোলে।
প্রথমে বিভিন্ন নীতিগুলি প্রথমে ব্যাখ্যা করে ওসিপি নির্ভরতা ইনভার্সন প্রিন্সিপাল (ডিআইপি) এর সাথে কীভাবে সম্পর্কিত এবং আলাদা হয় তা নিয়ে আলোচনা করার চেষ্টা করুন।
নির্ভরতা বিপরীতমুখী মূলনীতি
আঙ্কেল ববসের ওওডের নীতিগুলি পড়া আপনি দেখতে পাবেন যে ডিআইপি নীচে লিখেছেন:
সংক্ষেপে নয়, বিমূর্তির উপর নির্ভরশীল।
জাভাতে একটি বিমূর্ততা সহজেই interface
এবং abstract
কীওয়ার্ডগুলির সাথে অর্জন করা হয় , যার অর্থ কোডটি অনুসরণ করতে হবে এমন কোনও সফ্টওয়্যার সত্তার জন্য আপনার "চুক্তি" রয়েছে। কিছু প্রোগ্রামিং ল্যাঙ্গুয়েজে কোডটি অনুসরণ করার জন্য স্পষ্টভাবে আচরণ সেট করার কোনও সুবিধা নেই যাতে বিমূর্তিগুলি চুক্তিটি কার্যকর করতে সহায়তা করার পরিবর্তে সংকলকটি রাখার পরিবর্তে আরও ম্যানুয়াল ফ্যাশন অনুসরণ করতে হয়। উদাহরণস্বরূপ, সি ++ তে আপনার ভার্চুয়াল পদ্ধতিগুলির ক্লাস এবং জাভাস্ক্রিপ্টের মতো গতিশীল প্রোগ্রামিং ল্যাঙ্গুয়েজগুলি আপনাকে একইভাবে অবজেক্ট ব্যবহার করার বিষয়টি নিশ্চিত করতে হবে (যদিও জাভাস্ক্রিপ্টের ক্ষেত্রে এটি টাইপস্ক্রিপ্টে প্রসারিত করা হয়েছে যা আপনাকে সহায়তা করার জন্য টাইপ সিস্টেম যুক্ত করেছে) সংকলক দ্বারা যাচাই করা লেখার চুক্তি সহ)।
নামটিতে "বিপর্যয়" শব্দটি অন্তর্ভুক্ত করা হয়েছে কারণ traditionতিহ্যগতভাবে (প্রোগ্রামিংয়ের পুরানো অন্ধকার যুগে আপনি জানেন) আপনি এমন সফ্টওয়্যার স্ট্রাকচার লিখেছেন যা নিম্ন স্তরের মডিউলগুলির উপর নির্ভর করে উচ্চ স্তরের মডিউল ছিল। উদাহরণস্বরূপ, এটি এবং এর ButtonAtKitchen
জন্য পরিচালনা করার ইনপুটগুলি বোঝা যায় । দুর্ভাগ্যক্রমে এটি সফ্টওয়্যারটি তৈরি করার চেয়ে অনেক বেশি নির্দিষ্ট করে তোলে এবং অবজেক্ট গ্রাফটি এর মতো দেখায়:KitchenLamp1
KitchenLamp2
সুতরাং যখন আপনি "চুক্তিগুলি" যুক্ত করে সফ্টওয়্যারটিকে আরও সাধারণ করেন। লক্ষ্য করুন যে কীভাবে বস্তুর গ্রাফের তীরগুলি দিকটি "বিপরীত" করে। রান্নাঘরের বাতিগুলি এখন ক এর উপর নির্ভরশীল Button
। অন্য কথায় বিশদগুলি এখন অন্য উপায়গুলির পরিবর্তে বিমূর্তির উপর নির্ভরশীল।
এইভাবে আমাদের ডিআইপি-র আরও সাধারণ সংজ্ঞা রয়েছে, আঙ্কেল বব দ্বারা ডিআইপি- র মূল নিবন্ধেও বিস্তারিত ।
উ: উচ্চ স্তরের মডিউলগুলি নিম্ন স্তরের মডিউলগুলির উপর নির্ভর করবে না। উভয় বিমূর্ত উপর নির্ভর করা উচিত। খ। বিমূর্ততা বিশদ উপর নির্ভর করবে না। বিবরণ বিমূর্ততা উপর নির্ভর করা উচিত।
খোলা-বন্ধ নীতি
চাচা বব এর নীতিগুলি থেকে অব্যাহত আপনি দেখতে পাবেন যে ওসিপি নীচে লিখেছেন:
আপনার কোনও শ্রেণিবিস্তার আচরণটি পরিবর্তন না করে প্রসারিত করতে সক্ষম হওয়া উচিত।
এটি অর্জনের একটি উদাহরণ কৌশল প্যাটার্নটি নিয়োগ করা যেখানে কোনও Context
শ্রেণি পরিবর্তনের জন্য বন্ধ থাকে (যেমন আপনি এটির অভ্যন্তরীণ কোডটি একেবারেই পরিবর্তন করতে পারবেন না) তবে এটি নির্ভরশীলতার সহযোগিতায় (যেমন কৌশল শ্রেণীর) মাধ্যমে সম্প্রসারণের জন্যও উন্মুক্ত ।
আরও সাধারণ অর্থে যে কোনও মডিউলটি তার এক্সটেনশন পয়েন্টগুলির মাধ্যমে এক্সটেনসিবল হতে নির্মিত।
ওসিপি ডিআইপি এর মতো, তাই না?
না , আসলেই না।
যদিও তারা উভয় বিমূর্ততা নিয়ে আলোচনা করছে তারা ধারণাগতভাবে পৃথক। উভয় নীতিই বিভিন্ন প্রসঙ্গে, একটি নির্দিষ্ট মডিউলের ওসিপি এবং কয়েকটি মডিউলটিতে ডিআইপি খুঁজছেন। আপনি বেশিরভাগ গ্যাং অফ ফোর ডিজাইনের ধরণগুলির সাথে একইসাথে উভয় অর্জন করতে পারেন তবে আপনি এখনও পথ থেকে দূরে সরে যেতে পারেন।
উপরে উল্লিখিত ডিআইপি উদাহরণে, বোতাম এবং রান্নাঘরের প্রদীপগুলির সাহায্যে রান্নাঘরের কোনও প্রদীপই এক্সটেনসিবল হয় না (বা বর্তমানে তাদের প্রয়োজন হওয়া ব্যাখ্যা করার কোনও প্রয়োজন নেই)। ডিজাইনটি ওসিপি ভঙ্গ করছে তবে ডিআইপি অনুসরণ করে ।
বিপরীত (এবং স্বীকৃত) উদাহরণটি হবে রান্নাঘরের প্রদীপটি এক্সটেনসিবল (এক্সটেনশন পয়েন্টটি কিছুটা LampShade
হলেও) তবে বোতামটি এখনও প্রদীপের উপর নির্ভরশীল । এটি ডিআইপি ভঙ্গ করছে তবে ওসিপি অনুসরণ করে ।
চিন্তা করবেন না, এমন হয়
এটি আসলে এমন কিছু যা আপনি প্রায়শই প্রযোজনা কোডে ঘটতে দেখেন, এর কিছু অংশ একটি নীতি ভঙ্গ করতে পারে। বৃহত্তর সফ্টওয়্যার সিস্টেমে (উদাহরণস্বরূপ উপরের উদাহরণগুলির চেয়ে বড় কিছু) আপনি একটি নীতি ভঙ্গ করতে পারেন তবে অন্যটি সাধারণত রাখেন কারণ আপনার কোডটি সহজ রাখা দরকার। এটি মনে মনে, ছোট এবং স্ব-অন্তর্ভুক্ত মডিউলগুলির জন্য ঠিক আছে, কারণ তারা একক দায়িত্বের নীতি (এসআরপি) সম্পর্কিত প্রসঙ্গে।
একবার কিছু মডিউল জটিল হয়ে উঠলেও আপনার সম্ভবত সমস্ত নীতিগুলি মাথায় রেখে এটিকে দেখার প্রয়োজন এবং এটি কিছু সুপরিচিত প্যাটার্নে পুনরায় ডিজাইন বা রিফ্যাক্টর করতে হবে।