Sobes.tech
Middle

Šta možeš da kažeš o principu D u SOLID?

sobes.tech АИ

Одговор од АИ

Princip princip inverzije zavisnosti (Princip inverzije zavisnosti) kaže:

  • Moduli višeg nivoa ne bi trebalo da zavise od modula nižeg nivoa. Oba tipa modula treba da zavise od apstrakcija.
  • Apstrakcije ne bi trebalo da zavise od detalja. Detalji treba da zavise od apstrakcija.

Cilj D u SOLID-u je decoupling (razdvajanje) visokih politika od niskonivojske implementacije. Umesto da visok nivo modula direktno zavisi od konkretne implementacije niskonivojskog modula, oba zavise od zajedničkog interfejsa ili apstraktne klase. To povećava fleksibilnost, testabilnost i održivost koda.

U Flutter-u se to često manifestuje kroz korišćenje apstraktnih klasa ili miksina za definisanje ugovora, koji zatim implementiraju konkretne klase. Na primer, pri radu sa podacima:

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

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

// Niskonivojska implementacija (drugi konkretni detalj)
class LocalDataService implements DataService {
  @override
  Future<List<String>> getData() async {
    // Logika dobijanja podataka iz lokalnog skladišta
    return ['Local Data 1', 'Local Data 2'];
  }
}

// Visok nivo modula, koji zavisi od apstrakcije, a ne od detalja
class DataManager {
  final DataService _dataService; // Zavisnost od apstrakcije

  DataManager(this._dataService); // Injekcija zavisnosti (inverzija)

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

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

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

  // ... korišćenje apiManager ili localManager
}

U ovom primeru, DataManager (visok nivo modula) ne zavisi direktno od ApiDataService ili LocalDataService. On zavisi od apstrakcije DataService. Konkretna implementacija DataService se "injektuje" u DataManager spolja, što je manifestacija inverzije zavisnosti. To omogućava lako zamenu izvora podataka bez promene logike DataManager.