Sobes.tech
Middle

SOLIDтеги D принциби жөнүндө эмне айта аласыз?

sobes.tech AI

AIден жооп

Dependency Inversion Principle (DIP) деп аталат:

  • Жогорку деңгээлдеги модулдар төмөнкү деңгээлдеги модулдарга көз каранды болбошу керек. Эки түрү модулдар абстракциялардан көз каранды болушу керек.
  • Абстракциялар деталдардан көз каранды болбошу керек. Деталдар абстракциялардан көз каранды болушу керек.

SOLIDтин D максаты — жогорку деңгээл саясаты менен төмөнкү деңгээл ишке ашырылышын ажыратуу (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 колдонуу
}