8.1 Dekompozitsiya – eng muhimi
Ma'lumot olish uchun yaxshi maqoladan "Decoupling of Object-Oriented Systems" rasmiga qarang, bu yerda muhokama qilinadigan asosiy punktlar tasvirlangan.
Senga hali ham dasturiy arxitektura loyihalash osondek ko'rinadimi?
8.2 Interfeyslar, realizatsiyani yashirish
Sistemani bog‘lanishini kamaytirish uchun muhim bo‘lgan narsa OOP prinsiplari va ular ortida turgan Inkapsulyatsiya + Abstraktsiya + Polimorfizm printsiplari.
Aniqrog‘i shu sababdan:
- Modullar bir-birlari uchun "qora qutilar" bo‘lishlari kerak (inkapsulyatsiya). Bu degani, bir modul boshqa modulning ichki tuzilmasiga "kirish" qilmasligi va u haqda hech narsa bilmasligi kerak. Bir sub-tizimning obyektlari boshqa sub-tizimning obyektlariga to‘g‘ridan-to‘g‘ri murojaat qilmasliklari kerak.
- Modullar/subtizimlar bir-birlari bilan faqat interfeyslar orqali o‘zaro aloqa qilishlari kerak (ya'ni abstraktsiyalar, realizatsiya detallaridan mustaqil bo‘lgan). Shu sababdan har bir modul boshqa modullar bilan o‘zaro aloqasi uchun aniq belgilangan interfeys yoki interfeyslarga ega bo‘lishi kerak.
"Qora quti" printsipi (inkapsulyatsiya) har bir subtizimning tuzilishini boshqa subtizimlardan mustaqil ravishda ko‘rib chiqishga imkon beradi. “Qora quti” bo‘lgan modulni nisbiy erkin o‘zgartirish mumkin. Muammolar faqat turli modullarning (yoki modul va muhitning) tutashgan joylarida yuzaga kelishi mumkin.
Mana shu o‘zaro aloqani maksimal darajada umumiy (abstrakt) shaklda, ya’ni interfeys shaklida ta’riflash kerak. Bu holda kod interfeysning shartnomasiga mos keladigan har qanday realizatsiya bilan bir xil ishlaydi. Bu imkoniyat turli realizatsiyalar (modul yoki obyektlar) bilan yagona interfeys orqali ishlash va polimorfizm deyiladi.
Shuning uchun Servlet – bu interfeys: web-konteyner servislar haqida hech narsa bilmaydi, u uchun bu interfeys Servletni amalga oshiradigan obyektlar, xolos. Servislar ham konteynerning tuzilishi haqida ozgina ma'lumotga ega. Servlet interfeysi - bu shartnoma, bu standart, Java web-ilovalari dunyoni zabt etishi uchun zarur minimal o‘zaro aloqa.
Polimorfizm — bu umuman olganda metodlarni qayta aniqlash emas, balki avvalo — bir xil interfeysga ega modullar/obyektlarni o‘zaro almashtirish yoki "bitta interfeys, ko'plab realizatsiyalar". Polimorfizmni amalga oshirish uchun meros olish mexanizmi umuman kerak emas. Bu juda muhim, chunki umuman olganda, imkon qadar, meros olishdan qochish kerak.
Interfeyslar va polimorfizm tufayli mavjud kodni o‘zgartirmasdan modifikatsiya qilish va kengaytirish imkoniyati mavjud (Open-Closed Principle).
Modullar o‘zaro aloqasi faqat interfeyslar shaklida ta’riflangan va aniq realizatsiyalarga bog‘liq bo‘lmagan paytgacha, tizim uchun "og‘riqsiz" bir modulni boshqa interfeysni amalga oshiradigan boshqa modulla almashtirish imkoni mavjud, shuningdek, yangi qo‘shish va shu bilan funksionallikni kengaytirish.
Bu LEGO konstruktori kabi — interfeys o‘zaro aloqani standartiqlashtiradi va har qanday mos modulni ulash imkoni beradi.
Konstruktorning moslashuvchanligini ta’minlash shundan iboratki, biz oddiygina bir modul yoki detallarni boshqa mos ulanish (bir xil interfeys)ga ega bo‘lganlariga almashtirib, shuningdek, qancha xohlasak yangi detallarni qo‘shishimiz mumkin (mavjud detallar hech qanday o‘zgartirilmaydi va qayta ishlanmaydi).
Interfeyslar har bir subtizimni yagona bir butun sifatida ko‘rib, uning ichki tuzilmalarini e’tiborsiz o‘tkazib, sodda tizim yaratishga imkon beradi. Ular modullarni o‘zaro aloqa qilish imkonini beradi va bir-birlarining ichki tuzilmalari haqida hech narsa bilmasdan, shu bilan zaif bog‘lanishning asosi bo‘lgan minimal bilim prinsipi to‘liq amalga oshiriladi.
Interfeyslar qanchalik umumiy/abstrakt shaklda belgilansa va qanchalik kam cheklov qo‘ysa, tizim shunchalik moslashuvchan bo‘ladi. Bu yerda yana SOLIDning boshqa bir printsipi kelib chiqadi — Interfeysning segmentatsiya printsipi (Interface Segregation Principle), u "yo‘g‘on interfeyslar"ga qarshi chiqadi.
U katta, keng interfeyslarni kichikroq va aniqrog‘iga bo‘lish kerakligini aytadi, shunda kichik interfeyslarning mijozlari (bog‘liq modullar) faqat ularga zarur bo‘lgan metodlar haqida bilishadi.
Bu printsip quyidagi tarzda ifodalanadi: "Mijozlar ulardan foydalanmaydigan metodlarga bog‘liq bo‘lmasligi kerak" yoki "Ko‘p mutaxassislashtirilgan interfeyslar, bitta universal interfeysdan yaxshiroqdir".
Shunday qilib, zaif bog‘liqlik, modullar o‘zaro aloqasi va bog‘liqligi faqat interfeyslar yordamida ta’riflanganda, ya’ni abstraktsiyalar orqali, ularning ichki tuzilishi va strukturalari haqida ma’lumotnarsiz ta’minlanadi. Shu bilan, inkapsulyatsiya amalga oshiriladi. Plus, biz turli xil realizatsiyalarni qo‘shish va ishlatish orqali tizimning xatti-harakatlarini kengaytirish/o‘zgartirish imkoniyatiga ega bo‘lamiz, ya’ni polimorfizm hisobiga. Ha, biz yana OOP ga keldik - Inkapsulyatsiya, Abstraktsiya, Polimorfizm.
8.3 Fasod: modul interfeysi
Bu yerda tajribali dasturchi so‘raydi: agar loyihalash obyektlar darajasida emas, modullar darajasida amalga oshirilsa, modul interfeysini amalga oshirish nima bo‘lishi mumkin?
Javob: Dizayn shablonlari tili bilan aytganda, modul interfeysini amalga oshirish uchun maxsus obyekt - Fasad mas'ul bo'lishi mumkin. Agar metodlarni Gateway sufiksi bilan chaqirsangiz (masalan, MobileApiGateway), unda ehtimol bu fasad.
Fasad — bu obyekt-interfeys, u o‘zida yuqori darajadagi amaliyotlar to‘plamini yig‘adi, uning ortida ichki tuzilma va haqiqiy murakkablik yashiringan. Subtizimni amalga oshirishdagi o‘zgarishlardan himoya qiladi. Bitta kirish nuqtasi bo‘lib xizmat qiladi - "sen fasadni urasan, va u bu subtizimda kerakli narsani olish uchun kimni urish kerakligini biladi".
Siz endigina interfeyslar tushunchasini modullar loyihalashda qo‘llash va ularning bog‘lanishini yumshatish imkonini beruvchi eng muhim dizayn andozalaridan biri — “Fasad” bilan tanishdingiz.
Bundan tashqari, “Fasad” modullar bilan oddiy obyektlar kabi ishlash imkonini beradi va modullar loyihalashda sinflarni loyihalashda qo‘llaniladigan barcha foydali printsiplar va texnikalarni qo‘llash imkoniyatini beradi.
Eslatma: ko‘pchilik dasturchilar sinflar (obyektlar)ni loyihalashda interfeyslar muhimligini tushunishiga qaramasdan, modul naqshlar darajasida interfeyslarni qo‘llash zarurligi haqidagi g‘oya ko‘pchilik tomonidan o‘zlarining kashfiyotlari deyilgan ko‘rinadi.
GO TO FULL VERSION