Sobes.tech
Middle

SOLID'dagi D tamoyili haqida nima deyish mumkin?

sobes.tech AI

AIdan javob

Dependency Inversion Principle (DIP) aytadi:

  • Yuqori darajali modullar pastki darajali modullarga bog‘liq bo‘lmasligi kerak. Ikkala turdagi modullar ham abstraktsiyalarga bog‘liq bo‘lishi kerak.
  • Abstraktsiyalar detallariga bog‘liq bo‘lmasligi kerak. Detallar abstraktsiyalarga bog‘liq bo‘lishi kerak.

SOLID ichidagi D maqsadi — yuqori darajadagi siyosatlarni past darajadagi amalga oshirishdan ajratish (decoupling). Yuqori darajadagi modul to‘g‘ridan-to‘g‘ri past darajadagi modulning konkret amalga oshirishiga bog‘liq bo‘lmasdan, ikkalasi ham umumiy interfeys yoki abstrakt sinfdan bog‘liq bo‘lishi kerak. Bu kodning moslashuvchanligini, test qilish imkoniyatini va qo‘llab-quvvatlashini oshiradi.

Flutterda bu ko‘pincha abstrakt sinflar yoki mixinlar yordamida kontraktlarni belgilash va ularni konkret sinflar amalga oshirishi bilan namoyon bo‘ladi. Masalan, ma’lumotlar bilan ishlashda:

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

// Past darajadagi amalga oshirish (konkret detail)
class ApiDataService implements DataService {
  @override
  Future<List<String>> getData() async {
    // API dan ma’lumot olish logikasi
    return ['API Data 1', 'API Data 2'];
  }
}

// Boshqa past darajadagi amalga oshirish (boshqa detail)
class LocalDataService implements DataService {
  @override
  Future<List<String>> getData() async {
    // Lokal saqlashdan ma’lumot olish logikasi
    return ['Local Data 1', 'Local Data 2'];
  }
}

// Yuqori darajadagi modul, abstraktsiyaga bog‘liq, detallariga emas
class DataManager {
  final DataService _dataService; // Bog‘liqlik abstraktsiyaga

  DataManager(this._dataService); // Bog‘liqlik in’ektsiya qilinadi (inversion)

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

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

  final apiManager = DataManager(apiService); // ApiDataService in’ektsiya qilinishi
  final localManager = DataManager(localService); // LocalDataService in’ektsiya qilinishi

  // ... apiManager yoki localManager dan foydalanish
}

Ushbu misolda, DataManager (yuqori darajadagi modul) to‘g‘ridan-to‘g‘ri ApiDataService yoki LocalDataServicega bog‘liq emas. U DataService abstraktsiyasiga bog‘liq. DataService ning konkret amalga oshirilishi DataManagerga tashqaridan "in’ektsiya" qilinadi, bu esa bog‘liqliklarning inversiyasining namoyonidir. Bu ma’lumot manbalarini o‘zgartirishni osonlashtiradi, DataManager logikasini o‘zgartirmasdan.