Guruh raqami: 15-18 Variant raqami: Savollar


Download 318.9 Kb.
bet7/7
Sana02.01.2022
Hajmi318.9 Kb.
#193124
1   2   3   4   5   6   7
Bog'liq
DTTL Yakuniy

3. Ko’prik andoza(Bridge)


Ko'prik andozasi dasturiy ta'minot muhandisligida ishlatiladigan "to'rtlik to'dasi" tomonidan taqdim etilgan "ikkalasi mustaqil ravishda o'zgarib turishi uchun ajralmaslikni amalga oshirishdan ajratish" uchun mo'ljallangan dizayn naqshidir. [1] Ko'prik kapsülleme, birlashma va meros orqali turli sinflarga vazifalarni ajratish uchun foydalanishi mumkin.
Agar sinf tez-tez o'zgarib turadigan bo'lsa, ob'ektga yo'naltirilgan dasturlashning xususiyatlari juda foydali bo'ladi, chunki dastur kodini o'zgartirish dastur haqida minimal bilimga ega bo'lganda osonlikcha amalga oshiriladi. Ko'prik namunasi ikkala sinf va uning ishi tez-tez o'zgarib turganda foydalidir. Sinfning o'zi mavhumlik va sinf amalga oshirishda nima qilishi mumkinligi haqida o'ylash mumkin. Ko'prik naqshini, shuningdek, mavhumlikning ikki qatlami deb hisoblash mumkin.
Faqat bitta aniq dastur mavjud bo'lsa, ushbu naqsh C ++ dunyosida Pimpl iborasi sifatida tanilgan.
Ko'prik naqshini ko'pincha adapter naqshlari bilan aralashtirib yuborishadi va ko'pincha ob'ekt adapteri naqshlari yordamida amalga oshiradilar; Masalan, quyidagi Java kodida.
Variant: Amaliyot mavjudligini abstraktsiyani ishlatadigan darajaga qoldirib, amalga oshirishni yanada ko'proq ajratish mumkin.

Bridge dizayn andozasi- bu moslashuvchan va qayta ishlatilishi mumkin bo'lgan ob'ektga yo'naltirilgan dasturiy ta'minotni, ya'ni amalga oshirish, o'zgartirish osonroq bo'lgan ob'ektlarni loyihalash uchun takrorlanadigan dizayn muammolarini qanday hal qilishni tavsiflovchi GoF dizaynining yigirma uchta naqshlaridan biri. sinovdan o'tkazing va qayta ishlating.


Ko'prik dizayni namunasi qanday muammolarni hal qilishi mumkin?
Abstraktsiya va uni amalga oshirish bir-biridan mustaqil ravishda belgilanishi va kengaytirilishi kerak.

Abstraktsiya va uni amalga oshirish o'rtasida kompilyatsiya vaqtini bog'lashdan qochish kerak, shunda bajarilish vaqtida tanlanishi mumkin.

Subklassingni ishlatishda turli subklasslar mavhum sinfni har xil usulda amalga oshiradilar. Ammo dastur kompilyatsiya vaqtida abstraktsiya bilan bog'liq va uni ish vaqtida o'zgartirish mumkin emas.
Ko'prik dizayni namunasi qanday echimni tasvirlaydi?
Abstraktsiyani (Abstraktsiya) uni amalga oshirishdan (Implementor) ajratib, ularni alohida sinf iyerarxiyalariga joylashtiring.

Abstraktsiyani amalga oshiruvchi ob'ekti (vakolat berish yo'li bilan) bo'yicha amalga oshiring.

Bu Abstraktsiyani bajaruvchi ob'ekti bilan ish vaqtida sozlash imkonini beradi.

Quyidagi Unified Modeling Language sinfiga va ketma-ketlik diagrammasiga qarang.



Strukturasi:

Yuqoridagi Unified Modeling Language sinf diagrammasida abstraktsiya (Abstraktsiya) odatdagidek bitta meros ierarxiyasida amalga oshirilmaydi. Buning o'rniga abstraktsiya uchun bitta ierarxiya (Abstraktsiya) va uni amalga oshirish uchun alohida ierarxiya mavjud (Ijrochi), bu ikkalasini bir-biridan mustaqil qiladi. Abstraktsiya interfeysi (operatsiya ()) Amalga oshiruvchi interfeysi (imp.operationImp ()) (vakolat berish orqali) jihatidan amalga oshiriladi.



UML ketma-ketligi diagrammasi ish vaqtidagi o'zaro ta'sirlarni ko'rsatadi: Abstraction1 ob'ekti bajarishni Implementor1 ob'ektiga topshiradi (OperatsionImp () ni Implementor1-ga chaqirish orqali), bu operatsiyani bajaradi va Abstraction1 ga qaytadi.


Klass diagrammasi.
Abstraktsiya (mavhum sinf)

mavhum interfeysni belgilaydi

Ijrochi ma'lumotnomasini saqlaydi.

RefinedAbstraction (normal sinf)

Abstraktsiya tomonidan belgilangan interfeysni kengaytiradi

Amalga oshiruvchi (interfeys)

amalga oshirish sinflari uchun interfeysni belgilaydi

ConcreteImplementor (oddiy sinf)

amalga oshiruvchi interfeysini amalga oshiradi

Ko'prik - bu katta sinfni yoki bir-biriga bog'liq bo'lmagan sinflar to'plamini bir-biridan mustaqil ravishda ishlab chiqilishi mumkin bo'lgan ikkita alohida ierarxiyaga - mavhumlashtirish va amalga oshirishga ajratish imkonini beradigan tizimli dizayn naqshidir.


Aytaylik, sizda geometrik Shape klassi mavjud bo'lib, ular juft sinflarga ega: Doira va Kvadrat. Siz ushbu sinf iyerarxiyasini ranglarni birlashtirish uchun kengaytirmoqchisiz, shuning uchun siz Qizil va Moviy shakl subklasslarini yaratishni rejalashtirmoqdasiz. Biroq, siz allaqachon ikkita kichik sinfga ega bo'lganingiz uchun, siz BlueCircle va RedSquare kabi to'rtta sinf kombinatsiyasini yaratishingiz kerak bo'ladi.

Ierarxiyaga yangi shakl turlari va ranglarini qo'shish uni eksponent ravishda o'sib boradi. Masalan, uchburchak shaklini qo'shish uchun har bir rang uchun bittadan ikkita subklass kiritishingiz kerak bo'ladi. Va bundan keyin yangi rang qo'shish uchun har bir shakl turi uchun uchta subklass yaratishni talab qiladi. Biz qanchalik uzoqlashsak, u shunchalik yomonlashadi.


Ushbu muammo biz shakl sinflarini ikkita mustaqil o'lchamda kengaytirishga harakat qilayotganimiz sababli yuzaga keladi: shakl va rang bo'yicha. Bu sinf merosiga oid juda keng tarqalgan masala.
Bridge naqsh bu muammoni merosdan ob'ekt tarkibiga o'tish orqali hal qilishga urinadi. Buning ma'nosi shundaki, siz o'lchovlardan birini alohida sinf iyerarxiyasiga ajratib olishingiz kerak, shunda asl sinflar barcha ierarxiya ob'ektiga murojaat qilishlari kerak, buning o'rniga uning barcha holatlari va xatti-harakatlari bitta sinf ichida.

Ushbu yondashuvdan so'ng biz rang bilan bog'liq kodni ikkita kichik sinf bilan o'z sinfiga ajratishimiz mumkin: qizil va ko'k. Keyin Shape klassi rang ob'ektlaridan biriga ishora qiluvchi ma'lumot maydonini oladi. Endi shakl bog'langan rang ob'ektiga rang bilan bog'liq har qanday ishni topshirishi mumkin. Ushbu ma'lumot Shape va Color sinflari o'rtasida ko'prik bo'lib xizmat qiladi. Bundan buyon yangi ranglarni qo'shish shakl ierarxiyasini o'zgartirishni talab qilmaydi va aksincha.


Abstraction va Implementation

GoF kitobida ko'prik ta'rifining bir qismi sifatida mavhumlashtirish va amalga oshirish atamalari keltirilgan. Mening fikrimcha, atamalar juda akademik ko'rinadi va naqshni aslidan ko'ra murakkabroq ko'rinishga olib keladi. Oddiy misolni shakllar va ranglar bilan o'qib chiqib, GoF kitobining qo'rqinchli so'zlari ortidagi ma'noni ochib beraylik.
Abstraktsiya (interfeys deb ham yuritiladi) - bu ba'zi bir shaxs uchun yuqori darajadagi boshqaruv qatlami. Ushbu qatlam o'z-o'zidan hech qanday haqiqiy ishni bajarishi kerak emas. Bu ishni dastur qatlamiga topshirishi kerak (platforma deb ham ataladi).
E'tibor bering, biz sizning dasturlash tilingizdagi interfeyslar yoki mavhum darslar haqida gapirmayapmiz. Bu bir xil narsalar emas.
Haqiqiy dasturlar haqida gap ketganda, abstraktsiya grafik foydalanuvchi interfeysi (GUI) bilan ifodalanishi mumkin va amalga oshirish GUI qatlami foydalanuvchi o'zaro ta'siriga javoban chaqiradigan asosiy operatsion tizim kodi (API) bo'lishi mumkin.
Umuman olganda, siz bunday dasturni ikkita mustaqil yo'nalishda kengaytirishingiz mumkin:
Bir nechta turli xil GUI-larga ega bo'ling (masalan, doimiy mijozlar yoki administratorlar uchun moslashtirilgan).

Bir nechta turli xil API-larni qo'llab-quvvatlang (masalan, Windows, Linux va macOS ostida dasturni ishga tushirish uchun).

Eng yomon stsenariyda ushbu dastur ulkan spagetti kosasiga o'xshab ketishi mumkin, bu erda yuzlab shartli kodlar har xil turdagi GUI-larni har xil kodlar bilan har xil API-lar bilan bog'laydi.
Muayyan interfeys-platforma birikmalariga tegishli kodni alohida sinflarga ajratish orqali ushbu tartibsizlikni tartibga keltirishingiz mumkin. Biroq, yaqinda siz ushbu darslarning ko'pligini bilib olasiz. Sinf iyerarxiyasi muttasil o'sib boradi, chunki yangi GUI qo'shish yoki boshqa API-ni qo'llab-quvvatlash tobora ko'proq sinflarni yaratishni talab qiladi.
Keling, ushbu muammoni Bridge naqsh bilan hal qilishga harakat qilaylik. Bu biz sinflarni ikkita ierarxiyaga ajratishni taklif qiladi:
Abstraktsiya: dasturning GUI qatlami.

Amalga oshirish: operatsion tizimlarning API-lari.


Abstraktsiya ob'ekti ilova ko'rinishini boshqaradi, haqiqiy ishni bog'langan amalga oshirish ob'ektiga topshiradi. Turli xil dasturlar bir xil GUI-ga Windows va Linux ostida ishlashga imkon beradigan umumiy interfeysga rioya qilgan holda almashtirilishi mumkin.
Natijada siz GUI sinflarini API bilan bog'liq sinflarga tegmasdan o'zgartirishingiz mumkin. Bundan tashqari, boshqa operatsion tizim uchun qo'llab-quvvatlashni qo'shish faqat dastur ierarxiyasida subklass yaratishni talab qiladi. Bir nechta funktsiyalarning bir nechta variantlariga ega bo'lgan (masalan, sinf turli ma'lumotlar bazalari serverlari bilan ishlay oladigan bo'lsa) monolit sinfni ajratish va tashkil qilmoqchi bo'lganingizda Bridge naqshidan foydalaning.
Sinf qanchalik katta bo'lsa, uning qanday ishlashini aniqlash qanchalik qiyin bo'lsa va o'zgarishlarni amalga oshirish uchun qancha vaqt kerak bo'lsa. Funktsionallik o'zgarishlaridan biriga kiritilgan o'zgarishlar butun sinf bo'ylab o'zgarishlarni talab qilishi mumkin, bu ko'pincha xatolarga olib keladi yoki ba'zi bir muhim yon ta'sirlarni bartaraf etmaydi.
Bridge naqshli monolitik sinfni bir nechta sinf iyerarxiyalariga bo'lishga imkon beradi. Shundan so'ng, har bir ierarxiyadagi sinflarni boshqalarning sinflaridan mustaqil ravishda o'zgartirishingiz mumkin. Ushbu yondashuv kodni saqlashni soddalashtiradi va mavjud kodni buzish xavfini minimallashtiradi.
Bir nechta ortogonal (mustaqil) o'lchamlarda sinfni kengaytirish kerak bo'lganda naqshdan foydalaning.
Ko'prik o'lchamlarning har biri uchun alohida sinf iyerarxiyasini chiqarishni taklif qiladi. Asl sinf, hamma narsani o'z-o'zidan qilish o'rniga, tegishli ishlarni o'sha iyerarxiyalarga tegishli ob'ektlarga topshiradi.
Amalga oshiriladigan dasturlarni ishga tushirish vaqtida almashtirish imkoniyatiga ega bo'lishingiz kerak bo'lsa, ko'prikdan foydalaning.
Ixtiyoriy bo'lsa-da, ko'prik naqshlari abstrakt ichidagi dastur ob'ektini almashtirishga imkon beradi. Maydonga yangi qiymat tayinlash kabi oson.
Aytgancha, ushbu so'nggi narsa ko'pchilikni ko'prikni strategiya bilan aralashtirib yuborishining asosiy sababidir. Shuni esda tutingki, naqsh darslarni tuzishning ma'lum bir usulidan ko'proq. Shuningdek, u niyat va hal qilinayotgan muammoni bildirishi mumkin.
Qanday amalga oshirish kerak

Sinflaringizdagi ortogonal o'lchamlarni aniqlang. Ushbu mustaqil tushunchalar quyidagilar bo'lishi mumkin: abstraktsiya / platforma, domen / infratuzilma, oldingi / orqa tomon yoki interfeys / amalga oshirish.


Mijozga qanday operatsiyalar kerakligini ko'rib chiqing va ularni asosiy abstraktsiya sinfida aniqlang.
Barcha platformalarda mavjud operatsiyalarni aniqlang. Abstraktsiya umumiy amalga oshirish interfeysida kerak bo'lgan narsalarni e'lon qiling.
Sizning domeningizdagi barcha platformalar uchun aniq dasturlarni yaratish, lekin ularning barchasi dastur interfeysiga rioya qilishlariga ishonch hosil qiling.
Abstraktsiya sinfining ichiga dastur turi uchun mos yozuvlar maydonini qo'shing. Abstraktsiya ko'p ishlarni ushbu sohada havola qilingan amalga oshirish ob'ektiga topshiradi.
Agar sizda yuqori darajadagi mantiqning bir nechta variantlari bo'lsa, asosiy abstraktsiya sinfini kengaytirish orqali har bir variant uchun aniq abstraktsiyalar yarating.
Mijoz kodi abstraktsiya konstruktoriga boshqasini bog'lash uchun amalga oshirish ob'ekti o'tishi kerak. Shundan so'ng, mijoz amalga oshirishni unutishi va faqat abstraktsiya ob'ekti bilan ishlashi mumkin.
Ijobiy va salbiy tomonlari

Siz platformadan mustaqil sinflar va ilovalar yaratishingiz mumkin.

Mijoz kodi yuqori darajadagi abstraktsiyalar bilan ishlaydi. Bu platforma tafsilotlariga duch kelmaydi.

Ochiq / yopiq printsip. Siz bir-biridan mustaqil ravishda yangi abstraktsiyalar va dasturlarni kiritishingiz mumkin.



Yagona javobgarlik printsipi. Siz abstraktsiyada yuqori darajadagi mantiqqa va amalga oshirishda platforma tafsilotlariga e'tibor qaratishingiz mumkin.

Naqshni yuqori darajada qo'llash orqali siz kodni yanada murakkablashtira olasiz
Download 318.9 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling