Flutter Dev Talk
#ARCH-4 DIP - Dependency Inversion Principle
4.1: SOLID ning D tamoyili yani Dependency Inversion (o'zbekcha aytganda teskari bog'liqlik) nima ? Nima uchun ishlatiladi ? Nima foydasi bor ?
Dependency Inversion - soddaroq aytganda:
Biznes logika texnik detallarni bilmasligi kerak.
E aka bu ham bo'lganku, sal soddalashtiringee desangiz hop unda yanada soddalashtiraman.
Quyidagicha flow bor:
Transfer → Confirmation → Bill → Payment
va buni biz oddiygina Payment bloc ichida yozib qo'ya qolsak bo'ladi:
class PaymentBloc {
final Dio dio = Dio();
Future<void> pay() async {
await dio.post('/payment');
}
}
Lekin bloc bu holatda 2 narsadan habardor bo'lib qoladi: PaymentBloc biznes flowni va http request qanday ketayotganini. Mobodo ertaga api o'zgarsa, qo'shimcha validatsiya qo'shilsa yoki test yozmoqchi bo'lsak biznes qismga tegishga to'g'ri keladi.
DIP ni qo'llamasdan oldin dependency yo'nalish quydagicha edi:
PaymentBloc
↓
Dio
↓
Backend
DIP bilan esa shu ko'rinishga keladi:
PaymentBloc
↓
PaymentRepository ← abstraction
↑
PaymentRepositoryImpl
↓
Dio
↓
Backend
va PaymentBloc esa ushbu holatga keladi:
class PaymentBloc {
final PaymentRepository repository;
PaymentBloc(this.repository);
Future<void> pay() async {
await repository.pay();
}
}
quyi qismlarni o'zilar tushunvoldilar degan umiddaman.
Hop endi nima o'zgardi ?. Endi PaymentBloc hechnimadan habari yoq shunchaki menga pay qilish uchun nimadir berilar deydi holos. Va agar endi api o'zgarsa yoki boshqa service qilinsa PaymentBloc ga umman qiziq emas u faqat pay uchun service kutadi holos. o'zgarishlar esa pastki texnik qisimlarda yuz beradi.
Manashu yerda Dependency Inversion'ning manosi chiqadi. Ya'ni texnik o'zgarishlar biznes qoidalarga moslashishi kerak, biznes qoidalar texnik o'zgarishlarga emas.
4.2: Endi esa DIP bilan DI ni farqini aniqlashtirvolamiz.
Dependency Inversion - prinsip. Dependency Injection - texnika
DIP - Dependency qaysi tomonga qarashi kerakli haqidagi arxitekturaviy qaror.
DI - Dependency objectni klassga qanday yetkazish usuli.
Quyidagi ikki usul ham Dependency Injection hisoblanadi:
PaymentBloc(
PaymentRepositoryImpl(Dio()),
);
get_it bilan
getIt.registerLazySingleton<PaymentRepository>(
() => PaymentRepositoryImpl(getIt<Dio>()),
);
getIt.registerFactory(
() => PaymentBloc(getIt<PaymentRepository>()),
);
Xulos: Senior sifatida arxitektura qurayotkanda dependency yo'nalishlarni to'g'ri qurish keyinchalik ko'dlarni o'zgarish chegaralari boshqarish va oson testlashga yordam beradi.
1 · 126 ·