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

Podobné dokumenty
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...

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í.

Návrhové vzory OMO, LS 2014/2015

typová konverze typová inference

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

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

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

Vývoj informačních systémů. Architektura, návrh Vzory: Doménová logika

Základy objektové orientace I. Únor 2010

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

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

Literatura. E. Gamma, R. Helm, R. Johnson, J. Vlissides The Gang of Four (GoF) Design Patterns Elements of Reusable Object-Oriented Software 1995

Generické programování

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

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

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

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

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

Seminář Java IV p.1/38

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

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

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

Výčtový typ strana 67

20. Projekt Domácí mediotéka

Iterator & for cyklus

Úvod do programovacích jazyků (Java)

UJO Framework. revoluční architektura beans. verze

Návrhové vzory Design Patterns

Abstraktní datové typy: zásobník

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.

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

Typický prvek kolekce pro české řazení

PŘÍRODOVĚDECKÁ FAKULTA UNIVERZITY PALACKÉHO KATEDRA INFORMATIKY BAKALÁŘSKÁ PRÁCE. Návrhové vzory Dan Doležel

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

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

Design Patterns. Tomáš Herceg Microsoft MVP (ASP.NET)

Dědění, polymorfismus

KTE / ZPE Informační technologie

Teoretické minimum z PJV

Vzor Továrna - Factory

Abstract Factory úvod

Ú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:

Jazyk C# (seminář 6)

Principy objektově orientovaného programování

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

Algoritmizace a programování

Parametrizované třídy Generics generické třídy. JDK zavádí mimo jiné tzv. parametrizované třídy - generics

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

Zpracoval:

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

Programování v Javě I. Leden 2008

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

1. Programování proti rozhraní

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

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

Abstraktní třída a rozhraní

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

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

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

1. Dědičnost a polymorfismus

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

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

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/

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

Seminář Java II p.1/43

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

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

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

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

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

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

Generické typy. Podrobněji: The Java Language Specification ( Third Edition ) , 18

Jazyk C# (seminář 3)

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

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

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

Java Enum Java, zimní semestr ,2017 1

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

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

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

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

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

RMI Remote Method Invocation

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

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

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

návrhový vzor Singleton.

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

Datové struktury. alg12 1

9. Polymorfismus a rozhraní

Vazba (volná, těsná) - míra znalosti jedné třídy*komponenty o druhé.

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

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

PB161 Základy OOP. Tomáš Brukner

7.5 Diagram tříd pokročilé techniky

Reflexe. Aplikační programování v Javě (BI-APJ) - 8 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

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

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

Transkript:

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

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

Znovupoužitelnost Dědičnost implementace třídy pomocí jiné (již existující) znovupoužitelnost bílé skříňky výhody a nevýhody přímočaré použití, jednodušší úprava metod statické těsná vazba s nadřazenou třídou (problémy s modifikací) Radek Kočí Seminář Java Návrhové vzory, Zásady... 3/ 46

Znovupoužitelnost Skládání nová funkce = poskládání již existujících objektů znovupoužitelnost černé skříňky výhody a nevýhody dynamické objekty se používají přes rozhraní objekty lze za běhu zaměňovat (stejné typy) menší, jednodušší a přehlednější návrh Radek Kočí Seminář Java Návrhové vzory, Zásady... 4/ 46

Znovupoužitelnost Skládání problém SELF class A { foo() { self.m(); } m() { print("object A doing the job"); } } class B { A a; foo() { a.foo(); } m() { print("object B doing the job"); } } B b; b.foo() => Object A doing the job. Radek Kočí Seminář Java Návrhové vzory, Zásady... 5/ 46

Znovupoužitelnost Skládání problém SELF class A { foo() { self.m(); } m() { print("object A doing the job"); } } class B { A a; foo() { a.foo(); } m() { print("object B doing the job"); } } B b; b.foo() => Object B doing the job. Radek Kočí Seminář Java Návrhové vzory, Zásady... 6/ 46

Znovupoužitelnost Parametrizované typy (generické programování) templates v C++ (viz Standard Template Library STL) generics v Java 5 definují parametrizované typy má význam u staticky typovaných jazyků Radek Kočí Seminář Java Návrhové vzory, Zásady... 7/ 46

Znovupoužitelnost interface Sink<T> { flush(t t); } <T> T writeall(collection<t> coll, Sink<? super T> s { T last; for(t t : coll) { last = t; snk.flush(last); } return last; } Sink<Object> s; Collection<String> cs; String str = writeall(cs, s); // T je String Radek Kočí Seminář Java Návrhové vzory, Zásady... 8/ 46

Návrhové vzory (design patterns) Objektově orientovaný návrh a programování znovupoužitelnost? zajištění znovupoužitelnosti obecný návrh zajištění aplikovatelnosti na řešený problém specifický návrh spor... přesto proč nevyužít řešení, které již fungovalo taková řešení jsou výsledkem mnoha pokusů a používání vzory pro řešení stejných typů problémů Radek Kočí Seminář Java Návrhové vzory, Zásady... 9/ 46

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ů 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... 10/ 46

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... 11/ 46

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... 12/ 46

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... 13/ 46

Základní návrhové vzory Tvořivý Factory method Abstract Factory Singleton Prototype Builder Strukturální Adapter (třída) Adapter (objekt) Decorator Facade Bridge Flyweight Composite Proxy Radek Kočí Seminář Java Návrhové vzory, Zásady... 14/ 46

Základní návrhové vzory Chování Interpreter Iterator Visitor Memento Observer Mediator Command Chain of Responsibility State Strategy Radek Kočí Seminář Java Návrhové vzory, Zásady... 15/ 46

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... 16/ 46

Jedináček (Singleton) Singleton 3 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... 17/ 46

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... 18/ 46

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... 19/ 46

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... 20/ 46

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... 21/ 46

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... 22/ 46

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... 23/ 46

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... 24/ 46

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

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... 26/ 46

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

Co už známe Překrývání metod třídy Object nefinální metody equals, hashcode, tostring vždy když překryjete metodu equals, překryjte i metodu hashcode vždy překryjte metodu tostring Kompozice a dědičnost (znovupoužitelnost kódu) Dědičnost 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... 28/ 46

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... 29/ 46

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... 30/ 46

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... 31/ 46

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... 32/ 46

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... 33/ 46

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... 34/ 46

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... 35/ 46

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... 36/ 46

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... 37/ 46

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... 38/ 46

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... 39/ 46

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... 40/ 46

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... 41/ 46

Zastaralé odkazy na objekty Řešení nastavit null 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... 42/ 46

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... 43/ 46

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... 44/ 46

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

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... 46/ 46