SOLID'deki bağımlılık prensibi hakkında, D harfine karşılık gelen prensipten bahsedin.
sobes.tech yapay zeka
AI'dan gelen yanıt
Bağımlılıkların Tersine Çevirisi Prensibi (Dependency Inversion Principle, DIP).
Yüksek seviyeli modüller düşük seviyeli modüllere bağlı olmamalıdır. Her ikisi de soyutlamalara bağlı olmalıdır. Soyutlamalar detaylara bağlı olmamalıdır. Detaylar soyutlamalara bağlı olmalıdır.
Prensibin amacı: bileşenler arasındaki bağımlılığı azaltmak, sistemi daha esnek, test edilebilir ve ölçeklenebilir hale getirmektir.
Swift'te örnek:
Kötü:
class UserRepository {
func getAllUsers() -> [User] {
// Belirli bir veritabanı veya ağdan kullanıcıları alma mantığı
// ...uygulama...
return []
}
}
class UserService {
private let repository = UserRepository() // Belirli bir uygulamaya doğrudan bağımlılık
func fetchUsers() -> [User] {
return repository.getAllUsers()
}
}
İyi (DIP uygulanmış):
// Soyutlama
protocol UserRepositoryProtocol {
func getAllUsers() -> [User]
}
// Düşük seviyeli modül (soyutlamanın uygulaması)
class ConcreteUserRepository: UserRepositoryProtocol {
func getAllUsers() -> [User] {
// Kullanıcıları alma mantığı (uygulama detayları)
// ...uygulama...
return []
}
}
// Yüksek seviyeli modül, soyutlamaya bağlı
class UserService {
private let repository: UserRepositoryProtocol // Bağımlılık soyutlamaya
init(repository: UserRepositoryProtocol) {
self.repository = repository // Bağımlılık enjeksiyonu
}
func fetchUsers() -> [User] {
return repository.getAllUsers()
}
}
// Bağımlılıkların yapılandırılması (daha iyi bir DI konteynerinde yapılmalı)
let repository = ConcreteUserRepository()
let userService = UserService(repository: repository)
Burada, UserService (yüksek seviyeli modül) doğrudan ConcreteUserRepository (düşük seviyeli modül) ile bağlı değildir, onun yerine UserRepositoryProtocol soyutlamasına bağlıdır. ConcreteUserRepository de soyutlamaya bağlıdır ve onu uygular. Bağımlılık "tersine çevrilir" — yüksek seviyeli modül düşük seviyeli modüle bağlı olmaktansa, ikisi de soyutlamaya bağlıdır.