Sobes.tech
Middle

Čo môžeš povedať o princípe D v SOLID?

sobes.tech AI

Odpoveď od AI

Princip inverzije odvisnosti (Dependency Inversion Principle) pravi:

  • Moduli višje ravni ne smejo biti odvisni od modulov nižje ravni. Oba tipa modulov morata biti odvisna od abstrakcij.
  • Abstrakcije ne smejo biti odvisne od podrobnosti. Podrobnosti morajo biti odvisne od abstrakcij.

Cilj D v SOLID je razvejanost (decoupling) visokih politik od nizkonivojske implementacije. Namesto da visokoravni modul neposredno odvisen od konkretne implementacije nizkonivojskega modula, oba odvisna od skupnega vmesnika ali abstraktne razrede. To povečuje prilagodljivost, testabilnost in vzdrževanje kode.

V Flutterju se to pogosto kaže skozi uporabo abstraktnih razredov ali miksinov za določanje pogodb, ki jih nato implementirajo konkretne razrede. Na primer, pri delu s podatki:

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

// Nizkonivojska implementacija (konkretni detajl)
class ApiDataService implements DataService {
  @override
  Future<List<String>> getData() async {
    // Logika pridobivanja podatkov iz API-ja
    return ['API Data 1', 'API Data 2'];
  }
}

// Nizkonivojska implementacija (drugi konkretni detajl)
class LocalDataService implements DataService {
  @override
  Future<List<String>> getData() async {
    // Logika pridobivanja podatkov iz lokalnega shranješča
    return ['Local Data 1', 'Local Data 2'];
  }
}

// Visokoravni modul, ki odvisen od abstrakcije, ne od detajlov
class DataManager {
  final DataService _dataService; // Odvisnost od abstrakcije

  DataManager(this._dataService); // Vstavljanje odvisnosti (inverzija)

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

// Uporaba
void main() {
  final apiService = ApiDataService();
  final localService = LocalDataService();

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

  // ... uporaba apiManager ali localManager
}

V tem primeru DataManager (visokoravni modul) ne odvisen neposredno od ApiDataService ali LocalDataService. Odvisen je od abstrakcije DataService. Konkretna implementacija DataService je "vstavljena" v DataManager od zunaj, kar je manifestacija inverzije odvisnosti. To omogoča enostavno zamenjavo virov podatkov brez spremembe logike DataManager.