Middle
Ką gali papasakoti apie SOLID principo D?
sobes.tech AI
Atsakymas iš AI
Priešingybės inversijos principas (Dependency Inversion Principle) sako:
- Aukštesnio lygio moduliai neturėtų priklausyti nuo žemesnio lygio modulių. Abu tipai modulių turėtų priklausyti nuo abstrakcijų.
- Abstrakcijos neturėtų priklausyti nuo detalių. Detalės turėtų priklausyti nuo abstrakcijų.
D tikslas SOLID - atjungti (decoupling) aukšto lygio politiką nuo žemo lygio įgyvendinimo. Vietoj to, kad aukšto lygio modulis tiesiogiai priklausytų nuo žemo lygio modulio konkrečios įgyvendinimo, abu priklauso nuo bendro sąsajos ar abstraktaus klasės. Tai padidina lankstumą, testavimą ir priežiūrą.
Flutter dažnai tai pasireiškia naudojant abstrakčius klases ar miksinus, kurie apibrėžia sutartis, kurias vėliau įgyvendina konkretūs klasės. Pavyzdžiui, dirbant su duomenimis:
// Abstrakcija
abstract class DataService {
Future<List<String>> getData();
}
// Žemo lygio įgyvendinimas (konkretus detalės)
class ApiDataService implements DataService {
@override
Future<List<String>> getData() async {
// Duomenų gavimo logika iš API
return ['API Data 1', 'API Data 2'];
}
}
// Kitas žemo lygio įgyvendinimas (kita detalė)
class LocalDataService implements DataService {
@override
Future<List<String>> getData() async {
// Duomenų gavimo logika iš vietinio saugyklos
return ['Local Data 1', 'Local Data 2'];
}
}
// Aukšto lygio modulis, kuris priklauso nuo abstrakcijos, o ne nuo detalių
class DataManager {
final DataService _dataService; // Priklausomybė nuo abstrakcijos
DataManager(this._dataService); // Priklausomybės injekcija (inversija)
Future<List<String>> fetchData() {
return _dataService.getData();
}
}
// Naudojimas
void main() {
final apiService = ApiDataService();
final localService = LocalDataService();
final apiManager = DataManager(apiService); // Injekcija ApiDataService
final localManager = DataManager(localService); // Injekcija LocalDataService
// ... naudojimas apiManager arba localManager
}