Sobes.tech
Middle

Co můžeš říct o principu D v SOLID?

sobes.tech AI

Odpověď od AI

Princip principu závislostí (Dependency Inversion Principle) říká:

  • Moduly vyšší úrovně by nem měly záviset na modulech nižší úrovně. Oba typy modulů by měly záviset na abstrakcích.
  • Abstrakce by neměly záviset na detailech. Detaily by měly záviset na abstrakcích.

Cílem D v SOLID je oddělit (decoupling) politiky vysoké úrovně od implementace nízké úrovně. Místo toho, aby modul vysoké úrovně přímo závisel na konkrétní implementaci modulu nízké úrovně, oba závisí na společném rozhraní nebo abstraktní třídě. To zvyšuje flexibilitu, testovatelnost a udržovatelnost kódu.

V Flutteru se to často projevuje použitím abstraktních tříd nebo mixinů k definování kontraktů, které jsou poté implementovány konkrétními třídami. Například při práci s daty:

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

// Nízké úrovně implementace (konkrétní detail)
class ApiDataService implements DataService {
  @override
  Future<List<String>> getData() async {
    // Logika získávání dat z API
    return ['API Data 1', 'API Data 2'];
  }
}

// Jiná nízké úrovně implementace (jiný detail)
class LocalDataService implements DataService {
  @override
  Future<List<String>> getData() async {
    // Logika získávání dat z lokálního úložiště
    return ['Local Data 1', 'Local Data 2'];
  }
}

// Modul vysoké úrovně závisí na abstrakci, nikoliv na detailech
class DataManager {
  final DataService _dataService; // Závislost na abstrakci

  DataManager(this._dataService); // Injekce závislosti (inversion)

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

// Použití
void main() {
  final apiService = ApiDataService();
  final localService = LocalDataService();

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

  // ... použití apiManager nebo localManager
}

V tomto příkladu DataManager (modul vysoké úrovně) přímo nezávisí na ApiDataService nebo LocalDataService. Závisí na abstrakci DataService. Konkrétní implementace DataService je "injektována" do DataManager zvenčí, což je projevem závislostní inverze. To umožňuje snadno měnit zdroje dat bez změny logiky DataManager.