SOLID-də D prinsipindən nə danışa bilərsən?
sobes.tech Süni İntellekt
AI-dan cavab
Asılılıqların Tərs Çevrilməsi Prinsipi (Dependency Inversion Principle) deyir:
- Yüksək səviyyəli modullar aşağı səviyyəli modullardan asılı olmamalıdır. Hər iki modul növü abstraksiyalara asılı olmalıdır.
- Abstraksiyalar detallara asılı olmamalıdır. Detallar abstraksiyalara asılı olmalıdır.
SOLID-də D-nin məqsədi yüksək səviyyəli siyasətləri aşağı səviyyəli həyata keçirməkdən ayırmaqdır (decoupling). Yüksək səviyyəli modul birbaşa aşağı səviyyəli modulun konkret həyata keçməsinə bağlı olmamalıdır, hər ikisi ümumi interfeys və ya abstrakt sinfə bağlıdır. Bu, kodun çevikliyini, test edilə bilməsini və dəstəklənməsini artırır.
Flutter-də bu, çox vaxt abstrakt siniflər və ya mixinlər istifadə edilərək, müqavilərin müəyyənləşdirilməsi və sonra konkret siniflər tərəfindən həyata keçirilməsi ilə özünü göstərir. Məsələn, məlumatlarla işləyərkən:
// Abstraksiya
abstract class DataService {
Future<List<String>> getData();
}
// Aşağı səviyyəli həyata keçirmə (konkret detal)
class ApiDataService implements DataService {
@override
Future<List<String>> getData() async {
// API-dən məlumatların alınması loqikası
return ['API Data 1', 'API Data 2'];
}
}
// Digər aşağı səviyyəli həyata keçirmə (başqa detal)
class LocalDataService implements DataService {
@override
Future<List<String>> getData() async {
// Lokal yaddaşdan məlumatların alınması loqikası
return ['Local Data 1', 'Local Data 2'];
}
}
// Yüksək səviyyəli modul, abstraksiyaya bağlıdır, detallara yox
class DataManager {
final DataService _dataService; // Asılılıq abstraksiyaya
DataManager(this._dataService); // Asılılıq in'ektsiya edilir (inversion)
Future<List<String>> fetchData() {
return _dataService.getData();
}
}
// İstifadə
void main() {
final apiService = ApiDataService();
final localService = LocalDataService();
final apiManager = DataManager(apiService); // ApiDataService in'ektsiya edilir
final localManager = DataManager(localService); // LocalDataService in'ektsiya edilir
// ... apiManager və ya localManager istifadə olunur
}
Bu nümunədə, DataManager (yüksək səviyyəli modul) birbaşa ApiDataService və ya LocalDataService-ə bağlı deyil. O, DataService abstraksiyasına bağlıdır. DataService-in konkret həyata keçirilməsi DataManager-ə xaricdən "in'ektsiya" edilir və bu, asılılıqların tərs çevrilməsinin bir göstəricisidir. Bu, məlumat mənbələrini asanlıqla dəyişməyə imkan verir, DataManager-in məntiqini dəyişmədən.