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:
- 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ı).
- 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);
}
}
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);
}
}
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)