Tarkvara arhitektuur ja disain Loeng 8 Ants Torim

  • Slides: 53
Download presentation
Tarkvara arhitektuur ja disain Loeng 8 Ants Torim

Tarkvara arhitektuur ja disain Loeng 8 Ants Torim

Eelmise loengu sisu • Polümorfism - klassiti varieeruva käitumise eest vastutavad klassid ise. •

Eelmise loengu sisu • Polümorfism - klassiti varieeruva käitumise eest vastutavad klassid ise. • Puhas väljamõeldis - vahel on kasulik tekitada disaini klass, mis probleemvaldkonnas vastet ei oma. • Kaudsus - välissüsteemi äriloogikast lahutamiseks on kasulik kasutada klasse, mis peidavad konkreetse välissüsteemi üldise liidese taha. • Kaitstud variatsioonid - fundamentaalne printsiip, eriti polümorfismi ja kaudsuse taga.

Millest selles loengus juttu tuleb? • Gang of Four (Go. F) disainimustrid: – Šabloonmeetod

Millest selles loengus juttu tuleb? • Gang of Four (Go. F) disainimustrid: – Šabloonmeetod (Template Method) – Tehase meetod (Factory Method) – Strateegia (Strategy) – Olek (State) – Adapter (Adapter) – Sild (Bridge)

Go. F mustrid • Go. F mustrid kirjeldati disainimustrite vallas teedrajavas raamatus Design Patterns;

Go. F mustrid • Go. F mustrid kirjeldati disainimustrite vallas teedrajavas raamatus Design Patterns; Gamma, Helms, Johnson, Vlissides; 1995. (Nimetus Gang of Four tuli neljast autorist. ) • Go. F mustrid on konkreetsemad kui GRASP mustrid, kirjeldades lahendust vajalike klasside ja meetodite täpsusega. Go. F mustrid tegelevad tavaliselt süsteemi kaitsmisega teatud tüüpi variatsioonide vastu OO viisil. • Go. F mustrite sõnavara on OO maailmas laialt kasutusel.

Struktuuriga seotud Go. F mustrid · Tüüpsisu: Objektidest suurte struktuuride koostamine. · · ·

Struktuuriga seotud Go. F mustrid · Tüüpsisu: Objektidest suurte struktuuride koostamine. · · · • Adapter (Adapter) Sild (Bridge) Ühend (Composite) Dekoraator (Decorator) Fassaad (Facade) Kärbeskaal (Flyweight) Vahendusobjekt (Proxy)

Käitumisega seotud Go. F mustrid · Tüüpsisu: algoritmid ja vastutuste jaotus. · · ·

Käitumisega seotud Go. F mustrid · Tüüpsisu: algoritmid ja vastutuste jaotus. · · · · · • Käsuliin (Chain of Responsibility) Käsk (Command) Interpretaator (Interpreter) Iteraator (Iterator) Vahendaja (Mediator) Memento (Memento) Vaatleja (Observer) Olek (State) Strateegia (Strategy) Šabloonmeetod (Template Method) Külastaja (Visitor)

Loomisega seotud Go. F mustrid · Tüüpsisu: Isoleerida teadmine tekitatava objekti tüübist. Kõigi nende

Loomisega seotud Go. F mustrid · Tüüpsisu: Isoleerida teadmine tekitatava objekti tüübist. Kõigi nende mustrite juures on tegemist ühe või rohkema meetodiga, mis tagastab uue objekti. Klienttarkvara peab sellise objekti tekitamiseks kasutama mustri poolt pakutavat mehhanismi (meetodit), mitte objekti otse initsialiseerima. · · • Abstraktne tehas (Abstract Factory) Ehitaja (Builder) Tehase meetod (Factory Method) Prototüüp (Prototype) Singel (Singleton)

Klassidiagrammide legend Värv näitab kuidas teatud muudatus disaini mõjutab.

Klassidiagrammide legend Värv näitab kuidas teatud muudatus disaini mõjutab.

Šabloonmeetod (Template Method) • Probleem: Kuidas eraldada üldine algoritm varieeruvatest alamosadest? • Lahendus: Defineeri

Šabloonmeetod (Template Method) • Probleem: Kuidas eraldada üldine algoritm varieeruvatest alamosadest? • Lahendus: Defineeri algoritmi karkass Šabloonmeetodis jättes mõned sammud alamklassidele defineerimiseks. Šabloonmeetod lubab alamklassidel mõningaid algoritmi samme ümber defineerida ilma algoritmi struktuuri muutmata.

Šabloonmeetod Koostöö: Konkreetsed. Klassid lasevad Abstraktsel. Klassil defineerida algoritmi muutumatud osad (šabloonmeetod) defineerides ise

Šabloonmeetod Koostöö: Konkreetsed. Klassid lasevad Abstraktsel. Klassil defineerida algoritmi muutumatud osad (šabloonmeetod) defineerides ise varieeruvad osad (primitiivne. Op 1 -2). NB! Variantideks on siin alamklassid A ja B, mitte operatsioonid Op 1 ja Op 2 on mõlemad vajalikud sammud üldises algoritmis.

Šabloonmeetod koodis public abstract class Abstraktne. Klass { public void shabloonmeetod(){ … primitiivneop 1();

Šabloonmeetod koodis public abstract class Abstraktne. Klass { public void shabloonmeetod(){ … primitiivneop 1(); … primitiivneop 2(); … } protected abstract void primitiivneop 1(); protected abstract void primitiivneop 2(); } public class Konkreetne. Klass. A extends Abstraktne. Klass { protected void primitiivneop 1(){ // primitiivse op-i kood, mis vastab variandile A …. }

Šabloonmeetod koodis, variandi valik ja väljakutse Abstraktne. Klass k; if (teatud. Tingimus){ k= new

Šabloonmeetod koodis, variandi valik ja väljakutse Abstraktne. Klass k; if (teatud. Tingimus){ k= new Konkreetne. Klass. A(); } else { k = new Konkreetne. Klass. B(); } … k. shabloonmeetod(); // see väljakutse toimub tavaliselt // teises meetodis kui initsialiseerimine

Installeerimise näide • • Näiteprobleemiks on teatud tarkvara installeerimine erinevatele operatsioonisüsteemidele (Windows, Unix, .

Installeerimise näide • • Näiteprobleemiks on teatud tarkvara installeerimine erinevatele operatsioonisüsteemidele (Windows, Unix, . . ). Üldine installeerimisprotseduur jääb kõigi operatsioonisüsteemide puhul samaks. Erinevad detailsed sammud - kataloogi olemasolu kontroll, kataloogi loomine, failide kirjutamine kataloogi. Kuidas vältida üldise installeerimisprotseduuri dubleerimist?

Installeerimise näide Šabloonmeetod installeeri kutsub välja abstraktseid meetodeid, mis defineeritakse konkreetsele operatsioonisüsteemile vastavates alamklassides.

Installeerimise näide Šabloonmeetod installeeri kutsub välja abstraktseid meetodeid, mis defineeritakse konkreetsele operatsioonisüsteemile vastavates alamklassides.

Installeerimise kontranäide

Installeerimise kontranäide

Hinnapoliitika näide • • Näiteprobleemiks on poodides kasutavad erinevad allahindlusskeemid - fikseeritud protsent, fikseeritud

Hinnapoliitika näide • • Näiteprobleemiks on poodides kasutavad erinevad allahindlusskeemid - fikseeritud protsent, fikseeritud läve ületavalt tehingult fikseeritud allahindlus jne. Kuidas peaks erinevaid allahindlusskeeme lubav disain välja nägema?

Hinnapoliitika näide

Hinnapoliitika näide

Hinnapoliitika näide

Hinnapoliitika näide

Tehase meetod (Factory Method) • Probleem: Kes peaks vastutama objektide loomise eest, kui on

Tehase meetod (Factory Method) • Probleem: Kes peaks vastutama objektide loomise eest, kui on tegemist erinõudmistega, nagu keerukas loomisprotsess, soov eristada objekti loomine kõrgema kokkukuuluvuse saavutamiseks, soov vältida sõltuvust konkreetsest loodavast klassist jne? • Lahendus: Defineeri liides objekti loomiseks, aga lase alamklassidel otsustada, mis klassist eksemplar tekitada.

Tehase meetod Koostöö: Looja jätab oma alamklassidele defineerimiseks tehase meetodi(d), mis tagastavad sobiva Konkreetse.

Tehase meetod Koostöö: Looja jätab oma alamklassidele defineerimiseks tehase meetodi(d), mis tagastavad sobiva Konkreetse. Toote eksemplari. Looja konkreetsed operatsioonid (Operatsioon) võivad Tehase. Meetodit välja kutsuda.

Labürindimängu näide • Meil on tegemist labürindimänguga. Labürint koosneb seintest ja ustest. • Kuidas

Labürindimängu näide • Meil on tegemist labürindimänguga. Labürint koosneb seintest ja ustest. • Kuidas kasutada sama labürindi põhiplaani loomise algoritmi, erinevat klassi kuuluvatest seintest ja ustest koosnevate labürintide loomiseks? – Eeldus on, et ühes ja samas labürindis on kõik seinad ja uksed sama klassi.

Labürindimängu näide

Labürindimängu näide

Strateegia (Strategy) • Probleem: Kuidas eraldada üldine algoritm varieeruvatest alamosadest? Kuidas muuta objekti käitumine

Strateegia (Strategy) • Probleem: Kuidas eraldada üldine algoritm varieeruvatest alamosadest? Kuidas muuta objekti käitumine täitmisajal muudetavaks ja erinevad käitumisstrateegiad korduvkasutatavateks? • Lahendus: Defineeri varieeruvale käitumisele vastav Strateegiate klassihierarhia. Üldist käitumist defineerivad Konteksti objektid on seotud Strateegia objektidega ja kutsuvad välja nende meetodeid.

Strateegia

Strateegia

Koostöö • • Strateegia ja Kontekst suhtlevad, et Šabloonmeetodit realiseerida. Kontekst võib anda primitiivse

Koostöö • • Strateegia ja Kontekst suhtlevad, et Šabloonmeetodit realiseerida. Kontekst võib anda primitiivse operatsiooni jaoks vajalikud andmed Strateegiale parameetrina. Alternatiivina võib Kontekst iseennast parameetrina Strateegiale anda. Kontekst saadab sõnumid oma klientidelt edasi oma Strateegiale. Kliendid loovad tavaliselt Konkreetse. Strateegia objekti ja seovad selle Kontekstiga; edaspidi suhtlevad kliendid ainult Kontekstiga.

Strateegia koodis public class Kontekst { private Strateegia strat; public void shabloonmeetod(){ … strat.

Strateegia koodis public class Kontekst { private Strateegia strat; public void shabloonmeetod(){ … strat. primitiivneop 1(); strat. primitiivneop 2(); …} } public interface Strateegia { public void primitiivne. Op 1(); public void primitiivne. Op 2(); } public class Konkreetne. Strateegia. A implements Strateegia { protected void primitiivneop 1(){ // primitiivse op-i kood …} …

Strateegia koodis, variandi valik ja väljakutse Kontekst k = new Kontekst(); if (Teatud. Tingimus){

Strateegia koodis, variandi valik ja väljakutse Kontekst k = new Kontekst(); if (Teatud. Tingimus){ k. set. Strat(new Konkreetne. Strateegia. A()); } else { k. set. Strat(new Konkreetne. Strateegia. B()); } … k. shabloonmeetod(); // see väljakutse toimub tavaliselt // teises meetodis kui konteksti seadistus

Installeerimise näide

Installeerimise näide

Hinnapoliitika näide

Hinnapoliitika näide

Hinnapoliitika näide

Hinnapoliitika näide

Strateegia või Šabloonmeetod? • • • Delegeerimine (Strateegia) või pärimine (Šabloonmeetod)? Pärimine on lihtsamalt

Strateegia või Šabloonmeetod? • • • Delegeerimine (Strateegia) või pärimine (Šabloonmeetod)? Pärimine on lihtsamalt defineeritav, kuid objekt elutsükli jooksul oma klassi vahetada ei saa. Objekti, millele ülesanded delegeeritakse, saab delegeerija elutsükli jooksul vahetada. Kui on vaja objekti elutsükli käigus algoritme vahetada, siis tuleks kasutada keerukamat Strateegiat. Kui varieerub objekti mitu aspekti, siis erinevaid Strateegiaid on lihtsam kombineerida. Strateegiaid on võimalik eraldi korduvkasutada.

Olek (State) • Probleem: Objekti käitumine sõltub tema olekust ja tema meetodid sisaldavad olekust

Olek (State) • Probleem: Objekti käitumine sõltub tema olekust ja tema meetodid sisaldavad olekust sõltuvaid tegevusi peegeldavat tingimusloogikat. Milline oleks alternatiiv tingimusloogikale? • Lahendus: Loo ühist liidest realiseerivad oleku klassid iga oleku tarvis. Delegeeri olekust sõltuvad operatsioonid konteksti objektilt tema hetke oleku objektile. Taga konteksti objekti seotus õige oleku objektiga üle oleku muutuste.

Olek

Olek

Koostöö • Kontekst saadab olekust sõltuvad palved edasi Oleku objektile. • Kontekst võib anda

Koostöö • Kontekst saadab olekust sõltuvad palved edasi Oleku objektile. • Kontekst võib anda ennast parameetrina Oleku objektile. • Kontekst on klientidele peamine liides. Kliendid võivad Konteksti olekuga konfigureerida, aga pärast seda kliendid enam olekuga ei suhtle. • Kas Kontekst või Konkreetse. Oleku alamklassid otsustavad, mis olek järgneb teisele ja mis tingimustel.

Pöördvärava näide • Meil on tegemist tasulist pöördväravat kontrolliva tarkvaraga. – Olekud: avatud, suletud

Pöördvärava näide • Meil on tegemist tasulist pöördväravat kontrolliva tarkvaraga. – Olekud: avatud, suletud – Registreeritavad sündmused: münt, möödumine – Tegevused: ava, sule, täna maksjat, alarmeeri. • Kuidas vältida tingimusloogikat pöördvärava klassis?

Pöördvärava näide

Pöördvärava näide

Pöördvärava näide

Pöördvärava näide

Adapter (Adapter) • Probleem: Kuidas lahendada kokkusobimatute liideste probleem või pakkuda stabiilset ühist liidest

Adapter (Adapter) • Probleem: Kuidas lahendada kokkusobimatute liideste probleem või pakkuda stabiilset ühist liidest erinevate liidestega, sisult sarnastele, komponentidele? • Lahendus: Konverteeri komponendi algne liides teiseks liideseks läbi vahepealse Adapter objekti.

Adapter Koostöö: Kliendid kutsuvad välja Adapteri operatsioone. Konkreetne. Adapter kutsub välja sobivaid Adapteeritava operatsioone.

Adapter Koostöö: Kliendid kutsuvad välja Adapteri operatsioone. Konkreetne. Adapter kutsub välja sobivaid Adapteeritava operatsioone.

Maksukalkulaatori näide • • • On vaja pakkuda võimalust suhelda välise maksukalkulaatori tarkvaraga (Tax.

Maksukalkulaatori näide • • • On vaja pakkuda võimalust suhelda välise maksukalkulaatori tarkvaraga (Tax. Master, Tax. Pro). Kõik välised tarkvarakomponendid realiseerivad erinevat liidest. Kuidas oleks võimalik luua disaini, mis oleks sõltumatu konkreetsest välisest maksukalkulaatorist?

Maksukalkulaatori näide

Maksukalkulaatori näide

Maksukalkulaatori näide

Maksukalkulaatori näide

Maksukalkulaatori näide

Maksukalkulaatori näide

Maksukalkulaatori näide

Maksukalkulaatori näide

Lineaaralgebra paketi vektorid punktina

Lineaaralgebra paketi vektorid punktina

Sild (Bridge) • Probleem: Klassi liides (abstraktsioon) ja meetodite realisatsioon võivad sõltumatult varieeruda. Igale

Sild (Bridge) • Probleem: Klassi liides (abstraktsioon) ja meetodite realisatsioon võivad sõltumatult varieeruda. Igale liidese / realisatsiooni kombinatsioonile ei ole mõtet vastavat alamklassi defineerida. Kuidas kaitsta disaini mõlema aspekti varieerumise vastu? • Lahendus: Loo abstraktsioonile ja realisatsioonile vastavad klassihierarhia. Abstraktsioonile vastavad objektid delegeerivad oma ülesanded realisatsioonile vastavatele objektidele.

Sild Koostöö: Abstraktsioon saadab Operatsiooni läbiviimise sõnumid edasi Realiseerijale (Operatsiooni. Imp()).

Sild Koostöö: Abstraktsioon saadab Operatsiooni läbiviimise sõnumid edasi Realiseerijale (Operatsiooni. Imp()).

GUI raamistiku näide • Ülesandeks on luua GUI raamistik, mis sisaldab klasse nagu Aken,

GUI raamistiku näide • Ülesandeks on luua GUI raamistik, mis sisaldab klasse nagu Aken, Nupp, Menüü ja mis on piisavalt üldine, et joosta erinevate operatsioonisüsteemide ja raamistike peal. Varieeruda võib nii Akna abstraktsioon - meil on erinevat tüüpi aknad - kui ka API, millega akna kuvamiseks suhelda. Milline disain oleks kaitstud nende kahe aspekti varieerumise vastu?

Sild: GUI raamistiku näide

Sild: GUI raamistiku näide

Strateegia: tarkvara installeerimise näide

Strateegia: tarkvara installeerimise näide

Sild: Tarkvara installeerimise näide Erinevalt Strateegia näitest samal teemal, kus varieerus ainult OS, varieerub

Sild: Tarkvara installeerimise näide Erinevalt Strateegia näitest samal teemal, kus varieerus ainult OS, varieerub siin lisaks ka Tarkvara tüüp.

Kokkuvõte • Šabloonmeetod, Strateegia - käitumise varieerimine läbi pärimise või delegeerimise. • Tehase meetod

Kokkuvõte • Šabloonmeetod, Strateegia - käitumise varieerimine läbi pärimise või delegeerimise. • Tehase meetod - Alamklassis defineeritakse soovitud objekti loov meetod. • Olek - varieerub olekust sõltuv käitumine. • Adapter - liideste struktuuri ühtlustamine. • Sild - abstraktsioon ja realisatsioon varieeruvad sõltumatult.

Viited • Gamma, Helms, Johnson, Vlissides. Design Patterns. 1995. • Larman, C. Applying UML

Viited • Gamma, Helms, Johnson, Vlissides. Design Patterns. 1995. • Larman, C. Applying UML and Patterns, 2002 • Jezequel, Train, Mingins. Design Patterns and Contracts, 2000 • Object Mentor: Articles: Patterns: • http: //www. objectmentor. com/resources/published. Articles. html