DEV Community

Mustafa  Çam
Mustafa Çam

Posted on

Dependency Inversion Prensibi

Dependency Inversion Principle (DIP), SOLID prensiplerinden biridir ve yazılımda bağımlılıkları yönetmek için çok önemli bir kavramdır. C# gibi nesne yönelimli dillerde, yazılımın esnekliğini ve bakımını kolaylaştırmak amacıyla kullanılır.

DIP, iki temel kuraldan oluşur:

  1. Yüksek seviye modüller (veya sınıflar), düşük seviye modüllere bağımlı olmamalıdır. Her iki tür de abstraksiyonlara (soyutlamalara) bağımlı olmalıdır.
  • Yüksek seviye modüller, programın genel işlevselliğini sağlar (örneğin, bir iş mantığı sınıfı).
  • Düşük seviye modüller, daha spesifik işlevler sağlar (örneğin, veri erişim sınıfı).
  1. Abstraksiyonlar (interface veya abstract class) somut sınıflardan (concrete classes) bağımsız olmalıdır.

Örnek ile Açıklama:

Bir örnek üzerinden açıklayalım. Diyelim ki, bir EmailService sınıfımız var ve bu sınıfın içinde bir SmtpClient'a bağımlılığı var. Eğer EmailService doğrudan SmtpClient sınıfına bağlıysa, bu durum DIP'yi ihlal eder çünkü EmailService yüksek seviye bir iş mantığı sınıfıyken, SmtpClient daha düşük seviye bir sınıftır.

DIP'yi uygularsak, EmailService'in SmtpClient'a olan bağımlılığını kaldırabiliriz. Bunun yerine, bir abstraction (soyutlama) olan IEmailClient adında bir arayüz (interface) oluştururuz ve EmailService sadece bu arayüze bağımlı olur. Bu şekilde, EmailService sınıfı daha esnek hale gelir ve farklı e-posta servisleri kullanılabilir.

Kod Örneği

DIP'yi ihlal eden kod:

public class EmailService
{
    private SmtpClient _smtpClient;

    public EmailService()
    {
        _smtpClient = new SmtpClient();  // Direkt olarak SmtpClient'a bağlı.
    }

    public void SendEmail(string to, string subject, string body)
    {
        _smtpClient.Send(to, subject, body);
    }
}
Enter fullscreen mode Exit fullscreen mode

DIP'yi uygulayan kod:

public interface IEmailClient
{
    void Send(string to, string subject, string body);
}

public class SmtpEmailClient : IEmailClient
{
    public void Send(string to, string subject, string body)
    {
        // SmtpClient kullanılarak e-posta gönderimi yapılır.
    }
}

public class EmailService
{
    private readonly IEmailClient _emailClient;

    public EmailService(IEmailClient emailClient)
    {
        _emailClient = emailClient;  // Artık sadece soyutlamaya (IEmailClient) bağlı.
    }

    public void SendEmail(string to, string subject, string body)
    {
        _emailClient.Send(to, subject, body);
    }
}
Enter fullscreen mode Exit fullscreen mode

Bu şekilde EmailService sınıfı IEmailClient arayüzüne bağlıdır ve artık SmtpClient gibi somut bir sınıfa doğrudan bağımlı değildir. Böylece:

  • EmailService sınıfı esnek hale gelir, çünkü farklı e-posta gönderme yöntemleri (örneğin, SendGridEmailClient) kolayca entegre edilebilir.
  • Bağımlılıkları yönetmek için Dependency Injection kullanılabilir.

Sonuç:
DIP, yazılımın sürdürülebilirliğini artırır, bağımlılıkları yönetmeyi kolaylaştırır ve test edilebilirliği artırır.

Top comments (0)