Design mönster

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 19 december 2021; kontroller kräver 6 redigeringar .

Ett designmönster eller mönster ( engelsk  design pattern ) i mjukvaruutveckling  är en repeterbar arkitektonisk design , som är en lösning på ett designproblem inom något ofta förekommande sammanhang .

Vanligtvis är en mall inte ett komplett exempel som direkt kan konverteras till kod ; detta är bara ett exempel på en problemlösning som kan användas i olika situationer. Objektorienterade mönster visar relationer och interaktioner mellan klasser eller objekt utan att specificera vilka slutliga klasser eller applikationsobjekt som ska användas.

"Lågnivå"-mönster som tar hänsyn till specifikationerna för ett visst programmeringsspråk kallas idiom . Dessa är bra designbeslut som är specifika för ett visst språk eller mjukvaruplattform och därför inte universella.

På den högsta nivån finns det arkitektoniska mönster som täcker arkitekturen för hela mjukvarusystemet .

Algoritmer är till sin natur också mönster, men inte designmönster, utan beräkningar , eftersom de löser beräkningsproblem.

Historik

1970 -talet sammanställde arkitekten Christopher Alexander en uppsättning designmönster. Inom arkitekturområdet utvecklades inte denna idé lika mycket som senare inom området mjukvaruutveckling.

1987 tog Kent Beck och Ward Cunningham Alexanders idéer och utvecklade mallar för utvecklingsprogramvara för smalltalk GUI .

1988 började Erich Gamma skriva sin doktorsavhandling vid universitetet i Zürich om den allmänna portabiliteten av denna teknik till mjukvaruutveckling.

Mellan 1989 och 1991 arbetade James Coplien med utvecklingen av C++ programmeringsspråk och publicerade Advanced C++ Idiom 1991.

Samma år avslutar Erich Gamma sin doktorsavhandling och flyttar till USA , där han i samarbete med Richard Helm (Richard Helm), Ralph Johnson (Ralph Johnson) och John Vlissides (John Vlissides) ger ut boken Design Patterns - Element av återanvändbar objektorienterad programvara . Den här boken beskriver 23 designmönster. Dessutom är gruppen av författare till denna bok känt för allmänheten under namnet "Gang of Four" ( eng.  Gang of Four , ofta förkortat till GoF ). Det var den här boken som orsakade den ökande populariteten för designmönster.

Fördelar

Jämfört med helt oberoende design har mallar en rad fördelar. Den största fördelen med att använda mallar är att minska komplexiteten i utvecklingen genom färdiga abstraktioner för att lösa en hel klass av problem. Mallen ger lösningen dess namn, vilket underlättar kommunikationen mellan utvecklare genom att tillåta referenser till välkända mallar. På grund av mallar är detaljerna i lösningar enhetliga: moduler, projektelement och antalet fel minskar. Att tillämpa mallar är konceptuellt besläktat med att använda färdiga kodbibliotek. Ett välformulerat designmönster gör att man, efter att ha hittat en bra lösning, kan använda den om och om igen. En uppsättning mallar hjälper utvecklaren att välja det möjliga, lämpligaste designalternativet. [ett]

Nackdelar

Även om enkel modifiering av kod för att passa ett känt mönster kan göra koden lättare att förstå, enligt Steve McConnell finns det två problem med att använda mönster. För det första, att blint följa något valt mönster kan leda till programkomplexitet. För det andra kan en utvecklare bli frestad att prova ett visst mönster utan någon speciell anledning (se Golden Hammer ). [2]

Många designmönster i objektorienterad design kan ses som idiomatiska reproduktioner av element i funktionella språk [3] . Peter Norvig hävdar att 16 av de 23 mönster som beskrivs i Gangs of Four är mycket lättare att implementera i dynamiskt typade språk än i C++ eller är osynliga [4] . Paul Graham anser själva idén med designmönster vara ett antimönster , en signal om att systemet inte har en tillräcklig abstraktionsnivå , och det måste omarbetas noggrant [5] . Det är lätt att se att själva definitionen av en mall som " en färdig lösning, men inte ett direkt anrop till ett bibliotek " i huvudsak innebär avslag på återanvändning till förmån för dubbelarbete . Detta kan uppenbarligen vara oundvikligt för komplexa system när man använder språk som inte stöder kombinatorer och typpolymorfism , och det kan i princip uteslutas i språk som har egenskapen homoikonicitet (även om det inte nödvändigtvis är effektivt), eftersom vilket mönster som helst kan implementeras i körbar kod [6] .

Typer av designmönster

Grundläggande

namn ursprungliga namn Beskrivning Beskrivs i Design Patterns
Grundläggande mallar (grundläggande)
Delegationsmönster delegationsmönster Ett objekt uttrycker externt något beteende, men överför i realiteten ansvaret för att utföra detta beteende till ett associerat objekt. n/a
funktionell designmall funktionell design Säkerställer att varje modul i ett datorprogram endast har ett ansvar och utför det med ett minimum av biverkningar på andra delar av programmet. n/a
Oföränderligt gränssnitt Oföränderligt gränssnitt Skapa ett oföränderligt objekt . n/a
Gränssnitt Gränssnitt En generell metod för att strukturera datorprogram så att de är lättare att förstå. n/a
Gränssnittsmarkör Markör gränssnitt Som ett attribut (som ett märke för en entitet) används närvaron eller frånvaron av en implementering av markörgränssnittet. Moderna programmeringsspråk kan använda attribut eller anteckningar istället. n/a
Fastighetsbehållare fastighetscontainer Låter dig lägga till ytterligare egenskaper för klassen i behållaren (inom klassen), istället för att utöka klassen med nya egenskaper. n/a
Eventkanal händelsekanal Utökar publicerings-/prenumerationsmönstret för att skapa en centraliserad kanal för evenemang. Använder en proxy för att prenumerera och en proxy för att publicera händelsen på kanalen. Representanten existerar separat från den faktiska utgivaren eller prenumeranten. En abonnent kan ta emot publicerade händelser från mer än en enhet, även om den är registrerad på endast en kanal. n/a
Kreativa mönster  är designmönster som abstraherar instansieringsprocessen. De gör det möjligt att göra systemet oberoende av metoden att skapa, komponera och presentera objekt. Mallen som genererar klasser använder arv för att modifiera klassen som instansieras, medan mallen som genererar objekt delegerar instansieringen till ett annat objekt.
Abstrakt fabrik abstrakt fabrik En klass som representerar ett gränssnitt för att skapa systemkomponenter. Ja
Byggare Byggare En klass som representerar ett gränssnitt för att skapa ett komplext objekt. Ja
fabriksmetod fabriksmetod Definierar ett gränssnitt för att skapa ett objekt, men överlåter till underklasser att bestämma vilken klass som ska instansieras. Ja
Lat initiering Lat initiering Ett objekt som initieras första gången det öppnas. Inte
Flerton Flerton Säkerställer att klassen har namngivna objektinstanser och tillhandahåller en global åtkomstpunkt till dem. Inte
Objekt pool objektpool En klass som representerar ett gränssnitt för att arbeta med en uppsättning initierade och färdiga att använda objekt. Inte
Prototyp prototyp Definierar ett gränssnitt för att skapa ett objekt genom att klona ett annat objekt istället för att skapa det genom en konstruktor. Ja
Resursförvärv är initiering Resursförvärv är initiering (RAII) Att erhålla någon resurs kombineras med initiering och frigöring - med förstörelse av objektet. Inte
enstöring Singleton En klass som bara kan ha en instans. Ja
Strukturella mallar (Structural) definierar olika komplexa strukturer som ändrar gränssnittet för befintliga objekt eller dess implementering, vilket gör det lättare att utveckla och optimera programmet.
Adapter Adapter/Wrapper Ett objekt som tillåter två andra objekt att interagera, varav det ena använder och det andra ger ett gränssnitt som är inkompatibelt med det första. Ja
Bro Bro En struktur som låter dig ändra anropsgränssnittet och klassimplementeringsgränssnittet oberoende av varandra. Ja
länk Sammansatt Ett objekt som kombinerar objekt som liknar sig självt. Ja
Dekoratör eller omslag dekoratör En klass som utökar funktionaliteten för en annan klass utan att använda arv. Ja
Fasad Fasad Ett objekt som abstraherar arbete med flera klasser genom att kombinera dem till en enda enhet. Ja
Enskild ingångspunkt främre kontroller Ger ett enhetligt gränssnitt för gränssnitt i ett delsystem. Front Controller definierar ett högnivågränssnitt som förenklar användningen av delsystemet. Inte
opportunistisk Flugvikt Detta är ett objekt som presenterar sig som en unik instans på olika platser i programmet, men som faktiskt inte är det. Ja
Vice ombud Ett objekt som förmedlar mellan två andra objekt och som implementerar/begränsar åtkomst till objektet som nås genom det. Ja
Beteendemönster definierar interaktionen mellan objekt, vilket ökar dess flexibilitet.
Ansvarskedja Ansvarskedja Designad för att organisera ansvarsnivåerna i systemet. Ja
Kommando , åtgärd, transaktion kommando Representerar en åtgärd. Kommandoobjektet innehåller själva åtgärden och dess parametrar. Ja
Tolk tolk Löser ett vanligt, men kan komma att ändras, problem. Ja
Iterator , Markör Iterator Representerar ett objekt som låter dig få sekventiell åtkomst till elementen i det aggregerade objektet utan att använda beskrivningar av vart och ett av objekten som ingår i aggregeringen. Ja
Medlare medlare Ger växelverkan mellan många objekt, samtidigt som den bildar lös koppling och eliminerar behovet av att objekt explicit hänvisar till varandra. Ja
Målvakten Minne Tillåter, utan att bryta inkapsling , att fixa och spara de interna tillstånden för ett objekt så att det senare kan återställas i dessa tillstånd. Ja
Null objekt Null objekt Förhindrar nollpekare genom att tillhandahålla ett "standardobjekt". Inte
Observatör eller utgivare-prenumerant Observatör Definierar ett ett-till-många-beroende mellan objekt så att när tillståndet för ett objekt ändras, meddelas alla beroende av det om händelsen. Ja
tjänare Tjänare Används för att tillhandahålla gemensamma funktioner till en grupp klasser. Inte
Specifikation Specifikation Används för att binda affärslogik. Inte
stat stat Det används i de fall då objektet under körningen av programmet måste ändra sitt beteende beroende på dess tillstånd. Ja
Strategi Strategi Det är avsett att definiera en familj av algoritmer, kapsla in var och en av dem och säkerställa deras utbytbarhet. Ja
mallmetoden mallmetoden Definierar grunden för algoritmen och tillåter avkomlingar att omdefiniera några steg i algoritmen utan att ändra dess struktur som helhet. Ja
Besökare Besökare Beskriver en operation som utförs på objekt av andra klasser. När besöksklassen ändras behöver du inte ändra de betjänade klasserna. Ja
Enkel policy enkel policy Inte
evenemangslyssnare evenemangslyssnare Inte
Engångsbesökare Engångsbesökare Optimerar implementeringen av besöksmönstret, som initieras, används en gång och sedan kasseras. Inte
Hierarkisk besökare Hierarkisk besökare Ger ett sätt att korsa alla hörn i en hierarkisk datastruktur (t.ex. träd). Inte

Samtidighet  - Samtidighet

Privat

Parallella programmeringsmönster ( samtidighet )

Används för att skriva flertrådade program mer effektivt och tillhandahålla direkta lösningar på synkroniseringsproblem .

namn ursprungliga namn Beskrivning
Aktivt objekt aktivt objekt Används för att separera exekveringstråden för en metod från tråden där den anropades. Använder den asynkrona metoden anrops- och schemaläggningsmönster.
Balking Balking Används för att utföra en åtgärd på ett objekt endast när det är i rätt tillstånd.
Bindande egenskaper Kombinerar flera observatörer för att hålla egenskaper synkroniserade över olika objekt [7] .
Meddelanden Meddelandemönster, meddelandedesignmönster (MDP) Tillåter komponenter och applikationer att utbyta information (meddelanden).
Dubbelkolla lås Dubbelkollad låsning Utformad för att minska omkostnader i samband med att skaffa ett lås.
Händelsebaserad Händelsebaserad asynkron Att lösa problem med det asynkrona mönstret som uppstår i program med flera trådar [8] .
Bevakad upphängning Bevakad fjädring Används för att blockera exekvering av en åtgärd på ett objekt endast när det är i rätt tillstånd.
Halvsynk/halvasynkron
Ledare/följare
blockering låsa En tråd låser en resurs för att förhindra att andra trådar kommer åt eller ändrar den [9] .
Övervaka Övervaka Ett föremål avsett att användas säkert av mer än en tråd.
Reaktor Reaktor Designad för synkron överföring av förfrågningar till tjänsten från en eller flera källor.
Läs/ Läs/skrivlås Tillåter flera trådar att läsa information från den delade lagringen samtidigt, men tillåter bara en tråd åt gången att ändra den.
Schemaläggare Schemaläggare Tillhandahåller en mekanism för att implementera en schemaläggningspolicy utan att vara beroende av någon särskild policy.
trådpool Tillhandahåller en pool av trådar för bearbetning av jobb, vanligtvis representerad som en kö.
Trådspecifik lagring Fungerar för att tillhandahålla olika globala variabler för olika trådar.
Enkeltrådad utförande enkeltrådsutförande Förhindrar att en metod anropas samtidigt, vilket förhindrar att metoden körs samtidigt.
Samarbetsmönster kooperativa mönster Tillhandahåller en mekanism för att säkert stoppa exekveringstrådar genom att använda en gemensam flagga för att signalera trådavslutning.
Objektgenereringsmallar Flexibla objektprogrammeringsmönster Uppgiftskörningsmönster Systemarkitekturmönster Enterprise
  • Active Record  är ett sätt att komma åt relationsdatabasdata i objektorienterad programmering.
  • affärsombud .
  • Sammansatt enhet .
  • Sammansatt vy .
  • DAO (Data Access Object) Data Access Object.
  • DispatcherView .
  • främre kontroller .
  • Avlyssningsfilter .
  • Registret .
  • Service Activator .
  • Service Locator .
  • Service till arbetare .
  • Session Fasad .
  • Transfer Object Assembler .
  • Överför objekt
  • Value List Handler .
  • Visa Helper .
  • Arbetsenhet .
Stream bearbetning designmönster
  • Hantera händelser individuellt
  • Hantering med hjälp av lokal stat
  • Flerstegsbearbetning/ompartitionering
  • Bearbetning med hjälp av en extern katalog: kopplar ett dataflöde till en tabell
  • Anslutning av dataströmmar
  • Extraordinära händelser
  • Upparbetning
Designmönster för distribuerade system Databasmallar
  • datakartare
  • Identitetskarta
  • Arbetsenhet
  • Lat last
Andra
  • Förvar / Förvar .

Andra typer av mönster

Även idag finns det ett antal andra mallar.

  • Carrier Rider Mapper beskriver tillhandahållandet av åtkomst till lagrad information.
  • Analytiska mallar beskriver det grundläggande tillvägagångssättet för att skriva krav på mjukvara (kravanalys) innan själva mjukvaruutvecklingsprocessen påbörjas.
  • Kommunikationsmönster beskriver kommunikationsprocessen mellan enskilda medlemmar/anställda i en organisation.
  • Organisationsmönster beskriver organisationshierarkin hos ett företag/företag
  • Anti -Design-Patterns beskriver vad man inte ska göra när man utvecklar program, och visar typiska fel i design och implementering.

Se även

Anteckningar

  1. McConnell, 2005 , sid. 100-101.
  2. McConnell, 2005 , sid. 101.
  3. Designmönster i Haskell
  4. Peter Norvig - Designmönster i dynamiska språk (bilder)
  5. Nördarnas hämnd . — "I OO-världen hör man en hel del om "mönster". Jag undrar om inte dessa mönster ibland är bevis på fall (c), den mänskliga kompilatorn, i arbete. När jag ser mönster i mina program ser jag det som ett tecken på problem. Formen på ett program bör endast spegla det problem det behöver lösa. Varje annan regelbundenhet i koden är ett tecken, åtminstone för mig, på att jag använder abstraktioner som inte är tillräckligt kraftfulla - ofta att jag för hand genererar expansioner av något makro som jag behöver skriva."
  6. Abelson, Sussman. Struktur och tolkning av datorprogram (SICP). . citat: " Procedur och dataabstraktioner kan byggas, högre ordningsfunktioner kan användas för att fånga vanliga användningsmönster, ... och inbyggda språk kan enkelt implementeras. "(s.16); " En av de saker vi bör förvänta oss av ett kraftfullt programmeringsspråk är förmågan att bygga abstraktioner genom att namnge vanliga scheman och sedan arbeta direkt på dessa abstraktioner. … Ofta används samma programschema med olika procedurer. För att uttrycka dessa scheman som begrepp måste vi bygga procedurer som tar andra procedurer som argument eller returnerar dem som värden. "(s. 70); " att definiera mallscheman som procedurer tjänar som ett sätt för abstraktion. "(s. 263); kapitel 4.1.5 "Data som program" (s.357-360); begreppet " medel för abstraktion " och deras roll ges på s.25.
  7. Bindande egenskaper
  8. Christian Nagel, Bill Evjen, Jay Glynn, Karli Watson och Morgan Skinner. Händelsebaserat asynkront mönster // Professional C# 2008  (neopr.) . - Wiley, 2008. - S.  570 -571. — ISBN 9780470191378 .
  9. Låsmönster
  10. Intervju och bokutdrag: Dan Haywoods domändrivna design med hjälp av nakna föremål

Litteratur

  • Zandstra M. PHP. Objekt, mönster och programmeringsteknik. - 5:e upplagan - St Petersburg. : " Dialektik ", 2019. - S. 736. - ISBN 978-5-907144-54-5 .
  • Fowler, Martin. JavaScript-kodrefaktorering: förbättra utformningen av befintlig kod. - 2:a upplagan - St Petersburg. : " Dialektik ", 2019. - S. 464. - ISBN 978-5-907144-59-0 .
  • Gamma E., Helm R., Johnson R., Vlissides J. Tekniker för objektorienterad design. Designmönster = PHP-objekt, mönster och övning, tredje upplagan. — 3:e upplagan. - M . : " Williams ", 2015. - S. 368. - ISBN 978-5-496-00389-6 .
  • Jason McColm Smith. Elemental Design Patterns = Elemental Design Patterns. - M . : " Williams ", 2012. - 304 sid. — ISBN 978-5-8459-1818-5 .
  • Fowler, Martin, Beck, Kent, Brant, John, Opdike, William, Roberts, Don. Refaktorering: förbättra utformningen av befintlig kod. - M . : " Dialektik ", 2019. - 448 sid. - ISBN 978-5-9909445-1-0 .
  • Martin Fowler. Mönster för Enterprise Application Architecture (Addison-Wesley Signature Series). - M . : " Williams ", 2012. - 544 sid. - ISBN 978-5-8459-1611-2 .
  • Mark Grand. Designa mönster i JAVA. En katalog över återanvändbara designmönster illustrerade med UML = Patterns in Java, Volym 1. En katalog över återanvändbara designmönster illustrerade med UML. - M . : " New Knowledge ", 2004. - S. 560. - ISBN 5-94735-047-5 .
  • Craig Larman. Applying UML 2.0 and Design Patterns = Applying UML and Patterns : An Introduction to Object-Oriented Analysis and Design and Iterative Development. - M . : " Williams ", 2006. - S. 736. - ISBN 0-13-148906-2 .
  • Steve McConnell. Perfekt kod = Kod komplett. - St Petersburg. : Peter, 2005. - S. 896. - (Mästarklass). - ISBN 5-7502-0064-7 , 5-469-00822-3.
  • Nia Narhid, Gwen Shapira, Todd Palino. Apache Kafka. Strömbearbetning och dataanalys. Peter, 2019. - s. 320. - (O'Reilly Bestsellers) - ISBN 978-5-4461-0575-5 .

Länkar