Introduktion til design patterns. Genbrug. Pattern languges i arkitektur. Standardbeskrivelse af design patterns. Oversigt over design patterns. Observer. Composite. Decorator. Abstract Factory. Patterns i andre sprog og paradigmer. Sproglig eller værktøjsmæssig understøttelse. Kurt Nørmark, Aalborg Universitet 11/27/96 s. 1 Denne lektion er baseret på den ny-klassiske bog Design Patterns - Elements of Reusable Object-Oriented Software af Gamma, Helm, Johnson og Vlissides fra Addison Wesley. I resten af denne lektion vil vi kort og godt referere denne bog som pattern-bogen. Som det fremgår af pattern bogen er fremstillingen og behandlingen af design pattern primært rettet mod traditionelle, objekt-orienterede programmeringssprog, såsom C++. Dog diskuteres Smalltalk også undertiden i bogen. 1
Genbrug i objekt-orienteret programudvikling. Niveauer af genbrug i objekt-orienteret programudvikling. Genbrug af klasser. Et af de oprindelige idealer omkring OOP. Genbrug af design Idealet bag design patterns Genbrug af applikationer. Idealet bag frameworks. Kurt Nørmark, Aalborg Universitet 11/27/96 s. 2 Reusability har igennem mange år været et stort og vigtigt emne i faget - ikke mindst i relation til praksis. Årsagen er naturligvis, at der er mange penge at spare, hvis man kan genbruge nogle af (eller dele af) de programmer, som bliver skrevet til forskellige formål. Der er udviklet adskillige teorier, og skrevet en del bøger om emnet. Objekt-orienteret programmering er specielt håbefuldt hvad angår genbrug. Årsagen er, at med objekt-orienteret programmering forfølger vi typisk en bottom-up strategi, hvor et antal generelle moduler udvikles inden de konkrete applikationsbehov tilgodeses. Det har dog vist sig svært at opnå massivt genbrug. Derfor arbejder nogle med genbrug på et mere overordnet niveau, f.eks. design niveau. Design patterns er udtryk for genbrug af abstrakte designs. Frameworks er et andet begreb, som er relevant i denne sammenhæng. Et framework er mere grovkornet end et design pattern. Et framework er, i modsætning til et design pattern, et generelt program, med åbninger der tillader specialisering af programmet til bestemte (relaterede) anvendelser. 2
Inspiration fra patterns i arkitektur. Inspirationen til design patterns er hentet fra Christopher Alexander s arbejde med med pattern languages inden for arkitektur. Alexander beskriver 253 patterns for design af byer, bygninger, rum, møbler mv. Patterns på forskellige niveauer. Standard beskrivelse af patterns: Navn Grafisk illustration context (patterns på højere niveau) problemformulering konsekvenser (med reference til patterns på lavere niveauer). Etablerer alt i alt ny omhyggeligt valgt terminologi pattern language udtryksformer Arbejdet bygger på idealistikse holdninger til hvad udgør god arkitektur. Living structures Kurt Nørmark, Aalborg Universitet 11/27/96 s. 3 Alexander s arbejde er beskrevet i bogen Alexander et al, A Pattern Language, Oxford University Press, 1977. På WWW har jeg en link til et essay, som bl.a. giver en god fornemmelse for naturen af Alexander s arbejde. 3
Design patterns. Beskrivelser af kommunikerende objekter - og klasser som er tilpasset løsning af generelle design problemer i en bestemt kontekst. Design patterns indfanger den objekt-orienterede struktur af et design snarere end den algoritmisk idé i et design. Essentielle elementer af design patterns: Pattern navnet: Udvider fagsproget og gør det muligt på en kvalificeret måde at tale om væsentlige elementer i et design. Problemet: Beskriver repræsentative problemer, hvor et design pattern kan anvendes. Løsningen: Skabelon der giver en abstrakt beskrivelse af en løsning på problemet, i termer af generelle arrangemener af klasser og objekter. Konsekvenser: Bekriver pragmatiske trade-offs omkring anvendelse af et design pattern. Kurt Nørmark, Aalborg Universitet 11/27/96 s. 4 4
Beskrivelse af design patterns. Det er et væsentlig karakteristika ved design patterns at disse dokumenteres ud fra en standard disposition. Også på dette område er inspirationen hentet direkte fra Alexander s arbejde inden for arkitektur. Pattern navn og klassifikation. Hensigt. Andre navne for pattern et. Motivation. Anvendelighed. Struktur (klasse- og objektdiagrammer). Deltagere. Samarbejde. Konsekvenser. Implementation Eksempelprogrammer. Kendte anvendelser. Relaterede patterns. Kurt Nørmark, Aalborg Universitet 11/27/96 s. 5 Pattern bogen indeholder et katalog med 23 pattern. Hvert af disse er dokumenteret i forhold til overskrifterne listet ovenfor. Dette bidrager til en form for standard dokumentation for design patterns. Der er en betydelig redundans imellem nogle af afsnittene i dokumentationen af design patterns. Dette betyder dog i praksis, at ideen bag et bestemt pattern træder tydeligere frem for læseren - netop idet læseren får mere en én chance for at forstå det essentielle omkring et mønster. 5
Oversigt over design patterns. I pattern bogen inddeles design patterns i tre kategorier: Creational patterns, structural patterns og behavioral patterns. Creational patterns Abstract factory Builder Factory Method Prototype Singleton Structural patterns Adapter Bridge Composite Decorator Facade Flyweight Proxy Behavioral patterns Chain of responsibility Command Interpreter Iterator Mediator Memento Observer State Strategy Template method Visitor Kurt Nørmark, Aalborg Universitet 11/27/96 s. 6 De fedt kursiverede design patterns i listen ovenfor vil blive nærmere behandlet i denne lektion. I næste lektion planlægger vi at se nærmere på bl.a. de kursiverede design patterns. 6
Model-view-controller. Model-view-controller er en klassisk objekt-orienteret strukturering af en brugergrænseflade i et Smalltalk program. Input Controller View Model I relation til moderne design patterns er model-view-controller opdelt i et antal mindre omfattende mønstre: Observer: Understøtter multiply views på en model. Composite: Understøtter views med subviews. Strategy Kurt Nørmark, Aalborg Universitet 11/27/96 s. 7 Mange brugergrænseflader i Smalltalk er implementeret ved brug af model-viewcontroller idéen. Man kan sagtens sige, at model-view-controller er et design pattern i sin helhed. Blot har forfatterene af pattern-bogen valgt at slå ned på patterns, der er på et lidt lavere niveau, således at forstå at to (måske tre) patterns fra bogen indgår i model-view-controller. 7
Observer (1). En én-mange sammenhæng mellem et objekt og dets observatører. Når objektet skifter tilstand bliver observatørerne adviseret og opdateret automatisk. Løs og minimal kobling mellem subject objektet og dets observatører. Subject Attach(observer) Detach(observer) Notify observers for all o in observers do o.update Observer Update ConcreteSubject GetState SetState return SubjectState subject Concrete Observer Update ObserverState observerstate := subject.getstate SubjectState Kurt Nørmark, Aalborg Universitet 11/27/96 s. 8 Med denne og de følgende slides går vi over til at studere konkrete bud på design patterns. Materialet på slides er taget forholdsvis direkte fra pattern bogen. 8
Observer (2). En konkret observatør ændres, hvorved tilstanden i modellen (subject objektet) ændres. Subject objektet sender sig selv Notify beskeden, som meddeler alle observatører, at modellen er opdateret. Hver observatør henter den fornødne tilstand(sændring) i subjekt objekt med henblik på at opdatere sig selv. aconcretesubject aconcretobserver anotherconcreteobserver Notify SetState Update GetState Update GetState Kurt Nørmark, Aalborg Universitet 11/27/96 s. 9 9
Composite (1). Sammensætning af objekter i hierarkier af helheder og dele. Manipulation af helheder afstedkommer tilsvarende manipulation af dele. Statisk strukturdiagram af typisk eksempel: Graphic Add(Graphic) Remove(Graphic) GetChild(Graphic) Line Rectangle Text Picture Add(Graphic) Remove(Graphic) GetChild(Graphic) graphics forall g in graphics g. Kurt Nørmark, Aalborg Universitet 11/27/96 s. 10 10
Composite (2). Objektdiagram af typisk eksempel: apicture apicture aline arectangle atext aline arectangle Når et Picture-objekt tegnes bliver alle del-picture objekter tegnet. Klienten af Pictures opnår et homogent syn på sammensatte og atomare pictures. Klienten skal ikke bekymre sig om andet en helheds objektets tegning. Det er et problem at understøtte Add, Delete og GetChild på atomare objekter. Kurt Nørmark, Aalborg Universitet 11/27/96 s. 11 11
Composite (3) Generaliseret strukturdiagram: Client Component Operation Add(Graphic) Remove(Graphic) GetChild(Graphic) Leaf Operation Composite Operation Add(Graphic) Remove(Graphic) GetChild(Graphic) children forall g in graphics g.operation Kurt Nørmark, Aalborg Universitet 11/27/96 s. 12 12
Decorator (1). Tilføjer egenskaber til et objekt på en dynamisk basis i modsætning til statisk udvidelse af en klasse via nedarvning VisualComponent TextView Decorator component component. ScrollDecorator ScrollTo scrollposition BorderDecorator Border borderwidth Decorator::; Border Kurt Nørmark, Aalborg Universitet 11/27/96 s. 13 13
Decorator (2). Klient aborderdecorator ascrolldecorator Fra et klient-synspunkt er alle tre objekter VisualComponents. atextview Når der opereres på aborderdecorator tegnes kanten, hvorefter ascrolldecorator tilsendes samme besked. Når der opereres på ascrolldecorator tegnes scroll bars, hvorefter atextview sendes samme besked. Når der opereres på atextview tegnes det tekstuelle syn på objekter (det egentlige arbejde). Et objekt kan erstattes af en af sine decorators. Decorators kan tilføjes eller fjernes på programmets udførelsestidspunkt. Kurt Nørmark, Aalborg Universitet 11/27/96 s. 14 14
Decorator (3). TextView En statisk løsnig med multipel nedarvning. En dårlig og kompliceret løsning TextViewWithScrollbar TextViewWithBorder TextView:: Scrollbar Scrollbar ScrollTo scrollposition Border borderwidth TextViewWithScrollbarAndBorder Scrollbar ScrollTo scrollposition TextView:: Border TextView:: TextViewWithBorder::Border TextViewWithScrollbar::Scrollbar Kurt Nørmark, Aalborg Universitet 11/27/96 s. 15 15
Abstract Factory (1). Muliggør skabelse af familier af relaterede og afhængige objekter uden angivelse af disses konkrete klasser. VidgetFactory Client CreateScrollbar CreateWindow Window MacWidgetFactory Window95WidgetFactory MacWindow Windows95Window CreateScrollBar CrateWindow CreateScrollBar CrateWindow Scrollbar creates MacScrolbar Windows95Scrollbar creates Kurt Nørmark, Aalborg Universitet 11/27/96 s. 16 16
Abstract Factory (2). Mønstret er velegnet til skabelse af familier af produkter (objekter), eksempelvis widgets på en bestemt platform. Skabelse af objekter varetages af et fabrikationsobjekt, som er bundet til en bestemt produktfamilie. Alle fabrikationsobjekter har samme grænseflade. Det er muligt dynamisk set at udskifte ét fabrikationsobjekt med et andet. En klient kender den abstrakte fabrikationsgrænseflade samt de abstrakte grænseflader af de respektive produkter. Kurt Nørmark, Aalborg Universitet 11/27/96 s. 17 17
Abstract Factory (3). AbstractFactory Client CreateProductA CreateProductB AbstractProductA ConcreteFactory2 ConcreteFactory1 ProductA2 ProductA1 CreateProductA CreateProductB CreateProductA CreateProductB AbstractProductB creates ProductB2 ProductB1 creates Kurt Nørmark, Aalborg Universitet 11/27/96 s. 18 18
Design patterns i forhold til andre sprog og paradigmer. I relation til sprog med dynamisk nedarvning (Self): Decorator kan laves ved blot at justere én parent reference. I relation til sprog, hvor klassen af objekter kan ændres dynamisk: Decorator kan laves ved at ændre på klassen af et objekt. I relation til sprog hvor klasser er objekter (Smalltalk og CLOS): I Abstract Factory kan hele factory hierarkiet erstattes med ét fælles objekt, som understøtter en make funktion: make(familie, produkt) make kan slå klassen op i en tabel og instantierer denne. I relation til sprog, som ikke har statisk typing:... I relation til sprog, som hvor funktioner er af første klasse:... Kurt Nørmark, Aalborg Universitet 11/27/96 s. 19 19
Understøttelse af design-pattern i programmeringssprog og programmeringsomgivelser. Understøttelse i programmeringssprog: Kan design patterns indbygges som sproglige konstruktioner i programmeringssprog? Gæt: Umådelig tungt og omstændeligt. Næppe umagen værd. Understøttelse i programmeringsomgivelser: Er det muligt at bevidstgøre programmeringsværktøjet om tilstedeværelsen af design patterns i et program? Markere klasser, som indgår i et design pattern. Særligt attraktivt i sprog, hvor klasser repræsenteres som objekter. Understøtte at en klasse simultant kan indgå i flere design patterns. Eksempelvis: Browse design patterns i et program. Et godt projekt! Kurt Nørmark, Aalborg Universitet 11/27/96 s. 20 20