হাই-লেভেল মডিউলগুলো লো-লেভেল মডিউলের উপর ডিপেন্ডেন্ট হওয়া উচিত নয়। উভয়ই অ্যাবস্ট্রাকশনের উপর ডিপেন্ডেন্ট হওয়া উচিত।
অ্যাবস্ট্রাকশন ডিটেইলসের উপর ডিপেন্ডেন্ট হওয়া উচিত নয়। ডিটেইলস অ্যাবস্ট্রাকশনের উপর ডিপেন্ডেন্ট হওয়া উচিত।
এই প্রিন্সিপল मुख্যভাবে কোড মডিউলগুলোর মধ্যে ডিপেন্ডেন্সি কমানোর সাথে জড়িত।
উদাহরণ
ডিপেন্ডেন্সি ইনভার্সন প্রিন্সিপল लागু করার আগে
using System;
namespace SolidPrinciples.Dependency.Invertion.Before
{
public class Email
{
public string ToAddress { get; set; }
public string Subject { get; set; }
public string Content { get; set; }
public void SendEmail() { /* Send email */ }
}
public class SMS
{
public string PhoneNumber { get; set; }
public string Message { get; set; }
public void SendSMS() { /* Send sms */ }
}
public class Notification
{
private Email _email;
private SMS _sms;
public Notification()
{
_email = new Email();
_sms = new SMS();
}
public void Send()
{
_email.SendEmail();
_sms.SendSMS();
}
}
}
ডিপেন্ডেন্সি ইনভার্সন প্রিন্সিপল लागু করার পর
using System.Collections.Generic;
namespace SolidPrinciples.Dependency.Invertion.After
{
public interface IMessage
{
void SendMessage();
}
public class Email : IMessage
{
public string ToAddress { get; set; }
public string Subject { get; set; }
public string Content { get; set; }
public void SendMessage() { /* Send email */ }
}
public class SMS : IMessage
{
public string PhoneNumber { get; set; }
public string Message { get; set; }
public void SendMessage() { /* Send Sms */ }
}
public class Notification
{
private ICollection<IMessage> _messages;
public Notification(ICollection<IMessage> messages)
{
this._messages = messages;
}
public void Send()
{
foreach (var message in _messages)
{
message.SendMessage();
}
}
}
}
ব্যাখ্যা: প্রথমে Notification ক্লাস কনক্রিট Email এবং SMS ক্লাসের উপর ডিপেন্ডেন্ট ছিল। পরে IMessage ইন্টারফেস (অ্যাবস্ট্রাকশন) তৈরি করা হয় এবং Notification কনস্ট্রাক্টর ইনজেকশন দিয়ে ICollection<IMessage> নেয়। এখন নতুন মেসেজ টাইপ (যেমন PushNotification) যোগ করলে Notification ক্লাস পরিবর্তন করতে হয় না।