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.