X. Vývoj a testování softwaru. Vzory při vývoji softwaru. Testování softwaru... Flashcards
Vzory při vývoji softwaru
Softwarové vzory
Každý vzor vyjadřuje vztah mezi problémem a řešením. Jako součást světa má každý vzor vazbu na určitý kontext, určitý systém sil, který se opakovaně objevuje v daném kontextu a na určité prostorové uspořádání, jež umožňuje těmto sílám rozhodovat se.
Typy SW vzorů:
- architektonické – rozložení složitější aplikace do logických celků, které spolu komunikuji. ;
- analytické – týká se samotné fáze analytického modelování, tedy návrhu logické vrstvy aplikace; všechna nabízená řešení se týkají podstaty logiky aplikace;
- návrhové – pojmenované a popsané řešení typického problému;
- vzory kódu
- vzory pro UI
Návrhové vzory
Návrhové vzory
Návrhové vzory jsou doporučené postupy řešení často vyskytujících se úloh.
Lze je přirovnat k matematickým vzorečkům, nedosazujeme však čísla, ale třídy, rozhrání a objekty.
Snižují pravděpodobnost chyb.
Vštěpují zásady správného programování
Zestručňují komunikaci.
Velké SW firmy jejich znalost vyžadují.
Existují katalogy návrhových vzorů – nejznámější je GoF (Gang of Five – skupina 5 významných programátorů, popisuje 23 základních, obecně použitelných návrhových vzorů).
V zápisu návrhových vzorů se používá zakreslení vztahů a postupů pomocí UML diagramů a současně také slovní popis, který dané diagramy doprovází.
Definují ověřená řešení určitých problémů návrhu.
Důvod vzniku – potřeba elegantního, jednoduchého a znovupoužitelného řešení.
Je třeba najít vhodné objekty, definovat rozhraní tříd, definovat hierarchii dědičnosti, definovat vztahy mezi třídami.
Cíl návrhových vzorů:
Cíl:
- sepsat katalog obecných interakcí, které byly vícekrát použity;
- chceme získat nezávislost tříd – volné vazby;
- u dědičnosti má potomek přístup k metodám a nesoukromým proměnným předka, když je na vrcholu hierarchie třída s definovanou implementací, tak potomci jí mají také.
Formát vzoru (jednoduchý)
Formát vzoru (jednoduchý):
- název problému;
- problém (kdy se má vzor používat);
- řešení (prvky řešení);
- důsledky (důsledky použití vzoru);
- související vzory.
Návrhové vzory podle Pecinovského (které nejsou součástí GoF):
Návrhové vzory podle Pecinovského (které nejsou součástí GoF):
- Jednoduchá tovární metoda – metoda, která umí vracet instanci deklarovaného typu (buď jí vytvoří, nebo najde nějakou již existující). Normální konstruktor umí instanci jen vytvořit, a navíc umí vytvářet jen instance své třídy + má další omezení.
- Přepravka (messenger) – pokud potřebuji, aby metoda vracela více hodnot najednou, tak je můžu dát do přepravky – to je třída, jejíž instance přenáší požadované hodnoty ve svých atributech. Tyto atributy bývají veřejné, aby bylo možné přistupovat k hodnotám přímo. Samozřejmě ale mohou být privátní, a tedy přístupné jen přes příslušné metody. Přepravka tedy může mít i metody. Každá přepravka má předem připravené atributy, které se jen naplňují – pro každý typ přenášených hodnot tedy musí existovat zvláštní přepravka (např. přepravka na rozměry má atributy x a y).
- Knihovní třída (utility) – třída, která slouží jako úložiště (knihovna) často používaných metod – je to lepší než mít v každé třídě tu samou implementaci těchto metod. Metody v této třídě bývají statické. Obvykle nemá smysl vytvářet instanci této třídy, proto její konstruktor bývá privátní, bezparametrický a s prázdným tělem.
- A další – kontejner, výčtový typ, neměnné objekty, služebník, prázdný objekt…
Členění podle GoF:
Členění podle GoF:
- Structural Patterns (strukturální vzory)– zaměřující se na možnosti uspořádání jednotlivých tříd nebo komponent v systému.
- Creational patterns (vzory pro vytváření objektů) – řeší problémy související s vytvářením objektů v systému.
- Behavioral patterns (vzory chování) – zajímají se o chování systému.
Strukturální vzory
Strukturální vzory:
- Adapter
- Bridge
- Composite
- Decorator
- Fascade
- Flyweight
- Proxy
Adapter
-
Adapter
- potřebujeme existující rozhraní objektu přetransformovat na rozhraní, které v danou chvíli potřebujeme;
- může se implementovat třemi různými způsoby. Vždy ale jde o to, že adaptér tvoří prostředníka mezi klientem volajícím určitou metodu a třídami, které tuto metodu implementují, a přesměrovává volání od klienta na některou z těchto tříd.;
- příklady
- obalové třídy primitivních datových typů v Javě – abychom mohli používat metody, které se dotazují na jejich hodnoty, musí být primitivní datové typy obalené adaptérem;
- zajištění zpětné kompatibility systému – požadavky se musí zpracovávat podle toho, jaké rozhraní klient očekává.
Bridge
-
Bridge
- zavádí rozhraní, které odděluje abstrakcí zprostředkovávající nějakou službu od její implementace, takže lze obojí měnit nezávisle na sobě;
- příklad
- okno v GUI – abstrakce okna a její funkcionalita x specifická implementace na konkrétním OS.
Composite
-
Composite
- slouží pro jednotné vyjádření hierarchií typu celek-část;
- příklad – stromová struktura.
Decorator
Decorator
- dynamicky připojuje další funkcionalitu k objektu – pokud chci, aby více objektů získalo určitou funkcionalitu, a nechci jí v každém implementovat zvlášť, tak je zabalím do určité třídy. Obalující třída má na starosti jen požadovanou funkcionalitu a zbytek deleguje na obalený objekt;
- flexibilní alternativa dědění;
- někdy potřebujeme přidat odpovědnosti jen jednotlivým objektům, nikoli celé třídě;
- často se používá v Jave v GUI – např. při návrhu GUI potřebujete přidat ohraničení nebo rolování k určité komponentě. Řešení je, že vložíte komponentu do dekorátoru;
- implementace – mám několik tříd, kterým potřebuju dodat určitou funkcionalitu. Tak jim vytvořím společné rozhraní, které implementují nejen tyto třídy, ale i dekorátory. Stejně tak můžu udělat s pomocí abstraktní třídy, která bude předkem těchto tříd a tak může implementovat nějakou funkcionalitu, která je pro všechny dceřiné třídy společná.
Decorator
-
Decorator
- dynamicky připojuje další funkcionalitu k objektu – pokud chci, aby více objektů získalo určitou funkcionalitu, a nechci jí v každém implementovat zvlášť, tak je zabalím do určité třídy. Obalující třída má na starosti jen požadovanou funkcionalitu a zbytek deleguje na obalený objekt;
- flexibilní alternativa dědění;
- někdy potřebujeme přidat odpovědnosti jen jednotlivým objektům, nikoli celé třídě;
- často se používá v Jave v GUI – např. při návrhu GUI potřebujete přidat ohraničení nebo rolování k určité komponentě. Řešení je, že vložíte komponentu do dekorátoru;
- implementace – mám několik tříd, kterým potřebuju dodat určitou funkcionalitu. Tak jim vytvořím společné rozhraní, které implementují nejen tyto třídy, ale i dekorátory. Stejně tak můžu udělat s pomocí abstraktní třídy, která bude předkem těchto tříd a tak může implementovat nějakou funkcionalitu, která je pro všechny dceřiné třídy společná.
Fascade
Fascade
- cílem je zjednodušit (sjednotit) rozhraní;
- snižuje počet tříd, se kterými musí uživatel komunikovat.
Flyweight
Flyweight
- vzor vhodný pro situace, kdy vzniká mnoho malých objektů, u kterých je možné podstatnou část jejich stavu sdílet nebo ho nahradit výpočtem;
Proxy
-
Proxy
- zavádí zástupce, který odstiňuje objekt od jeho uživatelů a sám řídí přístup uživatelů k danému objektu
Vzory pro vytváření objektů (Creational patterns)
Vzory pro vytváření objektů
Řeší problémy související s vytvářením objektů v systému:
- snaží se oddělit vytváření objektů do samostatné třídy/tříd
- konkrétní třída, od níž se vytváří instance, se určuje až za běhu programu
- třeba zajistit správný počet objektů
- tovární metoda (factory method)
- abstraktní továrna (abstract factory)
- stavitel (builder)
- prototype
- jedináček
Tovární metoda (factory method)
-
tovární metoda (factory method)
- několik tříd, které mají obvykle společného předka a poskytují různé služby
- dovoluje za běhu programu vytvořit instanci některé z těchto tříd
- definuje rozhraní pro vytváření objektu; přenechává rozhodnutí, od které třídy vytvořit objekt, na své podtřídy
Abstraktní továrna
-
abstraktní továrna (abstract factory)
- při vytváření více objektů, které spolu souvisí
- poskytuje rozhraní pro vytváření rodiny příbuzných objektů bez nutnosti specifikovat konkrétní třídy
- složená třída obsahující stejné složky vytvářené různě v závislosti na aplikaci
- abstraktní továrna je založena na myšlence, že se jako parametr do konstruktoru předá třída (továrna) se standardním rozhraním – to je pak použito konstruktorem, ale jeho metody jsou implementovány odlišně pro každý typ továrny
Stavitel (builder)
-
stavitel (builder)
- podobný abstract factory
- máme různé objekty s podobným procesem konstrukce
Prototype
-
prototype
- vytvoření kopie existujícího objektu namísto vytváření nové třídy (v Javě rozhraní Cloneable)
Jedináček (singleton)
jedináček (singleton)
- cílem je zabránit vícenásobnému spouštění konstruktoru – chceme, aby třída měla pouze jedinou instanci
- řešení
- použít statickou proměnnou třídy, která bude obsahovat informaci o tom, zda již byla vytvořena instance třídy
- definovat privátní konstruktor třídy
- definovat statickou metodu getInstance(), která bude vracet instanci třídy
- příklady
- jediné připojení k databázi
- správce tiskových úloh
Vzory chování
Vzory chování
- mediator (prostředník)
- observer (pozorovatel)