Sobes.tech
Middle

Mit tudsz mondani a SOLID D elvéről?

sobes.tech MI

Válasz az MI-től

A függőségek fordított elve (Dependency Inversion Principle) kimondja:

  • A magas szintű moduloknak nem szabad az alacsony szintű modulokra támaszkodniuk. Mindkét típusú modulnak az absztrakciókra kell támaszkodnia.
  • Az absztrakciók nem szabad, hogy a részletektől függjenek. A részleteknek az absztrakcióktól kell függniük.

A SOLID D-nek az a célja, hogy a magas szintű politikákat leválassza (decoupling) az alacsony szintű megvalósításról. Egy magas szintű modul ne függjön közvetlenül egy alacsony szintű modul konkrét megvalósításától, hanem mindkettő egy közös interfész vagy absztrakt osztály függvényében legyen. Ez növeli a kód rugalmasságát, tesztelhetőségét és karbantarthatóságát.

Flutterben ez gyakran nyilvánul meg az absztrakt osztályok vagy mixinek használatával, amelyek szerződéseket határoznak meg, amelyeket aztán konkrét osztályok valósítanak meg. Például adatkezelésnél:

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

// Alacsony szintű megvalósítás (konkrét rész)
class ApiDataService implements DataService {
  @override
  Future<List<String>> getData() async {
    // API-ból adat lekérdezés logikája
    return ['API Data 1', 'API Data 2'];
  }
}

// Más alacsony szintű megvalósítás (más részlet)
class LocalDataService implements DataService {
  @override
  Future<List<String>> getData() async {
    // Helyi tárolóból adat lekérdezés logikája
    return ['Local Data 1', 'Local Data 2'];
  }
}

// Magas szintű modul, amely az absztrakciótól függ, nem a részletektől
class DataManager {
  final DataService _dataService; // Függőség az absztrakciótól

  DataManager(this._dataService); // A függőség injektálva van (inversion)

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

// Használat
void main() {
  final apiService = ApiDataService();
  final localService = LocalDataService();

  final apiManager = DataManager(apiService); // ApiDataService injektálása
  final localManager = DataManager(localService); // LocalDataService injektálása

  // ... az apiManager vagy localManager használata
}

Ebben a példában a DataManager (magas szintű modul) nem függ közvetlenül az ApiDataService vagy LocalDataService-től. Az absztrakciótól, a DataService-től függ. A DataService konkrét megvalósítása "injektálódik" a DataManager-be kívülről, ami a függőségek fordított irányba történő elfordításának (inversion) megnyilvánulása. Ez lehetővé teszi az adatforrások könnyű cseréjét anélkül, hogy a DataManager logikáját módosítani kellene.