Sobes.tech
Middle

Какво можеш да разкажеш за принципа D в SOLID?

sobes.tech AI

Отговор от AI

Принципът за инверсия на зависимостите (Dependency Inversion Principle) гласи:

  • Модулите от висок ниво не трябва да зависят от модулите от ниско ниво. И двата типа модули трябва да зависят от абстракции.
  • Абстракциите не трябва да зависят от детайлите. Детайлите трябва да зависят от абстракциите.

Целта на D в SOLID е да разчупи (decoupling) политиките от високо ниво от реализацията от ниско ниво. Вместо високоуровневият модул да зависи директно от конкретната реализация на ниско ниво, и двата зависят от общ интерфейс или абстрактен клас. Това увеличава гъвкавостта, тестируемостта и поддържането на кода.

В Flutter това често се проявява чрез използване на абстрактни класове или миксини за определяне на договори, които след това се реализират от конкретни класове. Например, при работа с данни:

// Абстракция
abstract class DataService {
  Future<List<String>> getData();
}

// Ниско ниво на реализация (конкретен детайл)
class ApiDataService implements DataService {
  @override
  Future<List<String>> getData() async {
    // Логика за получаване на данни от API
    return ['API Data 1', 'API Data 2'];
  }
}

// Друга ниско ниво на реализация (друг детайл)
class LocalDataService implements DataService {
  @override
  Future<List<String>> getData() async {
    // Логика за получаване на данни от локално хранилище
    return ['Local Data 1', 'Local Data 2'];
  }
}

// Високо ниво на модул, който зависи от абстракцията, а не от детайлите
class DataManager {
  final DataService _dataService; // Зависимост от абстракцията

  DataManager(this._dataService); // Внедряване на зависимостта (инверсия)

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

// Използване
void main() {
  final apiService = ApiDataService();
  final localService = LocalDataService();

  final apiManager = DataManager(apiService); // Внедряване на ApiDataService
  final localManager = DataManager(localService); // Внедряване на LocalDataService

  // ... използване на apiManager или localManager
}