Dependency inversion principle
অবজেক্ট-ওরিয়েন্টেড ডিজাইনে, ডিপেন্ডেন্সি ইনভার্সন নীতি হল আলগাভাবে সংযুক্ত সফ্টওয়্যার মডিউলগুলির জন্য একটি নির্দিষ্ট পদ্ধতি। এই নীতি অনুসরণ করার সময়, উচ্চ-স্তরের, নীতি নির্ধারণকারী মডিউল থেকে নিম্ন-স্তরের, নির্ভরতা মডিউল পর্যন্ত প্রতিষ্ঠিত প্রচলিত নির্ভরতা সম্পর্কগুলি বিপরীত হয়, এইভাবে নিম্ন-স্তরের মডিউল বাস্তবায়নের বিবরণ থেকে স্বাধীন উচ্চ-স্তরের মডিউলগুলি প্রদান করে। নীতিটি বলেঃ উচ্চ-স্তরের এবং নিম্ন-স্তরের বস্তুগুলিকে অবশ্যই একই বিমূর্ততার উপর নির্ভর করতে হবে, এই নকশা নীতিটি কিছু লোক যেভাবে অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং সম্পর্কে ভাবতে পারে। এই নীতির এ এবং বি পয়েন্টের পিছনে ধারণাটি হল যে একটি উচ্চ-স্তরের মডিউল এবং একটি নিম্ন-স্তরের মডিউলের মধ্যে মিথস্ক্রিয়া নকশা করার সময়, মিথস্ক্রিয়াকে তাদের মধ্যে একটি বিমূর্ত মিথস্ক্রিয়া হিসাবে বিবেচনা করা উচিত। এটি কেবল উচ্চ-স্তরের মডিউলের নকশাতেই নয়, নিম্ন-স্তরের মডিউলের উপরও প্রভাব ফেলেঃ নিম্ন-স্তরেরটি পারস্পরিক মিথস্ক্রিয়ার কথা মাথায় রেখে ডিজাইন করা উচিত এবং এর ব্যবহারের ইন্টারফেস পরিবর্তন করা প্রয়োজন হতে পারে। অনেক ক্ষেত্রে, মিথস্ক্রিয়াকে একটি বিমূর্ত ধারণা হিসাবে বিবেচনা করলে অতিরিক্ত কোডিং প্যাটার্ন প্রবর্তন না করে উপাদানগুলির সংযোগ হ্রাস করা যায়, যা শুধুমাত্র একটি হালকা এবং কম বাস্তবায়ন-নির্ভর মিথস্ক্রিয়া পরিকল্পনার অনুমতি দেয়। যখন দুটি মডিউলের মধ্যে আবিষ্কৃত বিমূর্ত মিথস্ক্রিয়া স্কিমা (গুলি) সাধারণ এবং সাধারণীকরণ বোধগম্য হয়, তখন এই নকশা নীতিটি নিম্নলিখিত নির্ভরতা বিপরীত কোডিং প্যাটার্নের দিকেও পরিচালিত করে। প্রচলিত স্তরের প্যাটার্ন প্রচলিত অ্যাপ্লিকেশন আর্কিটেকচারে, নিম্ন-স্তরের উপাদানগুলি (যেমন, ইউটিলিটি লেয়ার) উচ্চ-স্তরের উপাদানগুলি (যেমন, পলিসি লেয়ার) দ্বারা ব্যবহার করার জন্য ডিজাইন করা হয়েছে যা ক্রমবর্ধমান জটিল সিস্টেমগুলি তৈরি করতে সক্ষম করে। এই গঠনে, উচ্চ-স্তরের উপাদানগুলি কিছু কাজ অর্জনের জন্য সরাসরি নিম্ন-স্তরের উপাদানগুলির উপর নির্ভর করে। নিম্ন-স্তরের উপাদানগুলির উপর এই নির্ভরতা উচ্চ-স্তরের উপাদানগুলির পুনঃব্যবহারের সুযোগকে সীমাবদ্ধ করে। নির্ভরতা বিপরীতমুখী প্যাটার্নের লক্ষ্য হল একটি বিমূর্ত স্তরের মধ্যস্থতার সাথে এই উচ্চ সংযুক্ত বিতরণ এড়ানো এবং উচ্চতর/নীতি স্তরগুলির পুনঃব্যবহারযোগ্যতা বৃদ্ধি করা। নির্ভরশীলতা বিপরীতমুখী প্যাটার্ন একটি বিমূর্ত স্তর যোগ করার সাথে সাথে, উচ্চ এবং নিম্ন স্তর উভয়ই উপর থেকে নীচে ঐতিহ্যবাহী নির্ভরতা হ্রাস করে। তা সত্ত্বেও, "বিপরীতমুখী" ধারণার অর্থ এই নয় যে নিম্ন-স্তরের স্তরগুলি সরাসরি উচ্চ-স্তরের স্তরগুলির উপর নির্ভর করে। উভয় স্তরই বিমূর্তকরণের (ইন্টারফেস) উপর নির্ভর করা উচিত যা উচ্চ-স্তর স্তরগুলির দ্বারা প্রয়োজনীয় আচরণ প্রকাশ করে। নির্ভরতা বিপরীতকরণের সরাসরি প্রয়োগে, বিমূর্তগুলি উপরের/নীতি স্তরগুলির মালিকানাধীন। এই স্থাপত্যটি উচ্চতর/নীতি উপাদান এবং বিমূর্ত বিষয়গুলিকে গোষ্ঠীভুক্ত করে যা একই প্যাকেজে নিম্ন পরিষেবাগুলিকে সংজ্ঞায়িত করে। নিম্ন-স্তরের স্তরগুলি উত্তরাধিকার/এই বিমূর্ত শ্রেণী বা ইন্টারফেসের বাস্তবায়নের মাধ্যমে তৈরি করা হয়। নির্ভরশীলতা এবং মালিকানার বিপরীতকরণ উচ্চতর/নীতি স্তরগুলির পুনঃব্যবহারযোগ্যতাকে উৎসাহিত করে। উপরের স্তরগুলি নিম্ন পরিষেবাগুলির অন্যান্য বাস্তবায়ন ব্যবহার করতে পারে। যখন নিম্ন-স্তরের উপাদানগুলি বন্ধ থাকে বা যখন অ্যাপ্লিকেশনটির বিদ্যমান পরিষেবাগুলির পুনঃব্যবহারের প্রয়োজন হয়, তখন একটি অ্যাডাপ্টার পরিষেবাগুলি এবং বিমূর্ততার মধ্যে মধ্যস্থতা করে। নির্ভরতা বিপরীতমুখী প্যাটার্ন সাধারণীকরণ অনেক প্রকল্পে নির্ভরতা বিপরীতমুখী নীতি এবং প্যাটার্নকে একটি একক ধারণা হিসাবে বিবেচনা করা হয় যা সাধারণীকরণ করা উচিত, অর্থাৎ সফ্টওয়্যার মডিউলগুলির মধ্যে সমস্ত ইন্টারফেসে প্রয়োগ করা উচিত। এর জন্য কমপক্ষে দুটি কারণ রয়েছেঃ একটি ভাল চিন্তাভাবনার নীতিকে কোডিং প্যাটার্ন হিসাবে দেখা সহজ। একবার একটি বিমূর্ত ক্লাস বা একটি ইন্টারফেস কোড করা হয়ে গেলে, প্রোগ্রামার বলতে পারেনঃ "আমি বিমূর্ততার কাজটি করেছি"। যেহেতু অনেক একক পরীক্ষার সরঞ্জাম উপহাস সম্পন্ন করার জন্য উত্তরাধিকারের উপর নির্ভর করে, তাই শ্রেণীর মধ্যে জেনেরিক ইন্টারফেসের ব্যবহার (কেবলমাত্র মডিউলগুলির মধ্যে নয় যখন সাধারণতা ব্যবহার করা যুক্তিযুক্ত হয়) নিয়ম হয়ে ওঠে। যদি ব্যবহৃত উপহাসের সরঞ্জামটি শুধুমাত্র উত্তরাধিকারের উপর নির্ভর করে, তবে নির্ভরতা বিপরীত প্যাটার্নটি ব্যাপকভাবে প্রয়োগ করা প্রয়োজন হতে পারে। এর প্রধান ত্রুটিগুলি রয়েছেঃ কেবল একটি শ্রেণীর উপর একটি ইন্টারফেস প্রয়োগ করা কাপলিং হ্রাস করার জন্য যথেষ্ট নয়; শুধুমাত্র মিথস্ক্রিয়ার সম্ভাব্য বিমূর্ততা সম্পর্কে চিন্তা করা কম কাপল্ড ডিজাইনের দিকে নিয়ে যেতে পারে। একটি প্রকল্পের সর্বত্র জেনেরিক ইন্টারফেসগুলি বাস্তবায়ন করা বোঝা এবং রক্ষণাবেক্ষণ করা কঠিন করে তোলে। প্রতিটি পদক্ষেপে পাঠক নিজেকে জিজ্ঞাসা করবেন যে এই ইন্টারফেসের অন্যান্য বাস্তবায়নগুলি কী এবং প্রতিক্রিয়া সাধারণত হয়ঃ শুধুমাত্র উপহাস। ইন্টারফেস সাধারণীকরণের জন্য আরও প্লাম্বিং কোড প্রয়োজন, বিশেষত কারখানাগুলিতে যা সাধারণত একটি নির্ভরতা-ইনজেকশন কাঠামোর উপর নির্ভর করে। ইন্টারফেস সাধারণীকরণ প্রোগ্রামিং ভাষার ব্যবহারকেও সীমাবদ্ধ করে। সাধারণীকরণের সীমাবদ্ধতা নির্ভরতা বিপরীতমুখী প্যাটার্ন (ডিআইপি) সম্পন্ন করার জন্য ইন্টারফেসের উপস্থিতির একটি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামে অন্যান্য নকশার প্রভাব রয়েছেঃ একটি শ্রেণীর সমস্ত সদস্য ভেরিয়েবল অবশ্যই ইন্টারফেস বা বিমূর্ত হতে হবে। সমস্ত কংক্রিট শ্রেণীর প্যাকেজগুলি শুধুমাত্র ইন্টারফেস বা বিমূর্ত শ্রেণীর প্যাকেজগুলির মাধ্যমে সংযুক্ত হতে হবে। কোনও শ্রেণীই সুনির্দিষ্ট শ্রেণী থেকে উদ্ভূত হওয়া উচিত নয়। কোনও পদ্ধতিই বাস্তবায়িত পদ্ধতিকে অগ্রাহ্য করা উচিত নয়। সমস্ত পরিবর্তনশীল তাৎক্ষণিকতার জন্য ফ্যাক্টরি পদ্ধতি বা ফ্যাক্টরি প্যাটার্নের মতো একটি সৃজনশীল প্যাটার্নের বাস্তবায়ন বা নির্ভরতা-ইনজেকশন কাঠামোর ব্যবহার প্রয়োজন। উত্তরাধিকার-ভিত্তিক উপহাসের সরঞ্জামগুলি ব্যবহার করে ইন্টারফেস উপহাসের বিধিনিষেধগুলিও বিধিনিষেধ প্রবর্তন করেঃ স্থির বাহ্যিকভাবে দৃশ্যমান সদস্যদের পদ্ধতিগতভাবে নির্ভরতা ইনজেকশনের উপর নির্ভর করা উচিত যা তাদের বাস্তবায়ন করা অনেক কঠিন করে তোলে। সমস্ত পরীক্ষামূলক পদ্ধতি একটি ইন্টারফেস বাস্তবায়ন বা একটি বিমূর্ত সংজ্ঞার ওভাররাইড হওয়া উচিত। ভবিষ্যতের দিকনির্দেশনা নীতিগুলি হল চিন্তাভাবনার উপায়। প্যাটার্ন হল সমস্যা সমাধানের সাধারণ উপায়। প্রোগ্রামিং ভাষার অনুপস্থিত বৈশিষ্ট্যগুলির জন্য কোডিং প্যাটার্ন বিদ্যমান থাকতে পারে। প্রোগ্রামিং ভাষাগুলি কমপক্ষে দুটি দিকে শক্তিশালী এবং আরও সুনির্দিষ্ট ব্যবহারের চুক্তি কার্যকর করার অনুমতি দেওয়ার জন্য বিকশিত হতে থাকবেঃ ব্যবহারের শর্তগুলি (প্রাক, পরবর্তী এবং অপরিবর্তনীয় শর্ত) এবং রাষ্ট্র-ভিত্তিক ইন্টারফেসগুলি প্রয়োগ করা। এটি সম্ভবত অনেক পরিস্থিতিতে নির্ভরতা বিপরীতমুখী প্যাটার্নের একটি শক্তিশালী প্রয়োগকে উৎসাহিত করবে এবং সম্ভাব্যভাবে সহজতর করবে। স্ট্যাটিক এবং নন-ভার্চ্যুয়াল সদস্যদের প্রতিস্থাপনের সমস্যা সমাধানের জন্য এখন আরও বেশি করে উপহাসের সরঞ্জামগুলি নির্ভরতা-ইনজেকশন ব্যবহার করে। প্রোগ্রামিং ভাষাগুলি সম্ভবত মকিং-সামঞ্জস্যপূর্ণ বাইটকোড তৈরি করতে বিকশিত হবে। একটি নির্দেশ হবে অ-ভার্চুয়াল সদস্যদের ব্যবহার সীমাবদ্ধ করা। অন্যটি হবে, অন্তত পরীক্ষার পরিস্থিতিতে, অ-উত্তরাধিকার ভিত্তিক উপহাসের অনুমতি দিয়ে বাইটকোড তৈরি করা। বাস্তবায়ন ডি. আই. পি-র দুটি সাধারণ বাস্তবায়নে একই ধরনের যৌক্তিক কাঠামো ব্যবহার করা হয়েছে তবে এর বিভিন্ন প্রভাব রয়েছে। একটি সরাসরি বাস্তবায়ন একটি গ্রন্থাগারে পরিষেবার বিমূর্ত ক্লাসগুলির সাথে নীতি শ্রেণীগুলিকে প্যাকেজ করে। এই বাস্তবায়নে উচ্চ-স্তরের উপাদান এবং নিম্ন-স্তরের উপাদানগুলি পৃথক প্যাকেজ/গ্রন্থাগারে বিতরণ করা হয়, যেখানে উচ্চ-স্তরের উপাদান দ্বারা প্রয়োজনীয় আচরণ/পরিষেবাগুলি সংজ্ঞায়িত ইন্টারফেসগুলি মালিকানাধীন এবং উচ্চ-স্তরের উপাদানের গ্রন্থাগারের মধ্যে বিদ্যমান। নিম্ন-স্তরের উপাদান দ্বারা উচ্চ-স্তরের উপাদানের ইন্টারফেস বাস্তবায়নের জন্য নিম্ন-স্তরের উপাদান প্যাকেজটি সংকলনের জন্য উচ্চ-স্তরের উপাদানের উপর নির্ভর করে, এইভাবে প্রচলিত নির্ভরতা সম্পর্ককে উল্টে দেয়। চিত্র 1 এবং 2 একই কার্যকারিতা সহ কোডকে চিত্রিত করে, তবে চিত্র 2-এ, নির্ভরশীলতাকে বিপরীত করতে একটি ইন্টারফেস ব্যবহার করা হয়েছে। নীতির কোডের সর্বাধিক পুনঃব্যবহার এবং চক্রাকার নির্ভরতা দূর করার জন্য নির্ভরতার দিকটি বেছে নেওয়া যেতে পারে। ডি. আই. পি-এর এই সংস্করণে, নিম্ন স্তরের উপাদানগুলির উপর নির্ভরশীলতা নিম্ন স্তরের উপাদানগুলির পুনঃব্যবহারকে কঠিন করে তোলে। এর পরিবর্তে এই বাস্তবায়ন প্রথাগত নির্ভরশীলতাকে উপরে থেকে নীচে থেকে বিপরীত দিকে, নীচে থেকে উপরে "বিপরীতমুখী" করে। একটি আরও নমনীয় সমাধান বিমূর্ত উপাদানগুলিকে প্যাকেজ/গ্রন্থাগারগুলির একটি স্বাধীন সেটে বের করেঃ প্রতিটি স্তরকে তার নিজস্ব প্যাকেজে আলাদা করা যে কোনও স্তরের পুনরায় ব্যবহারকে উৎসাহিত করে, যা দৃঢ়তা এবং গতিশীলতা প্রদান করে। উদাহরণ বংশগত মডিউল একটি বংশগত ব্যবস্থা মানুষের মধ্যে সম্পর্ককে তাদের মধ্যে সরাসরি সম্পর্কের গ্রাফ হিসাবে উপস্থাপন করতে পারে (পিতা-পুত্র, পিতা-কন্যা, মা-পুত্র, মা-কন্যা, স্বামী-স্ত্রী, স্ত্রী-স্বামী ইত্যাদি)। এটি খুব কার্যকর এবং সম্প্রসারণযোগ্য, কারণ একজন প্রাক্তন স্বামী বা আইনী অভিভাবককে যুক্ত করা সহজ। তবে কিছু উচ্চ-স্তরের মডিউলগুলির জন্য সিস্টেমটি ব্রাউজ করার জন্য একটি সহজ উপায়ের প্রয়োজন হতে পারেঃ যে কোনও ব্যক্তির সন্তান, বাবা-মা, ভাইবোন (সৎ ভাই এবং বোন সহ), দাদা-দাদি, চাচাতো ভাই এবং আরও অনেক কিছু থাকতে পারে। বংশগত মডিউলের ব্যবহারের উপর নির্ভর করে, সাধারণ সম্পর্কগুলিকে স্বতন্ত্র প্রত্যক্ষ বৈশিষ্ট্য হিসাবে উপস্থাপন করা (গ্রাফটি লুকিয়ে রাখা) একটি উচ্চ-স্তরের মডিউল এবং বংশগত মডিউলের মধ্যে সংযোগকে আরও হালকা করে তুলবে এবং তাদের ব্যবহারকারী মডিউলগুলির উপর কোনও প্রভাব ছাড়াই সরাসরি সম্পর্কের অভ্যন্তরীণ উপস্থাপনাকে সম্পূর্ণরূপে পরিবর্তন করতে দেবে। এটি বংশগত মডিউলে ভাইবোন বা চাচার সঠিক সংজ্ঞা এম্বেড করার অনুমতি দেয়, এইভাবে একক দায়িত্ব নীতি প্রয়োগ করে। পরিশেষে, যদি প্রথম এক্সটেনসিবল জেনারেলাইজড গ্রাফ পদ্ধতিটি সর্বাধিক এক্সটেনসিবল বলে মনে হয়, তবে বংশগত মডিউলটির ব্যবহার দেখাতে পারে যে আরও বিশেষায়িত এবং সহজ সম্পর্ক বাস্তবায়ন প্রয়োগের (গুলি) জন্য যথেষ্ট এবং আরও দক্ষ ব্যবস্থা তৈরি করতে সহায়তা করে। এই উদাহরণে, মডিউলগুলির মধ্যে মিথস্ক্রিয়া বিমূর্ত করা নিম্ন-স্তরের মডিউলটির একটি সরলীকৃত ইন্টারফেসের দিকে পরিচালিত করে এবং এটির একটি সহজ বাস্তবায়নের দিকে পরিচালিত করতে পারে। রিমোট ফাইল সার্ভার ক্লায়েন্ট একটি রিমোট ফাইল সার্ভার (এফটিপি, ক্লাউড স্টোরেজ.) ক্লায়েন্টকে বিমূর্ত ইন্টারফেসের একটি সেট হিসাবে মডেল করা যেতে পারেঃ সংযোগ/সংযোগ বিচ্ছিন্নকরণ (একটি সংযোগ অধ্যবসায় স্তর প্রয়োজন হতে পারে) ফোল্ডার/ট্যাগ তৈরি/নাম পরিবর্তন/মুছে ফেলুন/তালিকা ইন্টারফেস ফাইল তৈরি/প্রতিস্থাপন/নাম পরিবর্তন/মুছে ফেলুন/ইন্টারফেস পড়ুন ফাইল অনুসন্ধান সমবর্তী প্রতিস্থাপন বা রেজোলিউশন ফাইল ইতিহাস পরিচালনা মুছে ফেলুন। যদি স্থানীয় এবং দূরবর্তী ফাইলগুলি একই বিমূর্ত ইন্টারফেস সরবরাহ করে, তবে উচ্চ-স্তরের মডিউলগুলি যা নির্ভরতা বিপরীত প্যাটার্ন প্রয়োগ করে সেগুলি নির্বিচারে ব্যবহার করতে পারে। অ্যাপ্লিকেশনটি তার নথিগুলি স্থানীয়ভাবে বা দূরবর্তীভাবে স্বচ্ছভাবে সংরক্ষণ করতে সক্ষম হবে। উচ্চ স্তরের মডিউলগুলির জন্য প্রয়োজনীয় পরিষেবার মাত্রা বিবেচনা করা উচিত। বিমূর্ত ইন্টারফেসের একটি সেট হিসাবে একটি মডিউল ডিজাইন করা এবং এর সাথে অন্যান্য মডিউলগুলি মানিয়ে নেওয়া, অনেক সিস্টেমের জন্য একটি সাধারণ ইন্টারফেস প্রদান করতে পারে। মডেল-ভিউ-কন্ট্রোলার ইউ. আই এবং অ্যাপ্লিকেশনলেয়ার প্যাকেজগুলিতে মূলত কংক্রিট ক্লাস থাকে। নিয়ন্ত্রকগুলিতে বিমূর্ত/ইন্টারফেসের প্রকার রয়েছে। ইউআই-এ আইকাস্টোমারহ্যান্ডলারের একটি উদাহরণ রয়েছে। সমস্ত প্যাকেজ শারীরিকভাবে পৃথক করা হয়। অ্যাপ্লিকেশনলেয়ারে কাস্টমারহ্যান্ডলারের একটি সুনির্দিষ্ট বাস্তবায়ন রয়েছে যা পেজ ক্লাস ব্যবহার করবে। আইকাস্টোমারহ্যান্ডলার ইন্টারফেসের উদাহরণগুলি একটি ফ্যাক্টরি দ্বারা গতিশীলভাবে তৈরি করা হয় (সম্ভবত একই কন্ট্রোলার প্যাকেজে)। কংক্রিট ধরনের পেজ এবং কাস্টমারহ্যান্ডলার একে অপরের উপর নয়, বরং আইকাস্টমারহ্যান্ডলারের উপর নির্ভর করে। যেহেতু ইউআই অ্যাপ্লিকেশনলেয়ার বা আইকাস্টোমারহ্যান্ডলার প্রয়োগকারী অন্য কোনও কংক্রিট প্যাকেজকে উল্লেখ করে না, তাই ইউআই শ্রেণী পরিবর্তন না করেই কাস্টোমারহ্যান্ডলারের কংক্রিট বাস্তবায়ন প্রতিস্থাপন করা যেতে পারে। এছাড়াও, পেজ ক্লাস ইন্টারফেস আইপিএজিভিউয়ার প্রয়োগ করে যা আইকাস্টোমারহ্যান্ডলার পদ্ধতিতে একটি যুক্তি হিসাবে পাস করা যেতে পারে, যা কাস্টোমারহ্যান্ডলারের সুনির্দিষ্ট প্রয়োগকে কোনও সুনির্দিষ্ট নির্ভরতা ছাড়াই ইউআইয়ের সাথে যোগাযোগ করার অনুমতি দেয়। আবার, উভয়ই ইন্টারফেস দ্বারা সংযুক্ত। নির্ভরশীলতা বিপরীত নীতি প্রয়োগ করা অ্যাডাপ্টার প্যাটার্নের একটি উদাহরণ হিসাবেও দেখা যেতে পারে। অর্থাৎ, উচ্চ-স্তরের শ্রেণী তার নিজস্ব অ্যাডাপ্টার ইন্টারফেসকে সংজ্ঞায়িত করে যা হল বিমূর্ততা যার উপর অন্যান্য উচ্চ-স্তরের শ্রেণীগুলি নির্ভর করে। অভিযোজিত বাস্তবায়ন অবশ্যই একই অ্যাডাপ্টার ইন্টারফেস বিমূর্ততার উপর নির্ভর করে, যেখানে এটি তার নিজস্ব নিম্ন-স্তরের মডিউল থেকে কোড ব্যবহার করে প্রয়োগ করা যেতে পারে। উচ্চ-স্তরের মডিউলটি নিম্ন-স্তরের মডিউলের উপর নির্ভর করে না, কারণ এটি অভিযোজিত বাস্তবায়ন এবং এর নিম্ন-স্তরের মডিউল দ্বারা বাস্তবায়িত ইন্টারফেসে পলিমরফিক পদ্ধতিগুলি আহ্বান করে অ্যাডাপ্টার ইন্টারফেসের মাধ্যমে পরোক্ষভাবে নিম্ন-স্তরের কার্যকারিতা ব্যবহার করে। উচ্চ-স্তরের উপাদানগুলিতে নির্বাচিত নিম্ন-স্তরের উপাদান বাস্তবায়নের রান-টাইম বিধানের সুবিধার্থে প্লাগিন, সার্ভিস লোকেটর বা ডিপেন্ডেন্সি ইনজেকশনের মতো বিভিন্ন নিদর্শন নিযুক্ত করা হয়। ইতিহাস নির্ভরতা বিপরীতমুখী নীতিটি রবার্ট সি মার্টিন দ্বারা উপস্থাপিত হয়েছিল এবং বেশ কয়েকটি প্রকাশনাতে বর্ণনা করা হয়েছিল যার মধ্যে রয়েছে অবজেক্ট ওরিয়েন্টেড ডিজাইন কোয়ালিটি মেট্রিক্সঃ নির্ভরশীলতার একটি বিশ্লেষণ, 1996 সালের মে মাসে সি + + রিপোর্টে দ্য ডিপেন্ডেন্সি ইনভার্সন প্রিন্সিপল শিরোনামে একটি নিবন্ধ এবং এজাইল সফ্টওয়্যার ডেভেলপমেন্ট, প্রিন্সিপলস, প্যাটার্নস, অ্যান্ড প্র্যাকটিসেস, অ্যান্ড এজাইল প্রিন্সিপলস, প্যাটার্নস, অ্যান্ড প্র্যাকটিসেস ইন সি #বইগুলি। আরও দেখুন অ্যাডাপ্টার প্যাটার্ন ডিপেন্ডেন্সি ইনজেকশন ডিজাইন বাই কন্ট্রাক্ট ইন্টারফেস ইনভেন্টর 'স প্যারাডক্স ইনভার্সন অফ কন্ট্রোল প্লাগ-ইন (কম্পিউটিং) সার্ভিস লোকেটর প্যাটার্ন সলিড-"সলিড"-এ "ডি" মানে ডিপেন্ডেন্সি ইনভার্সন নীতি রেফারেন্স বাহ্যিক লিঙ্ক অবজেক্ট ওরিয়েন্টেড ডিজাইন কোয়ালিটি মেট্রিক্সঃ ডিপেন্ডেন্সিগুলির একটি বিশ্লেষণ রবার্ট সি মার্টিন, সি + + রিপোর্ট, সেপ্টেম্বর/অক্টোবর 1995 দ্য ডিপেন্ডেন্সি ইনভার্সন প্রিন্সিপল, রবার্ট সি মার্টিন, সি + + রিপোর্ট, মে 1996 ডিপেন্ডেন্সি ইনভার্সন প্রিন্সিপল পরীক্ষা করা, ডেরেক গ্রির ডিআইপিঃ দ্য ডিপেন্ডেন্সি-ইনভার্সন প্রিন্সিপল ডিআইপি ইন দ্য ওয়াইল্ড, ব্রেট এল. শুচার্ট, মে 2013 ডিপেন্ডেন্সি ইন