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.
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ů.
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]
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] .
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
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. |
Také dnes existuje řada dalších šablon.
Designové vzory | |
---|---|
Hlavní | |
Generativní | |
Strukturální | |
Behaviorální | |
Paralelní programování |
|
architektonický |
|
Java EE šablony | |
Jiné šablony | |
knihy | |
Osobnosti |