Návrhový vzor

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 19. prosince 2021; kontroly vyžadují 6 úprav .

Návrhový vzor nebo vzor ( anglicky  design pattern ) ve vývoji softwaru  je opakovatelný architektonický návrh , který je řešením designového problému v nějakém často se vyskytujícím kontextu .

Šablona obvykle není úplný příklad, který lze přímo převést na kód ; toto je pouze příklad řešení problému, které lze použít v různých situacích. Objektově orientované vzory ukazují vztahy a interakce mezi třídami nebo objekty , aniž by specifikovaly, které konečné třídy nebo aplikační objekty budou použity.

Vzory „nízké úrovně“, které berou v úvahu specifika konkrétního programovacího jazyka, se nazývají idiomy . Jedná se o dobrá návrhová rozhodnutí, která jsou specifická pro konkrétní jazyk nebo softwarovou platformu, a proto nejsou univerzální.

Na nejvyšší úrovni existují architektonické vzory , které pokrývají architekturu celého softwarového systému .

Algoritmy jsou ve své podstatě také vzory, ale ne návrhové vzory, ale výpočty , protože řeší výpočetní problémy.

Historie

V 70. letech 20. století sestavil architekt Christopher Alexander soubor návrhových vzorů. V oblasti architektury se tato myšlenka nerozvinula tolik jako později v oblasti vývoje softwaru.

V roce 1987 Kent Beck a Ward Cunningham převzali Alexanderovy nápady a vyvinuli šablony pro vývoj softwaru Smalltalk GUI .

V roce 1988 začal Erich Gamma psát svou doktorskou práci na univerzitě v Curychu o obecné přenositelnosti této techniky na vývoj softwaru.

V letech 1989 až 1991 James Coplien pracoval na vývoji programovacích idiomů C ++ a v roce 1991 publikoval Advanced C++ Idioms.

Ve stejném roce Erich Gamma dokončuje svou doktorskou práci a stěhuje se do USA , kde ve spolupráci s Richardem Helmem (Richard Helm), Ralphem Johnsonem (Ralph Johnson) a Johnem Vlissidesem (John Vlissides) vydává knihu Design Patterns - Prvky opakovaně použitelného objektově orientovaného softwaru . Tato kniha popisuje 23 návrhových vzorů. Také kolektiv autorů této knihy je veřejnosti znám pod názvem "Gang of Four" ( angl.  Gang of Four , často zkráceno na GoF ). Právě tato kniha způsobila nárůst popularity designových vzorů.

Pro

Ve srovnání se zcela nezávislým designem mají šablony řadu výhod. Hlavním přínosem používání šablon je snížení složitosti vývoje prostřednictvím hotových abstrakcí k řešení celé třídy problémů. Šablona dává řešení svůj název, což usnadňuje komunikaci mezi vývojáři tím, že umožňuje odkazy na známé šablony. Díky šablonám se tak sjednocují detaily řešení: moduly, prvky projektu a snižuje se počet chyb. Použití šablon je koncepčně podobné používání hotových knihoven kódů. Dobře formulovaný designový vzor umožňuje po nalezení dobrého řešení jej znovu a znovu používat. Sada šablon pomáhá vývojářům vybrat možnou a nejvhodnější variantu návrhu. [jeden]

Nevýhody

Zatímco snadná úprava kódu, aby se vešel do známého vzoru, může kódu usnadnit pochopení, podle Steva McConnella existují dva problémy s používáním vzorů. Za prvé, slepé následování vybraného vzoru může vést ke složitosti programu. Za druhé, vývojář může být v pokušení vyzkoušet určitý vzor bez zvláštního důvodu (viz Zlaté kladivo ). [2]

Mnoho návrhových vzorů v objektově orientovaném designu lze považovat za idiomatické reprodukce prvků funkčních jazyků [3] . Peter Norvig tvrdí, že 16 z 23 vzorů popsaných v Gangs of Four je mnohem snazší implementovat v dynamicky typovaných jazycích než v C++ nebo jsou neviditelné [4] . Paul Graham považuje samotnou myšlenku designových vzorů za antipattern , signál, že systém nemá dostatečnou úroveň abstrakce a je třeba jej pečlivě přepracovat [5] . Je snadné vidět, že samotná definice šablony jako „ hotového řešení, nikoli však přímého volání do knihovny “ v podstatě znamená odmítnutí opětovného použití ve prospěch duplikace . To může být samozřejmě nevyhnutelné u složitých systémů, když se používají jazyky, které nepodporují kombinátory a typový polymorfismus , a v zásadě to lze vyloučit v jazycích, které mají vlastnost homoikonickosti (i když ne nutně efektivně), protože jakýkoli vzor může být implementován ve spustitelném kódu [6] .

Typy návrhových vzorů

Základní

název původní název Popis Popsáno v Návrhové vzory
Základní šablony (základní)
Vzor delegování delegování vzor Objekt navenek vyjadřuje nějaké chování, ale ve skutečnosti přenáší odpovědnost za provádění tohoto chování na přidružený objekt. n/a
funkční šablona návrhu funkční design Zajišťuje, že každý modul počítačového programu má pouze jednu odpovědnost a provádí ji s minimem vedlejších účinků na ostatní části programu. n/a
Neměnné rozhraní Neměnné rozhraní Vytvoření neměnného objektu . n/a
Rozhraní Rozhraní Obecná metoda pro strukturování počítačových programů tak, aby byly srozumitelnější. n/a
Značka rozhraní Rozhraní značky Jako atribut (jako značka entity) se používá přítomnost nebo nepřítomnost implementace rozhraní markeru. Moderní programovací jazyky mohou místo toho používat atributy nebo anotace. n/a
Kontejner majetku kontejner majetku Umožňuje přidat další vlastnosti pro třídu do kontejneru (v rámci třídy), namísto rozšiřování třídy o nové vlastnosti. n/a
Kanál události kanál událostí Rozšiřuje vzor Publish/Subscribe a vytváří centralizovaný kanál pro události. Používá proxy pro přihlášení k odběru a proxy pro publikování události na kanálu. Zástupce existuje odděleně od skutečného vydavatele nebo předplatitele. Předplatitel může přijímat publikované události od více než jednoho subjektu, i když je registrován pouze na jednom kanálu. n/a
Kreativní vzory  jsou návrhové vzory, které abstrahují proces vytváření instance . Umožňují učinit systém nezávislým na způsobu vytváření, skládání a prezentace objektů. Šablona, ​​která generuje třídy, používá dědičnost k úpravě vytvářené třídy, zatímco šablona, ​​která generuje objekty, deleguje konkretizaci na jiný objekt.
Abstraktní továrna abstraktní továrna Třída, která představuje rozhraní pro vytváření systémových komponent. Ano
Stavitel Stavitel Třída, která představuje rozhraní pro vytváření komplexního objektu. Ano
tovární metoda tovární metoda Definuje rozhraní pro vytváření objektu, ale ponechává na podtřídách, aby rozhodly, kterou třídu vytvoří. Ano
Líná inicializace Líná inicializace Objekt, který je inicializován při prvním přístupu. Ne
Vícetónové Vícetónové Zajišťuje, že třída má pojmenované instance objektů a poskytuje jim globální přístupový bod. Ne
Objekt bazén objektový bazén Třída, která představuje rozhraní pro práci se sadou inicializovaných objektů připravených k použití. Ne
Prototyp prototyp Definuje rozhraní pro vytváření objektu prostřednictvím klonování jiného objektu namísto jeho vytváření pomocí konstruktoru. Ano
Získávání prostředků je inicializace Získávání zdrojů je inicializace (RAII) Získání nějakého zdroje je spojeno s inicializací a uvolněním - se zničením objektu. Ne
samotář jedináček Třída, která může mít pouze jednu instanci. Ano
Strukturální šablony (Structural) definují různé složité struktury, které mění rozhraní existujících objektů nebo jeho implementaci, což usnadňuje vývoj a optimalizaci programu.
Adaptér Adaptér/Wrapper Objekt, který umožňuje interakci dvou dalších objektů, z nichž jeden používá a druhý poskytuje rozhraní, které je nekompatibilní s prvním. Ano
Most Most Struktura, která umožňuje nezávisle měnit rozhraní volání a rozhraní implementace třídy. Ano
Linker Kompozitní Objekt, který kombinuje objekty jemu podobné. Ano
Dekoratér nebo Wrapper dekoratér Třída, která rozšiřuje funkčnost jiné třídy bez použití dědičnosti. Ano
Fasáda fasáda Objekt, který abstrahuje práci s více třídami tím, že je kombinuje do jediné entity. Ano
Jediný vstupní bod přední ovladač Poskytuje jednotné rozhraní pro rozhraní v podsystému. Front Controller definuje rozhraní na vysoké úrovni, které zjednodušuje použití subsystému. Ne
oportunista Muší váha Jedná se o objekt, který se prezentuje jako jedinečná instance na různých místech v programu, ale ve skutečnosti tomu tak není. Ano
Zástupce proxy Objekt, který zprostředkovává mezi dvěma dalšími objekty a který implementuje/omezuje přístup k objektu, ke kterému se přes něj přistupuje. Ano
Vzorce chování definují interakci mezi objekty, čímž zvyšují její flexibilitu.
Řetězec odpovědnosti Řetězec odpovědnosti Navrženo k uspořádání úrovní odpovědnosti v systému. Ano
Příkaz , akce, transakce příkaz Představuje akci. Objekt příkazu obsahuje samotnou akci a její parametry. Ano
Tlumočník tlumočník Řeší běžný, ale podléhající změnám, problém. Ano
Iterátor , kurzor Iterátor Představuje objekt, který vám umožňuje získat sekvenční přístup k prvkům agregovaného objektu bez použití popisů každého z objektů, které jsou součástí agregace. Ano
Prostředník prostředník Poskytuje interakci mnoha objektů a zároveň vytváří volné spojení a eliminuje potřebu, aby na sebe objekty výslovně odkazovaly. Ano
Strážce Memento Umožňuje, aniž by došlo k porušení zapouzdření , opravit a uložit vnitřní stavy objektu, aby jej bylo možné později v těchto stavech obnovit. Ano
Objekt Null Objekt Null Zabrání nulovým ukazatelům poskytnutím "výchozího" objektu. Ne
Pozorovatel nebo vydavatel-předplatitel Pozorovatel Definuje závislost typu one-to-many mezi objekty tak, že když se stav jednoho objektu změní, všechny na něm závislé jsou upozorněny na událost. Ano
sluha Služebník Používá se k poskytování společných funkcí skupině tříd. Ne
Specifikace Specifikace Používá se k propojení obchodní logiky. Ne
Stát Stát Používá se v těch případech, kdy během provádění programu musí objekt změnit své chování v závislosti na svém stavu. Ano
Strategie strategie Je určen k definování rodiny algoritmů, zapouzdření každého z nich a zajištění jejich zaměnitelnosti. Ano
šablonová metoda šablonová metoda Definuje základ algoritmu a umožňuje potomkům předefinovat některé kroky algoritmu bez změny jeho struktury jako celku. Ano
Návštěvník Návštěvník Popisuje operaci, která se provádí na objektech jiných tříd. Když se třída Návštěvník změní, není třeba měnit obsluhované třídy. Ano
Jednoduchá politika jednoduchá politika Ne
posluchač události posluchač události Ne
Jednorázový návštěvník Jednoobslužný návštěvník Optimalizuje implementaci vzoru návštěvníka, který je inicializován, jednou použit a poté zlikvidován. Ne
Hierarchický návštěvník Hierarchický návštěvník Poskytuje způsob, jak procházet všemi vrcholy hierarchické datové struktury (např. stromu). Ne

Concurrency  - Souběh

Soukromé

Paralelní programovací vzory ( souběžnost )

Používá se k efektivnějšímu psaní vícevláknových programů a poskytuje okamžitá řešení problémů se synchronizací .

název původní název Popis
Aktivní objekt aktivní objekt Slouží k oddělení vlákna provádění metody od vlákna, ve kterém byla volána. Používá volání asynchronní metody a vzory plánovače.
Balking Balking Používá se k provedení akce s objektem, pouze když je ve správném stavu.
Vazebné vlastnosti Kombinuje více pozorovatelů, aby byly vlastnosti synchronizovány napříč různými objekty [7] .
Zprávy Vzor zpráv, návrhový vzor zpráv (MDP) Umožňuje komponentám a aplikacím vyměňovat si informace (zprávy).
Dvojitá kontrola blokování Dvojitě kontrolované zamykání Navrženo pro snížení režie spojené se získáním zámku.
založené na událostech Asynchronní založené na událostech Řešení problémů s asynchronním vzorem, které vznikají v programech s více vlákny [8] .
Hlídané zavěšení Hlídané odpružení Používá se k zablokování provádění akce na objektu, pouze když je ve správném stavu.
Half Sync/Half Async
Vedoucí/následovníci
blokování zámek Jedno vlákno uzamkne zdroj, aby k němu ostatní vlákna nemohla přistupovat nebo jej upravovat [9] .
Monitor Monitor Objekt určený k bezpečnému použití více než jedním vláknem.
reaktor Reaktor Navrženo pro synchronní přenos požadavků na službu z jednoho nebo více zdrojů.
čtení/zápisu Zámek čtení/zápisu Umožňuje více vláknům číst informace ze sdíleného úložiště současně, ale umožňuje je upravit pouze jednomu vláknu.
Plánovač Plánovač Poskytuje mechanismus pro implementaci plánovací politiky, aniž by byl závislý na nějaké konkrétní politice.
fond vláken Poskytuje fond vláken pro zpracování úloh, obvykle reprezentovaných jako fronta.
Úložiště specifické pro vlákna Slouží k poskytování různých globálních proměnných pro různá vlákna.
Jednovláknové provedení provedení jednoho vlákna Zabrání souběžnému volání metody, čímž zabrání současnému provedení této metody.
Kooperativní vzor kooperativní vzor Poskytuje mechanismus pro bezpečné zastavení provádění vláken pomocí společného příznaku k signalizaci ukončení vlákna.
Šablony pro generování objektů Flexibilní vzory objektového programování Vzory provádění úkolů Vzory systémové architektury Enterprise
  • Active Record  je způsob přístupu k datům relační databáze v objektově orientovaném programování.
  • obchodní delegát .
  • Složená entita .
  • Složený pohled .
  • Objekt pro přístup k datům DAO (Data Access Object).
  • DispatcherView .
  • přední ovladač .
  • Záchytný filtr .
  • Registr .
  • Servisní aktivátor .
  • Lokátor služeb .
  • Služba pro pracovníka .
  • Fasáda zasedání .
  • Přenos objektů Assembler .
  • Přenést objekt
  • Popisovač seznamu hodnot .
  • Zobrazit pomocníka .
  • Pracovní jednotka .
Návrhové vzory zpracování streamu
  • Vyřizování akcí individuálně
  • Manipulace pomocí místního státu
  • Vícestupňové zpracování/přerozdělení
  • Zpracování pomocí externího adresáře: připojení datového toku k tabulce
  • Připojení datových toků
  • Mimořádné události
  • Přepracování
Návrhové vzory distribuovaných systémů Šablony databáze
  • mapovač dat
  • Identifikační mapa
  • Jednotka práce
  • Líná zátěž
Ostatní
  • Úložiště / Úložiště .

Jiné typy vzorů

Také dnes existuje řada dalších šablon.

  • Carrier Rider Mapper popisuje poskytování přístupu k uloženým informacím.
  • Analytické šablony popisují základní přístup k psaní požadavků na software (analýza požadavků) před zahájením vlastního procesu vývoje softwaru.
  • Komunikační vzorce popisují proces komunikace mezi jednotlivými členy/zaměstnanci organizace.
  • Organizační vzory popisují organizační hierarchii podniku/firmy
  • Anti -Design-Patterns popisují, co se nedělá při vývoji programů, přičemž ukazují typické chyby v návrhu a implementaci.

Viz také

Poznámky

  1. McConnell, 2005 , str. 100-101.
  2. McConnell, 2005 , str. 101.
  3. Návrhové vzory v Haskellu
  4. Peter Norvig - Návrhové vzory v dynamických jazycích ​​(snímky)
  5. Pomsta pitomců . — „Ve světě OO slyšíte hodně o „vzorcích“. Zajímalo by mě, jestli tyto vzory nejsou někdy důkazem případu (c), lidského kompilátoru, v práci. Když vidím vzory ve svých programech, považuji to za známku potíží. Tvar programu by měl odrážet pouze problém, který potřebuje vyřešit. Jakákoli jiná pravidelnost v kódu je, alespoň pro mě, známkou toho, že používám abstrakce, které nejsou dostatečně výkonné – často, že ručně generuji rozšíření nějakého makra, které potřebuji napsat.".
  6. Abelson, Sussman. Struktura a interpretace počítačových programů (SICP). . citáty: “ Lze sestavit abstrakce procedur a dat, použít funkce vyššího řádu k zachycení běžných vzorců používání, … a snadno implementovat vestavěné jazyky. "(str. 16); „ Jednou z věcí, kterou bychom měli od výkonného programovacího jazyka očekávat, je schopnost vytvářet abstrakce pojmenováním společných schémat a poté na těchto abstracích přímo pracovat. … Často se používá stejné programové schéma s různými postupy. Abychom mohli tato schémata vyjádřit jako koncepty, musíme sestavit procedury, které berou jiné procedury jako argumenty nebo je vracejí jako hodnoty. "(str. 70); “ definování šablon šablon jako procedur slouží jako prostředek abstrakce. "(str. 263); kapitola 4.1.5 "Data jako programy" (str.357-360); pojem " prostředky abstrakce " a jejich role jsou uvedeny na str.25.
  7. Vlastnosti vazby
  8. Christian Nagel, Bill Evjen, Jay Glynn, Karli Watson a Morgan Skinner. Asynchronní vzor založený na událostech // Professional C# 2008  (neopr.) . - Wiley, 2008. - S.  570 -571. — ISBN 9780470191378 .
  9. Zamknout vzor
  10. Rozhovor a úryvek z knihy: Doménový design Dana Haywooda využívající nahé předměty

Literatura

  • Zandstra M. PHP. Objekty, vzory a programovací techniky. - 5. vyd. - Petrohrad. : " Dialektika ", 2019. - S. 736. - ISBN 978-5-907144-54-5 .
  • Fowler, Martin. Refaktorování kódu JavaScript: vylepšení návrhu stávajícího kódu. - 2. vyd. - Petrohrad. : " Dialektika ", 2019. - S. 464. - ISBN 978-5-907144-59-0 .
  • Gamma E., Helm R., Johnson R., Vlissides J. Techniky pro objektově orientovaný design. Návrhové vzory = PHP objekty, vzory a praxe, třetí vydání. — 3. vydání. - 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. Refaktoring: zlepšení návrhu stávajícího kódu. - M . : " Dialektika ", 2019. - 448 s. - ISBN 978-5-9909445-1-0 .
  • Martin Fowler. Vzory architektury podnikových aplikací (Série Addison-Wesley Signature). - M .: " Williams ", 2012. - 544 s. - ISBN 978-5-8459-1611-2 .
  • Mark Grand. Návrhové vzory v JAVA. Katalog opakovaně použitelných návrhových vzorů ilustrovaných pomocí UML = vzory v Javě, svazek 1. Katalog opakovaně použitelných návrhových vzorů ilustrovaných pomocí UML. - M . : " Nové poznatky ", 2004. - S. 560. - ISBN 5-94735-047-5 .
  • Craig Larman. Aplikace UML 2.0 a návrhových vzorů = Aplikace UML a vzorů: Úvod do objektově orientované analýzy a návrhu a iterativního vývoje. - M .: " Williams ", 2006. - S. 736. - ISBN 0-13-148906-2 .
  • Steve McConnell. Perfektní kód = Kód dokončen. - Petrohrad. : Peter, 2005. - S. 896. - (Mistrovská třída). - ISBN 5-7502-0064-7 , 5-469-00822-3.
  • Nia Narhid, Gwen Shapira, Todd Palino. Apache Kafka. Zpracování datových proudů a analýza dat. Peter, 2019. - s. 320. - (O'Reilly Bestsellers) - ISBN 978-5-4461-0575-5 .

Odkazy