Desigmöster
Exempel E klass för att ikapsla fuktioe hos ett tagetbord E applikatio aväder edast ett tagetbord public class Keyboard{... public char getcurretchar(){...}... } Nu ka måga objekt skapas av klasse Edast ett objekt får skapas
Exempel (forts.) E mycket dålig lösig Objekt sys edast där de skapades Omöjligt för adra att få refereser till det Bättre om objektet kude ås av alla som behöver det public class Keyboard{ static private it cout=0; public Keyboard(){ if(cout>0) throw ew SigletoExceptio(); cout++;... }... public char getcurretchar(){...}... }
Exempel (forts.) Gör alla metoder och variabler static Iga objekt skapas Iitieras alltid också om det ite aväds Ka ite aväda ärvig, implemeterig av grässitt Ka ite skickas som objekt referes Iformatio som behövs för iitialiserige kaske ite fis tillgäglig då programmet startar public class Keyboard{... public static char getcurretchar(){...}... }
Exempel (forts.) Bättre lösig Ärvig och grässitt fukar Fortfarade samma iitialiserigsproblem som föregåede lösig Avädig: public class Keyboard{ private static Keyboard theoe= ew Keyboard(); public static Keyboard getistace(){ retur theoe; } } private Keyboard(){... }... public char getcurretchar(){...}... Keyboard.getIstace().getCurretChar();
Exempel forts De bästa lösige public class Keyboard{ private static Keyboard theoe=ull; Garaterat att edast ett objekt skapas Objektet skapas edast vid behov Har fortfarade problem med multitrådade program } public static Keyboard getistace(){ if ( theoe==ull ) theoe=ew Keyboard(); retur theoe; } private Keyboard(){... }... public char getcurretchar(){...}...
Exempel (forts.) Aropet till de tidigare versioe av getistace fugerar ite ödvädigtvis korrekt då det fis flera trådar Exemplet bredvid löser problemet Är lågsamt då varje arop sykroiseras public static sychroized Keyboard getistace(){ }... } if ( theoe==ull ) theoe=ew Keyboard(); retur theoe;
Exempel (forts.) Behöver bara sykroisera första aropet till getistace Double-checked lockig Bara första arope sykroiseras Bästa lösige för multitrådade program public static Keyboard getistace(){ if ( theoe==ull ){ sychroized(keyboard.class){ if ( theoe==ull ) theoe=ew Keyboard(); } } retur theoe; }... }
Exempel - sammafattig Problemet verkade ekelt Me det visar sej fias ovätat måga problem Det här möstret för att tillverka edast ett objekt ka avädas också för aat ä Keyboard klasse i exemplet Att garatera att det fis bara e istas av ett objekt är ett mycket valigt problem Sigleto desigmöstret
Desig möster Ett möster är e möjlige dold kuskap om hur som borde göras explicit Välkäda iom adra igejörsveteskaper Ett mycket avädbart kocept iom programmerig Först systematiskt udersökt iom arkitektur C. Alexader et. al. A patter laguage: Tows, Buildigs, Costructio, 1977 C. Alexader. The timeless way of buildig, 1979
Desigmöster iom arkitektur Alexader studerade om det fis objektiv kvalitet geom att observera byggader, städer, gator, trädgårdar och parker som byggts av mäskor Kostruktioer som har hög kvalitet har ågot gemesamt Strukturer är olika, också om de var till för att lösa likade problem Strukturer ka ite separeras frå probleme de försöker lösa Jämförde olika strukturer som gav lösigar av hög kvalitet för samma problem. Gemesamma egeskaper hos strukturera bildar ett möster
Alexaders möster Lösigar till problem med kotext 253 möster som behadlar område, städer, trasport, rum belysig, etc. Ett geerativt språk för möster Varje möster defiierar ett delproblem, som seda löses med adra möster
Alexaders möster Each patter describes a problem which occurs over ad over agai i our eviromet, ad the describes the core of a solutio to that problem, i such a way that you ca use this solutio a millio times over, without doig the same thig twice C. Alexader, The timeless way of buildigs, 1979 Ett möster är e tredelad regel som ger e relatio mella e kotext, problem och lösig
Desigmöster i programmerig GoF boke: Möster är beskrivigar av kommuicerade objekt och klasser som apassas till att lösa ett geerellt desig problem i e viss kotext Ett desigmöster amger, abstraherar och idetifierar yckel aspektera i e gemesam desigstruktur som är avädbar för att skapa återavädbara objektorieterade desiger.
Desig möster i programmerig Återavädbara lösigar till geerella problem Möster fågar prövade lösigar till olika problem Likar hadböcker iom måga adra område Möster ka tillämpas på ya situatioer Grudläggade strukture de samma, me detaljer och sättet som möstret aväds ka variera
Defiitio av möster Ett geerell lösig till ett ofta förekommade problem i e give kotext Geerell lösig Ite specifik för språk, programmerigsomgivig, etc. Beskrivs i ett semiformellt dokumet Ofta förekommade Måste vara ett valigt problem Arkitektur/desig problem Tillämpas på arkitektur eller detaljerad desig ivå i e give kotext Problemet existerar i e omgivig som ställer vissa krav
Varför desigmöster Gör (möjlige dold) kuskap explicit Lära sej av bra desig ite av sia misstag Ka avädas för att dokumetera desige Namger och gör strukture explicit på e hög ivå som ite direkt stöds av programmerigsspråket Kommuikatio och teamwork Ka avädas som byggstear i programarkitekture Möster är avädbara för att beskriva icke fuktioella krav hos programmet Ge e mera högivå perspektiv på problemet som ska lösas
Dokumeterig av möster Gamma et al. (GoF) aväder e stadard metod för att beskriva möster Gör det lättare att förstå möstre De flesta böcker aväder samma metod. Geom att dokumetera möstre så blir kuskape explicit Möster fis samlade i olika mösterkataloger Nödvädigt att möstre preseteras systematiskt i ett semiformellt dokumet Det fis flera olika format på beskrivigar av desig möster Me åtmistoe följade iformatio måste fias med:
Beskrivig av desig möster Nam Ökar desig vokabuläret Mål Meige med möstret Problem Beskrivig av problemet och dess kotext Lösig Hur möstret löser problemet i kotexte Deltagare De olika elemete som behövs Kosekveser Fördelar och ackdelar med att tillämpa möstret Implemetatio Olika val som måste göras då möstret implemeteras, möjlige språkspecifikt
Beskrivig av GoF möster Nam och klassifikatio av möster: Förmedlar kära i möstret Mål: Vad gör möstret? Vad är målet med möstret? Vilka desig problem försöker möstret lösa? Beäms också som: Adra välkäda am för möstret Motiverig: Ett sceario som illustrerar desig problemet och hur möstret löser det här problemet. Ikluderas så att det är lättare att förstå meige med abstrakta möster. Tillämpigsbarhet: I vilka situatioer ka möstret avädas? Vilka exempel på dålig desig ka möstret hjälpa till att udvika? Hur käs sådaa situatioer ige?
Beskrivig av GoF möster Struktur: E grafisk represetatio av klassera i möstret. Till exempel ka UML klassdiagram avädas. Också UML sekvesdiagram ka vara avädbara för att beskriva beteedet hos objekte uder exekverig Deltagare: Klasser eller objekt som igår i möstret samt deras asvarsområde Samarbete: Hur samarbetar deltagara i möstret för att uppå det gemesamma målet Kosekveser: Hur åstadkommer möstret sitt mål? Vilka kompromisser måste göras? Vilka aspekter av strukture ka modifieras fritt?
Beskrivig av GoF möster Implemetatio: Fällor, Tips och tekiker för avädig och implmetatio av möstret. Språkspecifika problem. Exempel kod: Kod exempel som illustrerar implemetatio av möstret Käda avädigsområde: Exempel på var möstret har aväts i verkliga applikatioer. Åtmistoe frå två olika domäer Relaterade möster: Vilka adra möster är ära besläktade med möstret? Vilka är de viktiga skilladera? Med vilka adra möster ka möstret avädas?
GoF möster Det fis måga olika typer av möster Mest käda är GoF möstre 23 möster i boke Likade möster i Martis bok (kursboke) GoF möstre är Ite så problem specifika Små, gaska lågivå möster Focus på flexibilitet och återavädig geom lös kopplig mella klasser Priciper Programmera mot grässitt, ite mot implemetatio Föredra kompositio före ärvig Hitta det som varierar och dölj det
Fördelar med desig möster Ispiratio Möster ger iga lösigar, de ispirerar lösigar Möster gör expert kuskap explicit, och gör de tillgäglig för alla Gör objektorieterad programmerig eklare Möster förbättrar utvecklaras vokabulär Nam på möster bildar ett vokabulär Hjälper till att dokumetera system Desigmöster hjälper återavädig av mjukvaruarkitekturer
Nackdelar med desigmöster Möster leder ite ödvädigtvis till återavädig av kod Måste programmeras på ytt varje gåg Vissa möster är ovätat ekla Utvecklare överaväder och missbrukar ofta möster Möster ka leda till ökad komplexitet om de aväds på fel sätt Att itegrera möster i e utveckligs process är ite ödvädigtvis ekelt
Desig möster är ite Del av systemet Ite direkt programkod Ka ofta implemeteras på olika sätt E geerellt sätt att förbättra ett system Att aväda fel möster vid fel tillfälle leder till problem... Åtmistoe, så sätter ma till oödig komplexitet Absoluta Möster ska ädras efter behov Uta potetiella problem Desig fragmeterig: flera klasser, mera komplicerade beroede Oödigt komplicerade lösigar Oödig dyamisk bidig, problem med sabbhet Implicithet, kräver möjlige mycket dokumetatio
Möster geerellt Ite bara desigmöster Lågivå: idiom, OO mekaismer, orgaiserig av beräkig Medelivå: traditioella desigmöster Högivå: Mjukvaruarkitekturer, ramverk, produkt lies Ite bara geerella möster Domäspecifika: parallellism, telekommuikatio, GUI Ite bara lösigsorieterade Ati-möster Ite bara tekiska aspekter processmöster orgaisatiosmöster admiistratiosmöster
Sammafattig Desigmöster preseterar bra och prövade lösigar på olika problem på ett systematiskt sätt Aväd möster först efter att problemet har idetifierats Möster hadlar om erfarehet, ite uppfiigar Desigmöster hadlar om sut föruft de ska också avädas med sut föruft
GoF möster Klass vs. typ edärvig Klass Defiierar implemetatioe Typ Defiierar grässittet Relatio mella klass och typ Klasse av objektet implicerar dess typ, me ite omvät Ärvig av klasser
GoF priciper Programmera mot grässitt i stället för implemeterig Aväd grässitt (iterfaces) för att defiiera gemesamma grässitt Deklarera variabler att vara istaser av grässitt Ite istaser av klasser Aväd creatioal patters För att associera grässitt med implemetatioer Skyddar moduler frå att bero av kokreta klasser Fördelar Skyddar mot implemetatiosberoede Klieter vet ite om klasser som implemeterar grässitte de aväder Klieter käer edast till grässitt
Ärvig vs. kompositio Återavädigsmekaismer White-box (edärvig) vs. Black-box (kompositio) Klass ärvig Lätt att aväda; Lätt att modifiera Implemetatio återaväds Statisk Ka ite ädra uder exekverig Problem med döljig av iformatio Ädrigar i basklasse leder till ädrigar i subklasser och tvärtom Objekt kompositio Objekt aväds ebart geom (väldefiierade) grässitt Objekt ka bytas ut uder exekverig Om de har samma typ Om de har samma kotrakt
GoF priciper Föredra kompositio före klassedärvig Håller klasser fokuserade på e sak hög kohesio E desig som favoriserar kompositio har ofta flera objekt, och systemets beteede beror på relatioera mella dem. Ite defiierat i e klass Klasser blir ofta mera återavädbara Det fis e tedes att aväda klass edärvig för mycket
GoF möster Delade i tre kategorier Creatioal patters Beskriver iitialiserig och kofiguratio av klasser och objekt Structural patters Beskriver fråkopplig mella grässitt och implemetatio av objekt Behavioural patters Beskriver de dyamiska växelverka mella klasser och objekt
GoF möster Purpose Creatioal Structural Behavioural Scope Class Factory method Adapter Iterpreter Objekt Abstract factory Builder Prototype Sigleto Adapter Bridge Composite Decorator Facade Flyweight Proxy Chai of Resposibility Commad Iterator Mediator Memeto Observer State Strategy Visitor
Creatioal - Skapade Factory method Defiiera ett grässitt för att skapa objekt, me låt subklasser bestämma vilket klass som istatieras Abstract factory Fabrik för att skapa relaterade objekt uta att specificera vilka Builder kokreta klasser Fabrik för att skapa komplicerade objekt ikremetellt. Separerar kostruktioe av ett objekt frå represetatioe Prototype Fabrik för kloig av ya istaser frå ett prototyp objekt Sigleto Fabrik för att skapa e eda istas av e klass
Structural - Struktur Adapter Koverter ett grässitt av e klass till ett grässitt som förvätas av klietera Bridge Bid e av måga implemetatioer till e av måga abstraktioer Composite Struktur för att bygga rekursiva strukturer (till exempel olika variater träd) Decorator Utvidgig av objekt geom att koppla till y fuktioalitet dyamiskt
Structural Facade Erbjuder ett ehetligt och föreklat grässitt till e mägd grässitt i ett subsystem Flyweight Måga objekt som delas på ett effektivt sätt Proxy Ett objekt A aväds istället för ett aat objekt B, för att kotroller åtkomst till B på ågot sätt
Behavioural - Beteede Chai of resposibility Udviker att koppla e förfråga till mottagare geom att ge flera objekt chase att hatera förfråga Commad Iesluter e förfråga i ett objekt, och ka därigeom parametrisera klieter med olika förfrågigar Iterpreter E språktolkare för e språk med ågo grammatik Iterator Går igeom elemet i e samlig i e sekvetiell ordig Mediator Koordierar växelverkigar mella dess associerade objekt. Defiierar ett objekt som beskriver hur e samlig associerade objekt kommuicerar
Behavioural Memeto Spara e miesbild (sapshot) av ett objekt och dessutom bevara ikapslige Observer Objekt som beror på ett subjekt ädras automatiskt då subjektet ädras State Objekt vars beteede beror på dess tillståd Strategy Abstraktio för att välja mella olika algoritmer dyamiskt och trasparet för klieter Template method Låter subklasser omdefiiera vissa steg i e algoritm uta att ädra algoritmes struktur Visitor Operatioer som tillämpas på heterogea objektstrukturer. Tillåter defiitio av ya operatioer uta att ädra på objekte som de opererar
Möster i boke Ite exakt samma möster i R. Martis bok (kursboke) Adra möster Abstract server Active object Extesio object Moostate Null object Stairway to heave Taskmaster Template method
Möster i boke (forts.) Möster som fattas jämfört med GoF boke Builder Prototype Flyweight Iterpreter Chai of resposibility Iterator Memeto
Möster Abstract server Aväds för att desige ska uppfylla DIP (depedecy iversio priciple). Klasser ska ite bero av kokreta implemetatioer Active object Aväder Commad möstret för att skapa e ekel typ av multipla kotrolltrådar (multi-threadig) Extesio object Aväds för att sätta till fuktioalitet i e klasshierarki uta att modifiera hierarki Moostate Ett alterativ till Sigleto möstret
Möster Null Object Aväder e speciellt objekt i stället för ull-refereser Stairway to heave E variat av proxy möstret Taskmaster Möster för att implemetera komplicerade iteraktioer med t.ex avädare Template method E variat av Strategy möstret som aväder edärvig istället för delegerig
Ati-möster Ett möster som först verkar vara e bra ide, me seda visar sej ha dåliga kosekveser Iehåller också e lösig hur ma ska åtgärda problemet
Några ati-möster Call-super E subklass som kräver att e omdefiierad metod m aropar de gamla versioe av m i basklasse Aväd Template method möstret för att fixa problemet Circle-Ellipsis problem (Rectagle-Square) Nedärvig som ite följer LSP God object Ett objekt som gör för mycket. Leder till problem med uderhåll Poltergeist Kortlivade objekt som aväds för iitialiserig eller aropa metoder i adra objekt
Mera ati-möster Sequetial couplig E klass som kräver att dess metoder ska aropas i e specifik ordig Sigletoitis Överdrive avädig av Sigleto möstret YAFL (Yet Aother F***ig Layer) Oödiga lager eller idirekta arop. Valigt problem då desigmöster aväds på fel sätt
Sammafattig Möster är avädbara för desig av system Bra lösigar till valiga problem Ger också ispiratio till lösigar av midre valiga problem Lista av möster preseterad Mera detaljerade beskrivigar av möstre seare i kurse Refereser E. Gamma, R. Helm, R. Johso och J. Vlissides. Desig patters: Elemets of reusable object-orieted software R. Marti. Agile software developmet: Priciples, patters ad practices Desig patters. Wikipedia, http://e.wikipedia.org/wiki/desig_patter_%28computer_sciece%29