Semin aˇr Java X Radek Koˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2011 Radek Koˇc ı Semin aˇr Java N avrhov e vzory, Z asady...



Podobné dokumenty
Obsah Znovupou ˇzitelnost N avrhov e vzory Z asady programov an ı Radek Koˇc ı Semin aˇr Java N avrhov e vzory, Z asady... 2/ 46

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2009 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 25

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2008 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 24

Návrhové vzory. Jakub Klemsa, Jan Legerský. 30. října Objektově orientované programování.

typová konverze typová inference

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Java efektivně. Lukáš Zapletal liberix.cz. Pokročilejší techniky programování v Javě

Základy objektové orientace I. Únor 2010

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

Seminář Java IV p.1/38

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Generické programování

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

, Brno Připravil: David Procházka Návrhové vzory

Výčtový typ strana 67

Návrhové vzory OMO, LS 2014/2015

Úvod do programovacích jazyků (Java)

Typický prvek kolekce pro české řazení

20. Projekt Domácí mediotéka

Kód, který se nebude často měnit

specifikuje vytvářené objekty pomocí prototypické instance nový objekt vytváří kopírováním prototypu

UJO Framework. revoluční architektura beans. verze

Návrhové vzory Design Patterns

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Abstraktní datové typy: zásobník

Abstract Factory úvod

Vzor Továrna - Factory

Algoritmizace a programování

Programování v Javě I. Leden 2008

KTE / ZPE Informační technologie

11 Diagram tříd, asociace, dědičnost, abstraktní třídy

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Teoretické minimum z PJV

Dědění, polymorfismus

Seminář Java II p.1/43

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Programování v Javě I. Únor 2009

Principy objektově orientovaného programování

8 Třídy, objekty, metody, předávání argumentů metod

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Jazyk C# (seminář 6)

IRAE 07/08 Přednáška č. 1

Výchozí a statické metody rozhraní. Tomáš Pitner, upravil Marek Šabo

Java a XML. 10/26/09 1/7 Java a XML

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

1. Dědičnost a polymorfismus

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

10 Balíčky, grafické znázornění tříd, základy zapozdření

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

1. Programování proti rozhraní

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

George J. Klir. State University of New York (SUNY) Binghamton, New York 13902, USA

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

State. Známý jako. Účel. Použitelnost. Stav, Object for States. umožňuje objektu měnit svoje chování v závislosti na stavu objekt mění svou třídu

Abstraktní třída a rozhraní

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Jazyk C# (seminář 3)

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Úvod - problém. Při přidání nového modelu je nutné upravit. Kód, který se nebu de často měnit. n Mějme obchod s auty:

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Objektově orientované programování v PHP 5. Martin Klíma

Vytváření a použití knihoven tříd

Neměnné objekty. Tomáš Pitner, upravil Marek Šabo

Iterator & for cyklus

PŘETĚŽOVÁNÍ OPERÁTORŮ

Projekty pro výuku programování v jazyce Java

Programování v C++ 2, 4. cvičení

návrhový vzor Singleton.

Klíčová slova: OOP, konstruktor, destruktor, třída, objekt, atribut, metoda

Návrhové vzory. n OO jazyky - široká paleta technických prostředků. n Návrhový vzor. n rozhraní!! n volnější vazby, parametrizace

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Datové struktury. alg12 1

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

9. Polymorfismus a rozhraní

7.3 Diagramy tříd - základy

PB161 Programování v jazyce C++ Přednáška 9

RMI Remote Method Invocation

SW_12. Vzor Příkaz - Command Vzor Návštěvník - Visitor

Dědičnost (inheritance)

boolean hasnext() Object next() void remove() Kolekce

7.3 Diagramy tříd - základy

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

Tvorba informačních systémů

Objektově orientované programování

ČÁST 1. Zahřívací kolo. Co je a k čemu je návrhový vzor 33

Programování v C++ 3, 3. cvičení

Objekty v PHP 5.x. This is an object-oriented system. If we change anything, the users object.

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

Diagramy tříd - základy

7.5 Diagram tříd pokročilé techniky

PB161 Programování v jazyce C++ Přednáška 7

Java Enum Java, zimní semestr ,2017 1

Transkript:

Seminář Java X Radek Kočí Fakulta informačních technologií VUT Duben 2011 Radek Kočí Seminář Java Návrhové vzory, Zásady... 1/ 37

Obsah Znovupoužitelnost Návrhové vzory Zásady programování Radek Kočí Seminář Java Návrhové vzory, Zásady... 2/ 37

Návrhové vzory (design patterns) Návrhové vzory základní sada řešení důležitých a stále se opakujících návrhů (výsledky skutečného používání) usnadňují znovupoužitelnost umožňují efektivní návrh (výběr vhodných alternativ, dokumentace,... ) Radek Kočí Seminář Java Návrhové vzory, Zásady... 3/ 37

Návrhový vzor Návrhový vzor nazývá, zabstraktňuje a identifikuje klíčové aspekty běžné návrhové struktury popisuje komunikující objekty a třídy upravené k řešení obecného návrhového problému vzor je šablona pro řešení, nikoli implemeptace problému! Každý vzor popisuje problém, který se neustále vyskytuje, a jádro řešení daného problému. Umožňuje toto řešení používat mnohokrát, aniž bychom to dělali dvakrát úplně stejným způsobem. Některé vzory si konkurují, některé vzory mohou používat pro svou implementaci jiné vzory Radek Kočí Seminář Java Návrhové vzory, Zásady... 4/ 37

Návrhový vzor Prvky návrhového vzoru název krátký popis (identifikace) návrhového problému problém popis, kdy se má vzor používat (vysvětlení problému, podmínky pro smysluplé použití vzoru,... ) řešení popis prvků návrhu, vztahů, povinností a spolupráce nepopisuje konkrétní návrh, obsahuje abstraktní popis problému a obecné uspořádání prvků pro jeho řešení důsledky výsledky a kompromisy (vliv na rozšiřitelnost, přenositelnost,... ) důležité pro hodnocení návrhových alternativ náklady a výhody použití vzoru Radek Kočí Seminář Java Návrhové vzory, Zásady... 5/ 37

Typy vzorů Vzory se mohou týkat tříd zabývají se vztahy mezi třídami a podtřídami (vztah je fixován) objektů zabývaní se vztahy mezi objekty, jsou dynamičtější Základní rozdělení vzorů tvořivý zabývá se procesem tvorby objektů strukturální zabývá se skladbou tříd či objektů chování zabývá se způsoby vzájemné interakce mezi objekty či třídy zabývá se způsoby rozdělení povinností mezi objekty či třídy Radek Kočí Seminář Java Návrhové vzory, Zásady... 6/ 37

Jedináček (Singleton) Účel třída může mít pouze jednu instanci tvořivý vzor objekty Pzn.: možné řešení statické metody nevýhody Motivace nutnost mít pouze jednu instanci (např. tiskové fronty) při pokusu o vytvoření nové instance se vrátí již existující Důsledky řízený přístup k jediné instanci zdokonalování operací (dědičnost) usnadňuje změnu v návrhu (variabilní počet instancí)... Radek Kočí Seminář Java Návrhové vzory, Zásady... 7/ 37

Jedináček (Singleton) Singleton - uniqueinstance : Singleton + instance() : Singleton public class Singleton { protected Singleton inst; private Singleton() {} } // Tovarni metoda (Factory method) public static Singleton instance() { if (inst == null) inst = new Singleton(); return inst; } Radek Kočí Seminář Java Návrhové vzory, Zásady... 8/ 37

Abstraktní továrna (Abstract Factory) Účel vytváření příbuzných nebo závislých objektů bez specifikace konkrétní třídy Motivace tvořivý vzor objekty např. změna vzhledu sady grafických nástrojů Důsledky izoluje konkrétní třídy klient pracuje pouze s rozhraním usnadňuje výměnu produktových řad (např. změna vzhledu,... ) podpora zcela nových produktových řad je obtížnější... Radek Kočí Seminář Java Návrhové vzory, Zásady... 9/ 37

Abstraktní továrna (Abstract Factory) Struktura AbstractFactory + createproducta() : AbstractProductA + createproductb() : AbstractProductB AbstractProductA Client ProductA2 ProductA1 Factory1 + createproducta() + createproductb() Factory2 + createproducta() + createproductb() AbstractProductB ProductB2 ProductB1 Radek Kočí Seminář Java Návrhové vzory, Zásady... 10/ 37

Abstraktní továrna (Abstract Factory) // abstract product public interface Wall {... } // abstract factory public abstract class MazeFactory { public abstract Wall makewall(); } public class MazeGame { public Maze createmaze(mazefactory factory) { Wall wall = factory.makewall();... } } Radek Kočí Seminář Java Návrhové vzory, Zásady... 11/ 37

Abstraktní továrna (Abstract Factory) // product public class StdWall implements Wall {... } // factory public class StdMazeFactory extends MazeFactory { public Wall makewall() { return new StdWall(); } } MazeGame game = new MazeGame(); MazeFactory factory = new StdMazeFactory(); game.createmaze(factory); Radek Kočí Seminář Java Návrhové vzory, Zásady... 12/ 37

Abstraktní továrna (Abstract Factory) // product public class SpecialWall implements Wall {... } // factory public class SpecMazeFactory extends MazeFactory { public Wall makewall() { return new SpecialWall(); } } MazeFactory specfactory = new SpecMazeFactory(); game.createmaze(specfactory); Radek Kočí Seminář Java Návrhové vzory, Zásady... 13/ 37

Command Účel Motivace zapouzdření požadavků nebo operací vzor chování zaslání požadavku na obecné úrovni, aniž známe konkrétní protokol podpora undo operací Důsledky reprezentuje jeden provedený příkaz umožňuje uchovávat předchozí stav klienta... Radek Kočí Seminář Java Návrhové vzory, Zásady... 14/ 37

Command Struktura Command Invoker receiver execute() : void Receiver ConcreteCommandB state execute() : void ConcreteCommandA state execute() : void actiona() : void Client Radek Kočí Seminář Java Návrhové vzory, Zásady... 15/ 37

Command Radek Kočí Seminář Java Návrhové vzory, Zásady... 16/ 37

Návrhové vzory Zdroje Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Návrh programů pomocí vzorů popis 23 základních vzorů http://objekty.vse.cz/objekty/vzory http://en.wikipedia.org Radek Kočí Seminář Java Návrhové vzory, Zásady... 17/ 37

Zásady programování Zásady programování Radek Kočí Seminář Java Návrhové vzory, Zásady... 18/ 37

Co už známe Překrývání metod třídyobject nefinální metody equals, hashcode, tostring vždy když překryjete metoduequals, překryjte i metodu hashcode vždy překryjte metodutostring Kompozice vs. dědičnost (znovupoužitelnost kódu) Dědičnost (třída je odvozena z jiné třídy) narušuje zapouzdření (závislé na implementačních detailech) Kompozice (objekt je složen z jiných objektů) metody jsou delegovány (nezávislé na implementačních detailech) problém SELF Radek Kočí Seminář Java Návrhové vzory, Zásady... 19/ 37

Duplicitní objekty Duplicitní objekty objekty mající stejný stav většinou neměnné vytváření objektů je zbytečné Opakované použití shodného objektu může být rychlejší (optimální využití paměti) a přehlednější většinou použitelné pro neměnné objekty Radek Kočí Seminář Java Návrhové vzory, Zásady... 20/ 37

Duplicitní objekty String s = new String("retez"); String s = "retez"; Map m = new HashMap(); Set s1 = m.keyset(); Set s2 = m.keyset(); // opakovane vytvareni objektu se stejnym stavem Calendar c = Calendar.getInstance(); c.set(...); Dupl.java Radek Kočí Seminář Java Návrhové vzory, Zásady... 21/ 37

Duplicitní objekty Vytváření malých objektů malá funkcionalita kontruktorů rychlé (moderní implementace JVM) Vytváření nových objektů může zlepšovat jednoduchost nebo sílu programu Kdy lze opakovaně použit objekty objekty jsou neměnné klesá výkon Radek Kočí Seminář Java Návrhové vzory, Zásady... 22/ 37

Defenzivní kopie objektů Defenzivní programování předpoklad, že klienti vaší třídy se pokusí zničit její invarianty neodkrývat interní prvky objektů před uložením provést defenzivní kopii před vrácením provést defenzivní kopii DefCopy.java Radek Kočí Seminář Java Návrhové vzory, Zásady... 23/ 37

Tovární metody místo konstruktorů Získání instance třídy konstruktory statické tovární metody Výhody továrních metod mají názvy nemusí vytvářet nový objekt při volání nemusí vracet instanci pouze volané třídy např. synchronizované kolekce,... Nevýhody těžko odlišitelné od jiných statických metod nutnost dodržování konvencí pojmenování Radek Kočí Seminář Java Návrhové vzory, Zásady... 24/ 37

Tovární metody místo konstruktorů public static final Boolean TRUE = new Boolean(true); public static final Boolean FALSE = new Boolean(false); public static Boolean valueof(boolean b) { return (b? TRUE : FALSE); } public static <T> Set<T> synchronizedset(set<t> s) { return new SynchronizedSet<T>(s); } Radek Kočí Seminář Java Návrhové vzory, Zásady... 25/ 37

Rozhraní a abstraktní třídy Definice typu, který umožňuje více implementací rozhraní abstraktní třída Porovnání třídy lze snadno přizpůsobit tak, aby implementovaly rozhraní rozhraní může definovat smíšený typ nezávislý na dědičnosti tříd rozhraní umožňují flexibilní a (typově) bezpečná vylepšení funkčnosti rozvíjet abstraktní třídu je jednodušší než rozvíjet rozhraní Radek Kočí Seminář Java Návrhové vzory, Zásady... 26/ 37

Rozhraní a abstraktní třídy Doporučení pro definici typů používejte (pokud to jde) vždy rozhraní změna implementace rozhraní pak znamená pouze změnu názvu konstruktoru (nebo tovární metody) bez nutnosti přepisovat další kód Radek Kočí Seminář Java Návrhové vzory, Zásady... 27/ 37

Neveřejné atributy Objekt by měl mít pod kontrolou změnu svých atributů třída by měla jen výjimečně definovat veřejné atributy přístup přes veřejné metody zajistit, aby přímá modifikace atributu nebyla možná public static final Type[] VALUES = {... }; // => prvky pole se mohou měnit! private static final Type[] privatevalues = {... }; public static final List VALUES = Collections. unmodifiablelist(arrays.aslist(privatevalues)); Radek Kočí Seminář Java Návrhové vzory, Zásady... 28/ 37

Kontrola platnosti parametrů vždy kontrolujte platnost parametrů metod podmínky vždy dokumentujte /** * Vraci BigInteger, jehoz hodnota je (this mod m). * @param m modulo, ktere musi byt kladne. * @return this mod m. * @throws ArithmeticException pokud m <= 0. */ public BigInteger mod(biginteger m) { if (m.signum() <= 0) throw new ArithmeticException("m <= 0.");... } Radek Kočí Seminář Java Návrhové vzory, Zásady... 29/ 37

Přetěžování s rozvahou volba překryté metody (dědičnost) závisí na běhovém typu objektu (vybere se vždy ta nejspecifičtější varianta) volba přetížené metody se provádí při kompilaci Radek Kočí Seminář Java Návrhové vzory, Zásady... 30/ 37

Přetěžování s rozvahou public String classify(set s) { return "Mnozina"; } public String classify(list l) { return "Seznam"; } public String classify(collection c) { return "Neznama kolekce"; } Collection[] test = new Collection[] { new HashSet(), new ArrayList(), new HashMap().values() }; for (int i = 0; i < test.length; i++) { System.out.println(classify(test[i])); } Radek Kočí Seminář Java Návrhové vzory, Zásady... 31/ 37

Zastaralé odkazy na objekty Paměťové úniky neúmyslné zachování již nepoužívaných objektů vyšší aktivita GC, vyšší spotřeba paměti nejsou zřejmé (špatně se odhalují) Zdroj správa vlastní paměti cache Stack.java Radek Kočí Seminář Java Návrhové vzory, Zásady... 32/ 37

Zastaralé odkazy na objekty Řešení nastavitnull opakované použití proměnné definovat proměnnou v nejmenším možném oboru platnosti Radek Kočí Seminář Java Návrhové vzory, Zásady... 33/ 37

Zvýšení výkonu (správa paměti) Eliminace správy paměti zmenšit počet dočasných proměnných (v cyklech apod.) používat metody, které nevytvářejí dočasné objekty nebo nevracejí kopii objektu String s = "55"; int i = new Integer(s).intValue(); int i = Integer.parseInt(s); místo řetězení + používat StringBuffer Str.java Radek Kočí Seminář Java Návrhové vzory, Zásady... 34/ 37

Optimalizace Optimalizace se řídí dvěma zásadami: 1. Nedělejte ji. 2. Zatím ji nedělejte(pro experty); dokud nemáte dokonale jasné řešení. M. A. Jackson Pár poznámek k optimalizaci snažte se psát dobré, nikoliv rychlé programy dobré programy lze dobře optimalizovat, chyby ve špatně napsaných optimalizovaných programech se hledají těžko měřte výkonnost před a po optimalizaci! mnohdy má optimalizace velmi malý nebo i negativní dopad na výkonnost identifikace problémového místa nespoléhat se na intuitivní pohled (tady musí být problém) profilovací nástroje Radek Kočí Seminář Java Návrhové vzory, Zásady... 35/ 37

Dokumentační komentáře Radek Kočí Seminář Java Návrhové vzory, Zásady... 36/ 37

Zásady programování Zdroje Joshua Bloch: Effective Java (2nd Edition) Martin Fowler: Refactoring: Improving the Design of Existing Code Radek Kočí Seminář Java Návrhové vzory, Zásady... 37/ 37