Sobes.tech
Middle

SOLID'deki D prensibi hakkında ne anlatabilirsin?

sobes.tech yapay zeka

AI'dan gelen yanıt

Bağımlılıkların Ters Çevrilmesi İlkesi (Dependency Inversion Principle) şunu söyler:

  • Üst düzey modüller alt düzey modüllere bağlı olmamalıdır. Her iki modül tipi soyutlamalara bağlı olmalıdır.
  • Soyutlamalar detaylara bağlı olmamalıdır. Detaylar soyutlamalara bağlı olmalıdır.

SOLID'deki D'nin amacı, yüksek seviyeli politikaları düşük seviyeli uygulamalardan ayırmaktır (decoupling). Yüksek seviyeli bir modül, düşük seviyeli bir modülün somut uygulamasına doğrudan bağlı olmak yerine, her ikisi ortak bir arayüze veya soyut sınıfa bağlıdır. Bu, kodun esnekliğini, test edilebilirliğini ve sürdürülebilirliğini artırır.

Flutter'da bu, genellikle soyut sınıflar veya mixin'ler kullanılarak, sözleşmelerin tanımlanması ve bunların somut sınıflar tarafından uygulanması şeklinde kendini gösterir. Örneğin, veri ile çalışırken:

// Soyutlama
abstract class DataService {
  Future<List<String>> getData();
}

// Düşük seviyeli uygulama (somut detay)
class ApiDataService implements DataService {
  @override
  Future<List<String>> getData() async {
    // API'den veri alma mantığı
    return ['API Data 1', 'API Data 2'];
  }
}

// Başka bir düşük seviyeli uygulama (başka bir detay)
class LocalDataService implements DataService {
  @override
  Future<List<String>> getData() async {
    // Yerel depolamadan veri alma mantığı
    return ['Local Data 1', 'Local Data 2'];
  }
}

// Yüksek seviyeli modül, soyutlamaya bağlıdır, detaylara değil
class DataManager {
  final DataService _dataService; // Soyutlamaya bağımlılık

  DataManager(this._dataService); // Bağımlılık enjekte edilir (inversion)

  Future<List<String>> fetchData() {
    return _dataService.getData();
  }
}

// Kullanım
void main() {
  final apiService = ApiDataService();
  final localService = LocalDataService();

  final apiManager = DataManager(apiService); // ApiDataService enjekte edilmesi
  final localManager = DataManager(localService); // LocalDataService enjekte edilmesi

  // ... apiManager veya localManager kullanımı
}

Bu örnekte, DataManager (yüksek seviyeli modül), doğrudan ApiDataService veya LocalDataService'e bağlı değildir. O, DataService soyutlamasına bağlıdır. DataService'in somut uygulaması, dışarıdan DataManager'a "enjekte edilir" ve bu, bağımlılıkların tersine çevrilmesinin bir göstergesidir. Bu, veri kaynaklarını kolayca değiştirmeyi sağlar, DataManager'ın mantığını değiştirmeden.