Qaramlik inversiyasi printsipi - Dependency inversion principle

Yilda ob'ektga yo'naltirilgan dizayn, qaramlik inversiyasi printsipi ning o'ziga xos shakli ajratish dasturiy ta'minot modullar. Ushbu printsipga rioya qilishda odatiy qaramlik yuqori darajadagi, siyosatni belgilaydigan modullardan past darajadagi, qaramlik modullariga o'rnatiladigan aloqalar teskari bo'lib, yuqori darajadagi modullarni past darajadagi modulni amalga oshirish tafsilotlaridan mustaqil ravishda ta'minlaydi. Ushbu printsipda quyidagilar ko'rsatilgan:[1]

  1. Yuqori darajadagi modullar past darajadagi modullarga bog'liq bo'lmasligi kerak. Ikkalasi ham abstraktsiyalarga (masalan, interfeyslarga) bog'liq bo'lishi kerak.
  2. Abstraktsiyalar tafsilotlarga bog'liq bo'lmasligi kerak. Tafsilotlar (aniq dasturlar) abstraktsiyalarga bog'liq bo'lishi kerak.

Shuni amr qilib ikkalasi ham yuqori va past darajadagi ob'ektlar bir xil mavhumlikka, ushbu dizayn printsipiga bog'liq bo'lishi kerak inverts ba'zi odamlar ob'ektga yo'naltirilgan dasturlash haqida o'ylashlari mumkin bo'lgan yo'l.[2]

Ushbu tamoyilning A va B punktlari g'oyasi shundan iboratki, yuqori darajadagi modul va past darajadagi o'zaro ta'sirni loyihalashda o'zaro ta'sirni ular orasidagi mavhum o'zaro ta'sir deb hisoblash kerak. Bu nafaqat yuqori darajadagi modulni loyihalashtirishga, balki past darajadagi modulga ham ta'sir qiladi: past darajali o'zaro ta'sirni hisobga olgan holda ishlab chiqilishi kerak va undan foydalanish interfeysini o'zgartirish kerak bo'lishi mumkin.

Ko'pgina hollarda o'zaro ta'sirlashishni mavhum tushuncha sifatida o'ylash, qo'shimcha kodlash modellarini kiritmasdan, tarkibiy qismlarning bog'lanishini kamaytirishga imkon beradi, bu faqat engilroq va kamroq amalga oshirishga bog'liq bo'lgan o'zaro ta'sir sxemasiga imkon beradi.

Ikki modul o'rtasida aniqlangan o'zaro ta'sir o'tkazish sxemasi (lar) umumiy bo'lsa va umumlashtirish mantiqiy bo'lsa, ushbu dizayn printsipi quyidagi qaramlikni inversiya kodlash uslubiga olib keladi.

An'anaviy qatlamlar naqshlari

An'anaviy dastur me'morchiligida quyi darajadagi komponentlar (masalan, Utility Layer) tobora murakkablashib borayotgan tizimlarni yaratishga imkon beradigan yuqori darajadagi komponentlar (masalan, Policy Layer) tomonidan iste'mol qilish uchun mo'ljallangan. Ushbu tarkibda yuqori darajadagi komponentlar ba'zi bir vazifalarni bajarish uchun to'g'ridan-to'g'ri quyi darajadagi tarkibiy qismlarga bog'liqdir. Bu quyi darajadagi tarkibiy qismlarga bog'liqlik yuqori darajadagi tarkibiy qismlarni qayta ishlatish imkoniyatlarini cheklaydi.[1]

An'anaviy qatlamlar Pattern.png

Qarama-qarshilikning teskari yo'nalishining maqsadi mavhum qatlam vositachiligi bilan ushbu yuqori darajada taqsimlanishdan qochish va yuqori / siyosat qatlamlarining qayta ishlatilishini oshirishdir.

Qarama-qarshilik inversiyasining shakli

Abstrakt qatlam qo'shilishi bilan yuqori va quyi darajadagi qatlamlar an'anaviy bog'liqliklarni yuqoridan pastgacha kamaytiradi. Shunga qaramay, "inversiya" tushunchasi quyi darajadagi qatlamlar yuqori darajadagi qatlamlarga bog'liq degani emas. Ikkala qatlam ham yuqori darajadagi qatlamlar uchun zarur bo'lgan xatti-harakatlarni keltirib chiqaradigan abstraktsiyalarga bog'liq bo'lishi kerak.

DIPLayersPattern.png

To'g'ridan-to'g'ri bog'liqlik inversiyasini qo'llashda tezislar yuqori / siyosat qatlamlariga tegishli. Ushbu arxitektura yuqori / siyosat komponentlarini va pastroq xizmatlarni aniqlaydigan abstraktsiyalarni bir paketga birlashtiradi. Quyi darajadagi qatlamlar ularni meros qilib olish / amalga oshirish orqali yaratiladi mavhum darslar yoki interfeyslar.[1]

Qarama-qarshiliklar va egaliklarning teskari tomoni yuqori / siyosiy qatlamlarning qayta ishlatilishini rag'batlantiradi. Yuqori qatlamlar pastki xizmatlarning boshqa dasturlaridan foydalanishi mumkin. Pastki darajadagi qatlam komponentlari yopilganda yoki dastur mavjud xizmatlardan qayta foydalanishni talab qilganda, odatda an Adapter xizmatlar va abstraktlar o'rtasida vositachilik qiladi.

Bog'liqlik inversiyasi naqshini umumlashtirish

Ko'pgina loyihalarda qaramlik inversiyasi printsipi va sxemasi umumlashtirilishi kerak bo'lgan yagona tushuncha sifatida qaraladi, ya'ni dastur modullari orasidagi barcha interfeyslarga tatbiq etiladi. Buning kamida ikkita sababi bor:

  1. Yaxshi fikrlash printsipini kodlash usuli sifatida ko'rish osonroq. Mavhum sinf yoki interfeys kodlanganidan so'ng, dasturchi: "Men abstraktsiya ishini bajardim", deyishi mumkin.
  2. Chunki ko'pchilik birlik sinovi amalga oshirish uchun vositalar merosga tayanadi masxara qilish, sinflar o'rtasida umumiy interfeyslardan foydalanish (faqat umumiylikdan foydalanish mantiqan bo'lgan modullar orasida emas).

Agar ishlatilgan masxara qilish vositasi faqat merosga asoslangan bo'lsa, qaramlik inversiyasi sxemasini keng qo'llash zarurati tug'ilishi mumkin. Buning katta kamchiliklari bor:

  1. Faqatgina interfeysni sinf orqali amalga oshirish ulanishni kamaytirish uchun etarli emas; faqat o'zaro ta'sirlarning mumkin bo'lgan mavhumligi haqida o'ylash kamroq bog'langan dizaynga olib kelishi mumkin.
  2. Loyihada hamma joyda umumiy interfeyslarni tatbiq etish tushunish va saqlashni qiyinlashtiradi. Har bir qadamda o'quvchi o'zidan ushbu interfeysning qanday boshqa tatbiqlari borligini so'raydi va javob odatda: faqat masxara qiladi.
  3. Interfeysni umumlashtirish ko'proq sanitariya-tesisat kodlarini talab qiladi, xususan, odatda qaramlikka qarshi tizimga tayanadigan fabrikalar.
  4. Interfeysni umumlashtirish, shuningdek, dasturlash tilidan foydalanishni cheklaydi.

Umumlashtirish cheklovlari

Dependency Inversion Pattern (DIP) ni bajarish uchun interfeyslarning mavjudligi boshqa dizayn ta'siriga ega ob'ektga yo'naltirilgan dastur:

  • Sinfdagi barcha a'zo o'zgaruvchilar interfeyslar yoki referatlar bo'lishi kerak.
  • Barcha beton sinf paketlari faqat interfeys yoki mavhum sinf paketlari orqali ulanishi kerak.
  • Hech qanday sinf aniq sinfdan kelib chiqmasligi kerak.
  • Hech qanday usul amalga oshirilgan usulni bekor qilmasligi kerak.[1]
  • Barcha o'zgaruvchan instantatsiya a-ni amalga oshirishni talab qiladi ijodiy naqsh kabi zavod usuli yoki zavod naqsh yoki a dan foydalanish qaramlik-in'ektsiya ramka.

Interfeysni masxara qilishga cheklovlar

Merosga asoslangan masxara qilish vositalaridan foydalanish cheklovlarni ham keltirib chiqaradi:

  • Statik tashqi ko'rinadigan a'zolar muntazam ravishda qaramlik in'ektsiyasiga tayanib, ularni amalga oshirishni ancha qiyinlashtiradi.
  • Barcha tekshiriladigan usullar interfeysni amalga oshirishi yoki mavhum ta'rifni bekor qilishi kerak.

Kelajakdagi yo'nalishlar

Printsiplar - fikrlash usullari. Naqsh - bu muammolarni hal qilishning keng tarqalgan usullari. Kodlash naqshlarida dasturlash tilining xususiyatlari etishmayotgan bo'lishi mumkin.

  • Dasturlash tillari kamida ikkita yo'nalishda: foydalanish shartlarini (oldingi, keyingi va o'zgarmas shartlar) va davlatga asoslangan interfeyslarni kuchaytirish uchun yanada kuchli va aniqroq foydalanish shartnomalarini amalga oshirishga imkon berish uchun rivojlanishda davom etadi. Bu, ehtimol, ko'p holatlarda qaramlik inversiyasi naqshini yanada kuchliroq qo'llashni rag'batlantiradi va soddalashtiradi.
  • Endi ko'proq masxara qiluvchi vositalardan foydalanilmoqda qaramlik-in'ektsiya statik va virtual bo'lmagan a'zolarni almashtirish masalasini hal qilish. Dasturlash tillari, ehtimol, masxara qilishga mos bayt kodini yaratish uchun rivojlanadi. Bitta yo'nalish virtual bo'lmagan a'zolardan foydalanishni cheklash bo'ladi. Ikkinchisi, hech bo'lmaganda sinov holatlarida, merosga asoslangan bo'lmagan masxara qilishga imkon beradigan bayt kodini yaratishdir.

Amaliyotlar

DIP-ning ikkita keng tarqalgan dasturlari o'xshash mantiqiy arxitekturadan foydalanadi, ammo har xil ta'sirga ega.

To'g'ridan-to'g'ri amalga oshirish siyosat sinflarini bitta kutubxonada xizmat ko'rsatish abstraktlari sinflari bilan paketlaydi. Ushbu dasturda yuqori darajadagi komponentlar va past darajadagi komponentlar alohida paketlarga / kutubxonalarga tarqatiladi, bu erda interfeyslar yuqori darajadagi komponent talab qiladigan xatti-harakatlarni / xizmatlarni aniqlash yuqori darajadagi komponentlar kutubxonasiga tegishli va mavjud. Yuqori darajadagi komponent interfeysini past darajadagi komponent tomonidan amalga oshirilishi uchun quyi darajadagi komponentlar to'plami kompilyatsiya uchun yuqori darajadagi tarkibiy qismga bog'liq bo'lishini talab qiladi va shu bilan odatdagi bog'liqlik munosabatini o'zgartiradi.

Dependency inversion.png

Shakllar 1 va 2 xuddi shu funktsiyaga ega kodni aks ettiradi, ammo 2-rasmda qaramlikni teskari yo'naltirish uchun interfeys ishlatilgan. Siyosat kodini qayta ishlatishni maksimal darajaga ko'tarish va tsiklik bog'liqliklarni yo'q qilish uchun qaramlik yo'nalishini tanlash mumkin.

DIPning ushbu versiyasida pastki qavat komponentasining yuqori darajadagi qavatdagi interfeyslarga / abstraktlarga bog'liqligi pastki qavat komponentlaridan qayta foydalanishni qiyinlashtiradi. Ushbu amalga oshirish o'rniga ″ teskari depend an'anaviy bog'liqlik yuqoridan pastga qarama-qarshi tomonga, pastdan yuqoriga.

Keyinchalik moslashuvchan echim mavhum komponentlarni mustaqil to'plamlar to'plamiga / kutubxonalariga ajratib beradi:

DIPLayersPattern v2.png

Har bir qatlamni o'z paketiga ajratish har qanday qatlamni qayta ishlashga undaydi, bu esa mustahkamlik va harakatchanlikni ta'minlaydi.[1]

Misollar

Nasabiy modul

Nasabiy tizim odamlar o'rtasidagi munosabatlarni ular o'rtasidagi to'g'ridan-to'g'ri munosabatlar grafigi (otasi - o'g'il, ota - qiz, ona - o'g'il, ona - qiz, er - xotin, xotin - er va boshqalar) sifatida ifodalashi mumkin. Bu juda samarali va kengaytiriladi, chunki sobiq erini yoki qonuniy vakilini qo'shish oson.

Ammo ba'zi yuqori darajadagi modullar tizimni ko'rib chiqishning sodda usulini talab qilishi mumkin: har qanday odamning bolalari, ota-onalari, aka-ukalari (shu jumladan yarim aka-ukalar va opa-singillar), bobo-buvisi, amakivachchalari va boshqalar bo'lishi mumkin.

Nasabiy moduldan foydalanishga qarab, umumiy munosabatlarni aniq to'g'ridan-to'g'ri xususiyatlar sifatida taqdim etish (grafikni yashirish) yuqori darajadagi modul va nasab-nasab moduli o'rtasidagi bog'lanishni ancha yengillashtiradi va to'g'ridan-to'g'ri munosabatlarning ichki ko'rinishini butunlay o'zgartirishga imkon beradi. ulardan foydalanadigan modullarga hech qanday ta'sir ko'rsatmasdan. Shuningdek, u nasab-nasab moduliga birodarlar yoki amakilarning aniq ta'riflarini kiritishga imkon beradi, shuning uchun yagona javobgarlik printsipi.

Va nihoyat, agar birinchi kengaytiriladigan umumlashtirilgan grafik yondashuv eng kengaytiriladigan ko'rinadigan bo'lsa, nasab-nasab modulidan foydalanish ilova (lar) uchun yanada ixtisoslashgan va sodda munosabatlarni amalga oshirish etarli ekanligini va yanada samarali tizimni yaratishga yordam berishini ko'rsatishi mumkin.

Ushbu misolda modullar o'rtasidagi o'zaro aloqani abstrakt qilish quyi darajadagi modulning soddalashtirilgan interfeysiga olib keladi va uni sodda bajarilishiga olib kelishi mumkin.

Masofaviy fayl serveri mijozi

Mijozni masofaviy fayl serveriga (FTP, bulutli saqlash ...) amalga oshirishingiz kerakligini tasavvur qiling. Siz buni mavhum interfeyslar to'plami deb o'ylashingiz mumkin:

  1. Ulanish / uzilish (ulanishning doimiy qatlami kerak bo'lishi mumkin)
  2. Papka / teglar yaratish / qayta nomlash / o'chirish / ro'yxat interfeysi
  3. Fayl yaratish / almashtirish / nomini o'zgartirish / o'chirish / o'qish interfeysi
  4. Fayl qidirish
  5. Bir vaqtning o'zida almashtirish yoki piksellar sonini o'chirish
  6. Fayl tarixini boshqarish ...

Agar mahalliy fayllar ham, masofaviy fayllar ham bir xil mavhum interfeyslarni taklif qilsa, mahalliy fayllardan foydalanadigan va qaramlik inversiyasini to'liq bajaradigan har qanday yuqori darajadagi modul mahalliy va uzoqdagi fayllarga bemalol kirish imkoniyatiga ega bo'ladi.

Mahalliy disk odatda papkadan foydalanadi, masofaviy xotira papkadan va / yoki teglardan foydalanishi mumkin. Agar iloji bo'lsa, ularni qanday qilib birlashtirish kerakligini hal qilishingiz kerak.

Masofaviy faylda biz faqat yaratish yoki almashtirishni ishlatishimiz kerak bo'lishi mumkin: masofaviy fayllarni yangilash shart emas, chunki tasodifiy yangilanish mahalliy fayllarni tasodifiy yangilash bilan taqqoslaganda juda sekin va uni amalga oshirish juda murakkab bo'lishi mumkin). Masofaviy faylda qisman o'qish va yozish kerak bo'lishi mumkin (hech bo'lmaganda masofaviy fayl moduli ichida aloqa to'xtatilgandan so'ng yuklab olish yoki yuklashni tiklashga imkon berish uchun), ammo tasodifiy o'qish moslashtirilmagan (mahalliy keshdan tashqari).

Fayllarni qidirish ulanishi mumkin: fayllarni qidirish operatsion tizimga, xususan yorliq yoki to'liq matnli qidiruvga bog'liq bo'lishi mumkin, alohida tizimlar bilan amalga oshirilishi mumkin (OS o'rnatilgan yoki alohida mavjud).

Bir vaqtning o'zida almashtirish yoki o'chirishni aniqlashni aniqlash boshqa mavhum interfeyslarga ta'sir qilishi mumkin.

Masofaviy fayl-server mijozini har bir kontseptual interfeys uchun loyihalashda o'zingizdan yuqori darajadagi modullaringiz talab qilinadigan xizmat darajasi (ularning hammasi kerak emas) va nafaqat masofaviy fayllar serverining funktsiyalarini qanday amalga oshirish kerakligi, balki faylni qanday yaratishni so'rashingiz kerak. ilovangizdagi xizmatlar allaqachon amalga oshirilgan fayl xizmatlari (mahalliy fayllar, mavjud bulutli mijozlar) va yangi masofaviy fayl-server mijozingiz o'rtasida mos keladi.

Kerakli mavhum interfeyslarni ishlab chiqqandan so'ng, masofaviy fayl-server mijozingiz ushbu interfeyslarni amalga oshirishi kerak. Ehtimol, mahalliy faylda mavjud bo'lgan ba'zi bir mahalliy funktsiyalarni cheklaganingiz sababli (masalan, faylni yangilash), yozishingiz kerak bo'lishi mumkin adapterlar mahalliy yoki boshqa mavjud ishlatilgan masofaviy fayllarga kirish modullari uchun har biri bir xil mavhum interfeyslarni taklif qiladi. Siz o'zingizning kompyuteringizda mavjud bo'lgan va tuzilgan barcha fayllarga mos tizimlarni olishga imkon beradigan o'zingizning faylga kirish ro'yxatini yozishingiz kerak.

Buni amalga oshirgandan so'ng, sizning arizangiz o'z hujjatlarini mahalliy yoki masofadan turib shaffof ravishda saqlash imkoniyatiga ega bo'ladi. Yoki oddiyroq, yangi faylga kirish interfeyslaridan foydalangan holda yuqori darajadagi modul mahalliy yoki masofaviy fayllarga kirish ssenariylarida noaniq holda ishlatilishi mumkin.

Izoh: ko'plab operatsion tizimlar ushbu funktsiyalarni amalga oshirishni boshladilar va sizning ishingiz yangi mijozingizni ushbu mavhum modellarga moslashtirish uchun cheklangan bo'lishi mumkin.

Ushbu misolda modulni mavhum interfeyslar to'plami deb o'ylash va boshqa modullarni ushbu interfeyslar to'plamiga moslashtirish ko'plab fayllarni saqlash tizimlari uchun umumiy interfeysni ta'minlashga imkon beradi.

Model ko'rinishini tekshirgich

DIP namunasi

UI va ApplicationLayer paketlari asosan aniq sinflarni o'z ichiga oladi. Tekshirgichlarda abstraktlar / interfeys turlari mavjud. UIda ICustomerHandler misoli mavjud. Barcha paketlar jismonan ajratilgan. ApplicationLayer-da sahifa sinfi foydalanadigan aniq dastur mavjud. Ushbu interfeysning nusxalari Factory tomonidan dinamik ravishda yaratiladi (ehtimol o'sha Controllers paketida). Page va CustomerHandler-ning aniq turlari bir-biriga bog'liq emas; ikkalasi ham ICustomerHandler-ga bog'liq.

To'g'ridan-to'g'ri ta'sir, foydalanuvchi interfeysi uchun ApplicationLayer yoki ICustomerHandler dasturini amalga oshiradigan har qanday aniq paketga murojaat qilishning hojati yo'q. Beton sinf aks ettirish yordamida yuklanadi. Istalgan vaqtda UI sinfini o'zgartirmasdan aniq amalga oshirishni boshqa aniq dastur bilan almashtirish mumkin. Yana bir qiziq ehtimoli shundaki, Page klassi ICustomerHandler usullariga argument sifatida o'tishi mumkin bo'lgan IPageViewer interfeysini amalga oshiradi. Keyinchalik aniq dastur UI bilan aniq bog'liqliksiz aloqa o'rnatishi mumkin. Shunga qaramay, ikkalasi ham interfeyslar bilan bog'langan.

Tegishli naqshlar

Bog'liqlik inversiyasi printsipini qo'llashni misol sifatida ham ko'rish mumkin adapter naqshlari, ya'ni yuqori darajadagi sinf o'zining adapter interfeysini belgilaydi, bu boshqa yuqori darajadagi sinflar bog'liq bo'lgan mavhumlikdir. Adaptni amalga oshirish, shuningdek, adapter interfeysining abstraktsiyasiga bog'liq (albatta, chunki u o'zining interfeysini amalga oshiradi), lekin uni o'zining past darajadagi moduli ichidan kod yordamida amalga oshirish mumkin. Yuqori darajadagi past darajadagi modulga bog'liqlik yo'q, chunki u adapter interfeysi orqali bilvosita bilvosita adapter interfeysi orqali polimorfik usullarni chaqirish orqali moslashtiruvchi va uning past darajadagi moduli tomonidan qo'llaniladi.

Plugin kabi turli xil naqshlar, Xizmat topuvchisi, yoki Qarama-qarshi in'ektsiya tanlangan past darajadagi komponentni yuqori darajadagi tarkibiy qismga etkazib berish muddatini ta'minlashga ko'maklashish uchun foydalaniladi.

Tarix

Qarama-qarshilik inversiyasi printsipi tomonidan e'lon qilingan Robert C. Martin va bir nechta nashrlarda, shu jumladan qog'ozda tasvirlangan Ob'ektga yo'naltirilgan dizayni sifat ko'rsatkichlari: bog'liqliklarni tahlil qilish,[3] 1996 yil may oyida C ++ hisobotida paydo bo'lgan maqola Qarama-qarshilikni o'zgartirish printsipi,[4] va kitoblar Tezkor dasturiy ta'minotni ishlab chiqish, printsiplari, naqshlari va amaliyoti,[1] va Tezkor printsiplar, naqshlar va amaliyot C #.

Shuningdek qarang

Adabiyotlar

  1. ^ a b v d e f Martin, Robert C. (2003). Tezkor dasturiy ta'minotni ishlab chiqish, printsiplari, naqshlari va amaliyoti. Prentice Hall. 127-131 betlar. ISBN  978-0135974445.
  2. ^ Freeman, Erik; Friman, Elisabet; Keti, Syerra; Bert, Bates (2004). Xendrikson, Mayk; Loukides, Mayk (tahrir). Birinchi dizayn naqshlarini boshlang (qog'ozli). 1. O'REILLY. ISBN  978-0-596-00712-6. Olingan 2012-06-21.
  3. ^ Martin, Robert C. (1994 yil oktyabr). "Ob'ektga yo'naltirilgan dizaynning sifat ko'rsatkichlari: bog'liqliklarni tahlil qilish" (PDF). Olingan 2016-10-15.
  4. ^ Martin, Robert C. (1996 yil may). "Qarama-qarshilikni qaytarish printsipi" (PDF). C ++ hisoboti. Arxivlandi asl nusxasi (PDF) 2011-07-14.

Tashqi havolalar