Design mønster

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 19. december 2021; checks kræver 6 redigeringer .

Et designmønster eller et designmønster ( engelsk  designmønster ) i softwareudvikling  er et repeterbart arkitektonisk design , som er en løsning på et designproblem inden for en ofte forekommende kontekst .

Typisk er en skabelon ikke et komplet eksempel, der direkte kan konverteres til kode ; dette er blot et eksempel på en problemløsning, der kan bruges i forskellige situationer. Objektorienterede mønstre viser relationer og interaktioner mellem klasser eller objekter uden at specificere, hvilke endelige klasser eller applikationsobjekter der skal bruges.

"Lavt-niveau" mønstre, der tager højde for de særlige forhold ved et bestemt programmeringssprog, kaldes idiomer . Det er gode designbeslutninger, der er specifikke for et bestemt sprog eller softwareplatform og derfor ikke universelle.

På højeste niveau er der arkitektoniske mønstre , der dækker arkitekturen af ​​hele softwaresystemet .

Algoritmer er i sagens natur også mønstre, men ikke designmønstre, men beregninger , da de løser beregningsmæssige problemer.

Historie

I 1970'erne kompilerede arkitekt Christopher Alexander et sæt designmønstre. Inden for arkitekturen blev denne idé ikke udviklet så meget som senere inden for softwareudvikling.

I 1987 tog Kent Beck og Ward Cunningham Alexanders ideer og udviklede skabeloner til smalltalk GUI- udviklingssoftware .

I 1988 begyndte Erich Gamma at skrive sin doktorafhandling ved universitetet i Zürich om den generelle overførsel af denne teknik til softwareudvikling.

Mellem 1989 og 1991 arbejdede James Coplien på udviklingen af ​​C++ programmeringssprog og udgav Advanced C++ Idioms i 1991.

Samme år afslutter Erich Gamma sin doktorafhandling og flytter til USA , hvor han i samarbejde med Richard Helm (Richard Helm), Ralph Johnson (Ralph Johnson) og John Vlissides (John Vlissides) udgiver bogen Design Patterns - Elementer af genbrugelig objektorienteret software . Denne bog beskriver 23 designmønstre. Også holdet af forfattere til denne bog er kendt af offentligheden under navnet "Gang of Four" ( eng.  Gang of Four , ofte forkortet til GoF ). Det var denne bog, der forårsagede stigningen i popularitet af designmønstre.

Fordele

I forhold til helt selvstændigt design har skabeloner en række fordele. Den største fordel ved at bruge skabeloner er at reducere kompleksiteten af ​​udvikling gennem færdige abstraktioner for at løse en hel klasse af problemer. Skabelonen giver løsningen sit navn, hvilket letter kommunikationen mellem udviklere ved at tillade referencer til velkendte skabeloner. På grund af skabeloner er detaljerne i løsninger således samlet: moduler, projektelementer, og antallet af fejl reduceres. Anvendelse af skabeloner er konceptuelt beslægtet med at bruge færdige kodebiblioteker. Et velformuleret designmønster gør det muligt, efter at have fundet en god løsning, at bruge det igen og igen. Et sæt skabeloner hjælper udvikleren med at vælge den mulige, mest passende designmulighed. [en]

Ulemper

Mens let ændring af kode, så den passer til et kendt mønster, kan gøre kode lettere at forstå, er der ifølge Steve McConnell to problemer med at bruge mønstre. For det første kan det føre til programkompleksitet at følge et eller andet valgt mønster blindt. For det andet kan en udvikler blive fristet til at prøve et bestemt mønster uden nogen særlig grund (se Golden Hammer ). [2]

Mange designmønstre i objektorienteret design kan opfattes som idiomatiske reproduktioner af elementer af funktionelle sprog [3] . Peter Norvig hævder, at 16 af de 23 mønstre beskrevet i Gangs of Four er meget nemmere at implementere i dynamisk indtastede sprog end i C++ eller er usynlige [4] . Paul Graham anser selve ideen med designmønstre for at være et antimønster , et signal om, at systemet ikke har et tilstrækkeligt abstraktionsniveau , og det skal omhyggeligt omarbejdes [5] . Det er let at se, at selve definitionen af ​​en skabelon som " en færdiglavet løsning, men ikke et direkte opkald til et bibliotek " i det væsentlige betyder afvisning af genbrug til fordel for duplikering . Dette kan naturligvis være uundgåeligt for komplekse systemer, når man bruger sprog, der ikke understøtter kombinatorer og type polymorfi , og det kan i princippet udelukkes i sprog, der har egenskaben homoikonicitet (dog ikke nødvendigvis effektivt), da ethvert mønster kan implementeres i eksekverbar kode [6] .

Typer af designmønstre

Grundlæggende

Navn oprindelige navn Beskrivelse Beskrevet i Design Patterns
Grundlæggende skabeloner (grundlæggende)
Delegationsmønster delegationsmønster Et objekt udtrykker eksternt en eller anden adfærd, men overfører i virkeligheden ansvaret for at udføre denne adfærd til et tilknyttet objekt. n/a
funktionel design skabelon funktionelt design Sikrer, at hvert modul i et computerprogram kun har ét ansvar og udfører det med et minimum af bivirkninger på andre dele af programmet. n/a
Uforanderlig grænseflade Uforanderlig grænseflade Oprettelse af et uforanderligt objekt . n/a
Interface Interface En generel metode til at strukturere computerprogrammer, så de er nemmere at forstå. n/a
Interface markør Markør interface Som en attribut (som et mærke for en enhed) bruges tilstedeværelsen eller fraværet af en implementering af markørgrænsefladen. Moderne programmeringssprog kan bruge attributter eller anmærkninger i stedet for. n/a
Ejendomsbeholder ejendomscontainer Giver dig mulighed for at tilføje yderligere egenskaber for klassen til containeren (inden for klassen) i stedet for at udvide klassen med nye egenskaber. n/a
Event-kanal begivenhedskanal Udvider mønsteret Udgiv/Abonner for at skabe en centraliseret kanal til begivenheder. Bruger en proxy til at abonnere og en proxy til at offentliggøre begivenheden på kanalen. Repræsentanten eksisterer separat fra den faktiske udgiver eller abonnent. En abonnent kan modtage offentliggjorte begivenheder fra mere end én enhed, selvom den kun er registreret på én kanal. n/a
Kreative mønstre  er designmønstre, der abstraherer processen med instansiering. De gør det muligt at gøre systemet uafhængigt af metoden til at skabe, komponere og præsentere objekter. Skabelonen, der genererer klasser, bruger arv til at ændre den klasse, der instansieres, mens skabelonen, der genererer objekter, uddelegerer instansieringen til et andet objekt.
Abstrakt fabrik abstrakt fabrik En klasse, der repræsenterer en grænseflade til oprettelse af systemkomponenter. Ja
Bygger Bygger En klasse, der repræsenterer en grænseflade til at skabe et komplekst objekt. Ja
fabriksmetode fabriksmetode Definerer en grænseflade til oprettelse af et objekt, men overlader det til underklasser at bestemme, hvilken klasse der skal instansieres. Ja
Doven initialisering Doven initialisering Et objekt, der initialiseres første gang, det tilgås. Ikke
Multitone Multitone Sikrer, at klassen har navngivne objektforekomster og giver dem et globalt adgangspunkt. Ikke
Objekt pool objektpulje En klasse, der repræsenterer en grænseflade til at arbejde med et sæt initialiserede og klar til brug objekter. Ikke
Prototype prototype Definerer en grænseflade til at skabe et objekt ved at klone et andet objekt i stedet for at skabe det gennem en konstruktør. Ja
Ressourceanskaffelse er initialisering Ressourceanskaffelse er initialisering (RAII) At få en ressource er kombineret med initialisering og frigivelse - med ødelæggelse af objektet. Ikke
enspænder Singleton En klasse, der kun kan have én instans. Ja
Strukturelle skabeloner (Strukturelle) definerer forskellige komplekse strukturer, der ændrer grænsefladen af ​​eksisterende objekter eller implementeringen af ​​dem, hvilket gør det nemmere at udvikle og optimere programmet.
Adapter Adapter/Wrapper Et objekt, der tillader to andre objekter at interagere, hvoraf den ene bruger og den anden giver en grænseflade, der er inkompatibel med den første. Ja
Bro Bro En struktur, der giver dig mulighed for at ændre opkaldsgrænsefladen og klasseimplementeringsgrænsefladen uafhængigt. Ja
linker Sammensatte Et objekt, der kombinerer objekter, der ligner sig selv. Ja
Dekoratør eller Indpakning dekoratør En klasse, der udvider funktionaliteten af ​​en anden klasse uden at bruge arv. Ja
Facade facade Et objekt, der abstraherer arbejde med flere klasser ved at kombinere dem til en enkelt enhed. Ja
Enkelt indgangssted front controller Giver en samlet grænseflade til grænseflader i et undersystem. Frontcontrolleren definerer en grænseflade på højt niveau, der forenkler brugen af ​​undersystemet. Ikke
opportunist Fluevægt Dette er et objekt, der præsenterer sig selv som en unik instans forskellige steder i programmet, men som faktisk ikke er det. Ja
Stedfortræder proxy Et objekt, der formidler mellem to andre objekter, og som implementerer/begrænser adgangen til det objekt, der tilgås gennem det. Ja
Adfærdsmønstre definerer interaktionen mellem objekter og øger dermed dens fleksibilitet .
Kæde af ansvar Ansvarskæde Designet til at organisere ansvarsniveauerne i systemet. Ja
Kommando , handling, transaktion kommando Repræsenterer en handling. Kommandoobjektet indeholder selve handlingen og dens parametre. Ja
Tolk tolk Løser et almindeligt, men med forbehold for ændringer, problem. Ja
Iterator , markør Iterator Repræsenterer et objekt, der giver dig mulighed for at få sekventiel adgang til elementerne i det samlede objekt uden at bruge beskrivelser af hvert af de objekter, der er en del af aggregeringen. Ja
Mægler mægler Giver interaktion mellem mange objekter, samtidig med at de danner løs kobling og eliminerer behovet for, at objekter eksplicit henviser til hinanden. Ja
Målmanden Memento Tillader, uden at krænke indkapslingen , at rette og gemme de interne tilstande af et objekt, så det senere kan gendannes i disse tilstande. Ja
Nul objekt Nul objekt Forhindrer null pointers ved at angive et "standard" objekt. Ikke
Observatør eller udgiver-abonnent Observatør Definerer en en-til-mange-afhængighed mellem objekter, således at når tilstanden for et objekt ændres, får alle afhængige af det besked om hændelsen. Ja
Tjener Tjener Bruges til at give fælles funktionalitet til en gruppe klasser. Ikke
Specifikation Specifikation Bruges til at binde forretningslogik. Ikke
Stat Stat Det bruges i de tilfælde, hvor objektet under afviklingen af ​​programmet skal ændre sin adfærd afhængigt af dets tilstand. Ja
Strategi Strategi Det er beregnet til at definere en familie af algoritmer, indkapsle hver af dem og sikre deres udskiftelighed. Ja
skabelon metode skabelon metode Definerer grundlaget for algoritmen og giver efterkommere mulighed for at omdefinere nogle trin i algoritmen uden at ændre dens struktur som helhed. Ja
Besøgende Besøgende Beskriver en operation, der udføres på objekter af andre klasser. Når besøgsklassen ændres, er der ingen grund til at ændre de servicerede klasser. Ja
Simpel politik simpel politik Ikke
begivenheds lytter begivenheds lytter Ikke
Engangsbesøger Enkelttjenende besøgende Optimerer implementeringen af ​​besøgsmønsteret, som initialiseres, bruges én gang og derefter bortskaffes. Ikke
Hierarkisk besøgende Hierarkisk besøgende Giver en måde at krydse alle hjørner af en hierarkisk datastruktur (f.eks. træ). Ikke

Samtidighed  - Samtidighed

Privat

Parallelle programmeringsmønstre ( konkurrence )

Bruges til at skrive flertrådede programmer mere effektivt og levere direkte løsninger til synkroniseringsproblemer .

Navn oprindelige navn Beskrivelse
Aktivt objekt aktivt objekt Tjener til at adskille tråden for udførelse af en metode fra tråden, hvor den blev kaldt. Bruger den asynkrone metodeopkalds- og planlægningsmønstre.
Balking Balking Bruges til kun at udføre en handling på et objekt, når det er i den korrekte tilstand.
Bindende egenskaber Kombinerer flere observatører for at holde egenskaber synkroniseret på tværs af forskellige objekter [7] .
Beskeder Messaging-mønster, Messaging-designmønster (MDP) Tillader komponenter og applikationer at udveksle information (meddelelser).
Dobbelttjek blokering Dobbelttjekket låsning Designet til at reducere omkostningerne forbundet med at få en lås.
Hændelsesbaseret Hændelsesbaseret asynkron Løsning af problemer med det asynkrone mønster, der opstår i programmer med flere tråde [8] .
Bevogtet ophæng Bevogtet ophæng Bruges til kun at blokere udførelsen af ​​en handling på et objekt, når det er i den korrekte tilstand.
Halv synk/halv asynkron
Ledere/følgere
blokering låse Én tråd låser en ressource for at forhindre andre tråde i at få adgang til eller ændre den [9] .
Overvåge Overvåge En genstand beregnet til at blive brugt sikkert af mere end én tråd.
Reaktor Reaktor Designet til synkron transmission af anmodninger til tjenesten fra en eller flere kilder.
Læse/ Læse/skrivelås Tillader flere tråde at læse information fra det delte lager på samme tid, men tillader kun én tråd ad gangen at ændre den.
Planlægger Planlægger Giver en mekanisme til at implementere en planlægningspolitik uden at være afhængig af nogen bestemt politik.
trådpulje Giver en pulje af tråde til behandling af job, normalt repræsenteret som en kø.
Trådspecifik opbevaring Tjener til at give forskellige globale variabler for forskellige tråde.
Enkeltgevind udførelse enkelt tråd udførelse Forhindrer en metode i at blive kaldt samtidig, og forhindrer derved, at metoden udføres samtidigt.
Samarbejdsmønster samarbejdsmønster Giver en mekanisme til sikkert at stoppe udførelsestråde ved at bruge et fælles flag til at signalere trådafslutning.
Objektgenereringsskabeloner Fleksible objektprogrammeringsmønstre Opgaveudførelsesmønstre Systemarkitekturmønstre Enterprise
  • Active Record  er en måde at få adgang til relationsdatabasedata i objektorienteret programmering.
  • forretningsdelegeret .
  • Sammensat enhed .
  • Sammensat visning .
  • DAO (Data Access Object) Data Access Object.
  • DispatcherView .
  • front controller .
  • Aflytningsfilter .
  • Registrering .
  • Service aktivator .
  • Service Locator .
  • Service til arbejderen .
  • Session Facade .
  • Overførselsobjektsamler .
  • Overførselsobjekt _
  • Værdilistebehandler .
  • Se Hjælper .
  • Arbejdsenhed .
Stream behandlingsdesignmønstre
  • Håndtering af arrangementer individuelt
  • Håndtering ved hjælp af lokal stat
  • Flertrinsbearbejdning/genopdeling
  • Behandling ved hjælp af en ekstern mappe: tilslutning af et dataflow til en tabel
  • Tilslutning af datastrømme
  • Ekstraordinære begivenheder
  • Genoparbejdning
Distribuerede systemdesignmønstre Databaseskabeloner
  • datakortlægger
  • Identitetskort
  • Arbejdsenhed
  • Doven belastning
Andre
  • Depot / Depot .

Andre typer mønstre

Også i dag findes der en række andre skabeloner.

  • Carrier Rider Mapper beskriver leveringen af ​​adgang til lagrede oplysninger.
  • Analytiske skabeloner beskriver den grundlæggende tilgang til at skrive krav til software (kravanalyse), før man starter selve softwareudviklingsprocessen.
  • Kommunikationsmønstre beskriver kommunikationsprocessen mellem individuelle medlemmer/ansatte i en organisation.
  • Organisationsmønstre beskriver en virksomheds/virksomheds organisatoriske hierarki
  • Anti -Design-Patterns beskriver, hvad man ikke skal gøre, når man udvikler programmer, og viser typiske fejl i design og implementering.

Se også

Noter

  1. McConnell, 2005 , s. 100-101.
  2. McConnell, 2005 , s. 101.
  3. Designmønstre i Haskell
  4. Peter Norvig - Designmønstre i dynamiske sprog (slides)
  5. Nørdernes hævn . — "I OO-verdenen hører man en hel del om "mønstre". Jeg spekulerer på, om disse mønstre ikke nogle gange er bevis på case (c), den menneskelige kompilator, på arbejde. Når jeg ser mønstre i mine programmer, betragter jeg det som et tegn på problemer. Formen af ​​et program bør kun afspejle det problem, det skal løse. Enhver anden regelmæssighed i koden er i det mindste for mig et tegn på, at jeg bruger abstraktioner, der ikke er kraftige nok - ofte at jeg manuelt genererer udvidelserne af en eller anden makro, som jeg skal skrive."
  6. Abelson, Sussman. Struktur og fortolkning af computerprogrammer (SICP). . citater: " Procedure og dataabstraktioner kan bygges, højere ordens funktioner kan bruges til at fange almindelige brugsmønstre, ... og indbyggede sprog kan nemt implementeres. "(s.16); " En af de ting, vi bør forvente af et kraftfuldt programmeringssprog, er evnen til at bygge abstraktioner ved at navngive fælles skemaer og derefter arbejde direkte på disse abstraktioner. … Ofte bruges det samme programskema med forskellige procedurer. For at udtrykke disse skemaer som begreber er vi nødt til at bygge procedurer, der tager andre procedurer som argumenter eller returnerer dem som værdier. "(s. 70); “ at definere skabelonskemaer som procedurer tjener som et middel til abstraktion. "(s. 263); kapitel 4.1.5 "Data som programmer" (s.357-360); begrebet " abstraktionsmidler " og deres rolle er givet på s.25.
  7. Bindende egenskaber
  8. Christian Nagel, Bill Evjen, Jay Glynn, Karli Watson og Morgan Skinner. Hændelsesbaseret asynkront mønster // Professional C# 2008  (neopr.) . - Wiley, 2008. - S.  570 -571. — ISBN 9780470191378 .
  9. Låsemønster
  10. Interview og boguddrag: Dan Haywoods domænedrevne design ved hjælp af nøgne objekter

Litteratur

  • Zandstra M. PHP. Objekter, mønstre og programmeringsteknikker. - 5. udgave - Sankt Petersborg. : " Dialektik ", 2019. - S. 736. - ISBN 978-5-907144-54-5 .
  • Fowler, Martin. JavaScript-kode refactoring: forbedring af designet af eksisterende kode. - 2. udg. - Sankt Petersborg. : " Dialektik ", 2019. - S. 464. - ISBN 978-5-907144-59-0 .
  • Gamma E., Helm R., Johnson R., Vlissides J. Teknikker til objektorienteret design. Designmønstre = PHP-objekter, mønstre og praksis, tredje udgave. — 3. udgave. - M . : " Williams ", 2015. - S. 368. - ISBN 978-5-496-00389-6 .
  • Jason McColm Smith. Elemental Design Patterns = Elemental Design Patterns. - M . : " Williams ", 2012. - 304 s. — ISBN 978-5-8459-1818-5 .
  • Fowler, Martin, Beck, Kent, Brant, John, Opdike, William, Roberts, Don. Refactoring: forbedring af designet af eksisterende kode. - M . : " Dialektik ", 2019. - 448 s. - ISBN 978-5-9909445-1-0 .
  • Martin Fowler. Mønstre for Enterprise Application Architecture (Addison-Wesley Signature Series). - M . : " Williams ", 2012. - 544 s. - ISBN 978-5-8459-1611-2 .
  • Mark Grand. Design mønstre i JAVA. Et katalog over genanvendelige designmønstre illustreret med UML = Patterns in Java, bind 1. Et katalog over genbrugelige designmønstre illustreret 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 kode = Kode komplet. - Sankt Petersborg. : Peter, 2005. - S. 896. - (Mesterklasse). - ISBN 5-7502-0064-7 , 5-469-00822-3.
  • Nia Narhid, Gwen Shapira, Todd Palino. Apache Kafka. Stream behandling og dataanalyse. Peter, 2019. - s. 320. - (O'Reilly Bestsellers) - ISBN 978-5-4461-0575-5 .

Links