Sobes.tech
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
}