নির্ভরতা বিপরীতমুখী নীতি বনাম "একটি ইন্টারফেসে প্রোগ্রাম, বাস্তবায়ন নয়"


12

আমি বোঝার চেষ্টা করছি কীভাবে নির্ভরতা ইনভার্সন নীতিটি "প্রোগ্রাম থেকে একটি ইন্টারফেসে প্রয়োগ হয়, বাস্তবায়ন নয়" নীতিটি থেকে কীভাবে আলাদা।

আমি বুঝতে পারি "প্রোগ্রাম একটি ইন্টারফেস, বাস্তবায়ন নয়" এর অর্থ কী। আমি আরও বুঝতে পারি যে এটি কীভাবে আরও নমনীয় এবং রক্ষণাবেক্ষণযোগ্য ডিজাইনের অনুমতি দেয়।

তবে আমি বুঝতে পারি না যে নির্ভরতা বিপরীতার নীতিটি "প্রোগ্রাম থেকে একটি ইন্টারফেসে, কোনও বাস্তবায়ন নয়" নীতি থেকে আলাদা is

আমি ওয়েবে বেশ কয়েকটি জায়গায় ডিআইপি সম্পর্কে পড়েছি এবং এটি আমার বিভ্রান্তি দূর করতে পারে না। আমি এখনও দেখতে পাই না যে দুটি নীতি একে অপরের থেকে কীভাবে আলাদা। আপনার সাহায্যের জন্য ধন্যবাদ.

উত্তর:


26

"ইন্টারফেস থেকে একটি প্রোগ্রাম" এর অর্থ আপনার কাজটি করার জন্য কোনও কংক্রিটের ধরণের উপর নির্ভর করবে না , তবে আপনাকে কীভাবে আপনার নির্ভরতা পেতে হবে তা নির্দিষ্ট করে না ।

"ডিপেন্ডেন্সি ইনভার্সন প্রিন্সিপাল" বলছে যে কোনও বস্তুর তার নির্ভরতাগুলি তৈরি করা নিয়ন্ত্রণ করা উচিত নয়, এটি কেবল তার কী নির্ভরতা প্রয়োজন তা বিজ্ঞাপন দেওয়া উচিত এবং কলকারী এটি সরবরাহ করতে দেয় । তবে এটি নির্ভর করে না যে নির্ভরতাটি কোনও কংক্রিটের ধরন বা ইন্টারফেস হতে হবে।

আমি কিছু সি # কোড দিয়ে পার্থক্য বর্ণনা করব।

নিম্নলিখিত উদাহরণটি একটি কংক্রিটের ধরণের উপর নির্ভর করে এবং এটি নিজস্ব নির্ভরতার সৃষ্টি নিয়ন্ত্রণ করে। এটি "প্রোগ্রামকে একটি ইন্টারফেসে" বা "নির্ভরতা বিপরীতে" অনুসরণ করে না :

public class ThingProcessor
{
    MyThing _myThing;

    public ThingProcessor()
    {
        _myThing = new MyThing();
    }

    public void DoSomething()
    {
        _myThing.DoIt();
    }
}

নিম্নলিখিত উদাহরণটি একটি ইন্টারফেসের উপর নির্ভর করে, তবে এটি নিজস্ব নির্ভরতার সৃষ্টি নিয়ন্ত্রণ করে। এটি "প্রোগ্রামটিকে একটি ইন্টারফেসে" অনুসরণ করে তবে "নির্ভরতা বিপরীতমুখীকরণ" নয়:

public class ThingProcessor
{
    IMyThing _myThing;

    public ThingProcessor()
    {
        _myThing = ThingFactory.GiveMeANewMyThing();
    }

    public void DoSomething()
    {
        _myThing.DoIt();
    }
}

নিম্নলিখিত উদাহরণটি একটি কংক্রিটের ধরণের উপর নির্ভর করে তবে এটি এর নির্ভরতা তৈরি করতে এবং এটিতে প্রেরণের জন্য বলে। এটি "নির্ভরতা বিপর্যয়" অনুসরণ করে, তবে "ইন্টারফেসে প্রোগ্রাম" নয়:

public class ThingProcessor
{
    MyThing _myThing;

    public ThingProcessor(MyThing myThing)
    {
        _myThing = myThing;
    }

    public void DoSomething()
    {
        _myThing.DoIt();
    }
}

নিম্নলিখিত উদাহরণটি একটি ইন্টারফেসের উপর নির্ভর করে এবং এটি এর নির্ভরতা তৈরি করতে এবং এটিতে প্রেরণের জন্য বলে। এটি "নির্ভরতা বিপর্যয়" এবং "একটি ইন্টারফেসে প্রোগ্রাম " উভয়কে অনুসরণ করে :

public class ThingProcessor
{
    IMyThing _myThing;

    public ThingProcessor(IMyThing myThing) // using an interface
    {
        _myThing = myThing;
    }

    public void DoSomething()
    {
        _myThing.DoIt();
    }
}

1
পার্থক্যের দুর্দান্ত চিত্রণ।
ররি হান্টার

8
আপনি যে বিষয়ে কথা বলছেন তা হ'ল ডিপেন্ডেন্ডি ইনজেকশন। এবং নির্ভরতা বিপরীতকরণ এবং নির্ভরতা ইনজেকশন দুটি ভিন্ন জিনিস।
ইওফোরিক

1
@ ইউফোরিক আমি নির্ভরশীল ইনভার্সন প্রিন্সিপালের কথা বলছি, যা একটি বিমূর্ত ধারণা, নির্ভরশীল ইনজেকশনটিকে কংক্রিট বাস্তবায়নের উদাহরণ হিসাবে ব্যবহার করে। আমি পার্থক্য বুঝতে পারি।
এরিক কিং

1
@ এরিকিং তারপরে আপনার স্পষ্টভাবে বলতে হবে যে আপনার জবাবের পরিবর্তে "" নির্ভরতা বিপরীতমুখী নীতি "বলেছে ..." যা আপনি আমার উত্তরটি পড়লে স্পষ্টতই ভুল।
ইউফোরিক

1
আমি ইউফোরিকের সাথে একমত নির্ভরতা বিপর্যয় নীতিটি বলে যে উচ্চ স্তরের কোডের কোডগুলি নিম্ন-স্তরের কোডের বিপরীতে নয়, উপর নির্ভর করে। যেমন PrintStreamদ্বারা প্রতিষ্ঠিত ইন্টারফেসের উপর নির্ভর করা উচিত ByteOutputStream। নির্ভরতা ইনজেকশন কাদের উপর নির্ভর করবে সে সম্পর্কে কিছুই উল্লেখ করেনি।
ডোভাল

5

তারা সাধারণত একই জিনিস। যদি আপনি পড়েন যে নির্ভরতা বিপরীতমুখী মূলনীতিটি কী এবং কেন এটি গুরুত্বপূর্ণ? এবং নির্ভরতা বিপরীকরণ নীতি , আপনি একই জিনিস সম্পর্কে দুটি "নীতি" কথাটি বুঝতে পারবেন।

  • উচ্চ স্তরের মডিউলগুলি নিম্ন-স্তরের মডিউলগুলির উপর নির্ভর করে না। উভয়েরই বিমূর্ততার উপর নির্ভর করা উচিত।
  • বিমূর্ততা কখনই বিশদের উপর নির্ভর করে না। বিবরণ বিমূর্ততা উপর নির্ভর করা উচিত।

ইন্টারফেস একটি বিমূর্ততা এবং বাস্তবায়ন একটি বিশদ। আপনি যদি আগের দুটি বিবৃতিতে এগুলি প্রতিস্থাপন করেন তবে আপনার মূলত "কোডটি ইন্টারফেসের উপর নির্ভর করে এবং প্রয়োগের ক্ষেত্রে নয়" " এবং এটি আমার কাছে একই জিনিস বলে মনে হচ্ছে।


এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, অন্যান্য সর্বাধিক ভোট দেওয়া উত্তরটি বিভ্রান্তিমূলক
সামে ড্যাবেস

2

ইন্টারফেসগুলি ডিআই বাস্তবায়নের এক উপায়। আপনি যদি কোনও শ্রেণীর কনস্ট্রাক্টর পদ্ধতিতে কোনও ইন্টারফেসটিকে প্যারামিটার হিসাবে নির্দিষ্ট করেন তবে আপনি যে নির্মাণ করতে চান সেই নির্মাণকারী পদ্ধতিতে আপনার পছন্দ মতো কোনও বস্তু হস্তান্তর করতে পারেন, যতক্ষণ না সেই অবজেক্টটি কনস্ট্রাক্টর প্যারামিটারের ইন্টারফেস প্রয়োগ করে।

অন্য কথায়, একটি ইন্টারফেস প্রোগ্রামিং আপনাকে সেই ইন্টারফেসের প্রয়োগ পরিবর্তন করতে দেয় । এটি ইউনিট পরীক্ষার সময় আমরা কীভাবে সত্যিকারের বস্তুর জন্য মক অবজেক্টগুলি বিকল্প করতে সক্ষম হব, বিভিন্ন ডেটা সরবরাহকারী নির্দিষ্ট করতে পারি এবং এর বাইরেও।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.