´ r Java Seminaˇ X Radek Koˇc´ı Fakulta informaˇcn´ıch technologi´ı VUT
Duben 2011
Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
1/ 37
Obsah
Znovupouˇzitelnost ´ Navrhov e´ vzory ´ ´ ı Zasady programovan´
Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
2/ 37
´ Navrhov e´ vzory (design patterns)
´ Navrhov e´ vzory ´ ´ se opakuj´ıc´ıch zakladn´ ı sada ˇreˇsen´ı duleˇ ˚ zit´ych a stale ´ ´ ´ ı) navrh u˚ (v´ysledky skuteˇcneho pouˇz´ıvan´ ˇ ı znovupouˇzitelnost usnadnuj´ ˇ ı efektivn´ı navrh ´ ˇ vhodn´ych alternativ, umoˇznuj´ (v´yber dokumentace, . . . )
Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
3/ 37
´ Navrhov´ y vzor ´ Navrhov´ y vzor ´ zabstraktnuje ˇ ˇ zne´ naz´yva, a identifikuje kl´ıcˇ ove´ aspekty beˇ ´ navrhov e´ struktury popisuje komunikuj´ıc´ı objekty a tˇr´ıdy upravene´ k rˇeˇsen´ı ´ navrhov ´ ´ problemu ´ obecneho eho ´ vzor je sˇ ablona pro ˇreˇsen´ı, nikoli implemeptace problemu! ´ ´ vyskytuje, a ”Kaˇzd´y vzor popisuje problem, kter´y se neustale ´ ˇreˇsen´ı daneho ´ ´ ˇ jadro problemu. Umoˇznuje toto ˇreˇsen´ı pouˇz´ıvat ´ aniˇz bychom to delali ˇ ´ upln mnohokrat, dvakrat ´ eˇ stejn´ym zpusobem.” ˚
ˇ ˇ Nekter e´ vzory si konkuruj´ı, nekter e´ vzory mohou pouˇz´ıvat pro svou implementaci jine´ vzory Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
4/ 37
´ Navrhov´ y vzor ´ ´ vzoru Prvky navrhov eho ´ nazev ´ y popis (identifikace) navrhov ´ ´ problemu ´ kratk´ eho
´ problem ˇ ´ popis, kdy se ma´ vzor pouˇz´ıvat (vysvetlen´ ı problemu, podm´ınky pro smysluple´ pouˇzit´ı vzoru, . . . )
ˇreˇsen´ı ´ ´ popis prvku˚ navrhu, vztahu, ˚ povinnost´ı a spoluprace ´ ı navrh, ´ nepopisuje konkretn´ obsahuje abstraktn´ı popis ´ ´ an´ ´ ı prvku˚ pro jeho ˇreˇsen´ı problemu a obecne´ uspoˇrad
dusledky ˚ v´ysledky a kompromisy (vliv na rozˇsiˇritelnost, pˇrenositelnost, . . . ) ´ ´ duleˇ ˚ zite´ pro hodnocen´ı navrhov´ ych alternativ – naklady a v´yhody pouˇzit´ı vzoru
Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
5/ 37
Typy vzoru˚ Vzory se mohou t´ykat tˇr´ıd zab´yvaj´ı se vztahy mezi tˇr´ıdami a podtˇr´ıdami (vztah je ´ fixovan)
objektu˚ ˇ s´ı zab´yvan´ı se vztahy mezi objekty, jsou dynamiˇctejˇ
´ ˇ ı vzoru˚ Zakladn´ ı rozdelen´ tvoˇriv´y zab´yva´ se procesem tvorby objektu˚
´ ı strukturaln´ zab´yva´ se skladbou tˇr´ıd cˇ i objektu˚
´ ı chovan´ ´ zab´yva´ se zpusoby ˚ vzajemn e´ interakce mezi objekty cˇ i tˇr´ıdy ˇ ı povinnost´ı mezi objekty cˇ i zab´yva´ se zpusoby ˚ rozdelen´ tˇr´ıdy Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
6/ 37
´ cek (Singleton) Jedinaˇ ´ cel Uˇ tˇr´ıda muˇ ˚ ze m´ıt pouze jednu instanci tvoˇriv´y vzor – objekty Pzn.: moˇzne´ rˇeˇsen´ı – staticke´ metody ⇒ nev´yhody Motivace nutnost m´ıt pouze jednu instanci (napˇr. tiskove´ fronty) ´ ı jiˇz existuj´ıc´ı pˇri pokusu o vytvoˇren´ı nove´ instance se vrat´ Dusledky ˚ ˇr´ızen´y pˇr´ıstup k jedine´ instanci ´ ı operac´ı (dediˇ ˇ cnost) zdokonalovan´ ˇ ˇ v navrhu ´ usnadnuje zmenu (variabiln´ı poˇcet instanc´ı) ... Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
7/ 37
´ cek (Singleton) Jedinaˇ 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ˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
8/ 37
´ Abstraktn´ı tovarna (Abstract Factory) ´ cel Uˇ ´ ren´ı pˇr´ıbuzn´ych nebo zavisl´ ´ vytvaˇ ych objekt˚u bez ´ ı tˇr´ıdy specifikace konkretn´ tvoˇriv´y vzor – objekty Motivace ˇ ´ napˇr. zmena vzhledu sady grafick´ych nastroj u˚ Dusledky ˚ ´ ı tˇr´ıdy – klient pracuje pouze s rozhran´ım izoluje konkretn´ ˇ ˇ produktov´ych rˇad (napˇr. zmena ˇ usnadnuje v´ymenu vzhledu, . . . ) ˇ s´ı podpora zcela nov´ych produktov´ych rˇad je obt´ızˇ nejˇ ... Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
9/ 37
´ Abstraktn´ı tovarna (Abstract Factory) Struktura
AbstractFactory
Client
+ createProductA() : AbstractProductA + createProductB() : AbstractProductB
AbstractProductA
Factory1
Factory2
+ createProductA() + createProductB()
+ createProductA() + createProductB()
ProductA2
ProductA1
AbstractProductB
ProductB2
Radek Koˇc´ı
ProductB1
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
10/ 37
´ Abstraktn´ı tovarna (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ˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
11/ 37
´ Abstraktn´ı tovarna (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ˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
12/ 37
´ Abstraktn´ı tovarna (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ˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
13/ 37
Command ´ cel Uˇ zapouzdˇren´ı poˇzadavk˚u nebo operac´ı ´ ı vzor chovan´ Motivace ´ ı poˇzadavku na obecne´ urovni, ´ zaslan´ ´ aniˇz zname ´ ı protokol konkretn´ podpora undo operac´ı Dusledky ˚ reprezentuje jeden proveden´y pˇr´ıkaz ˇ ´ umoˇznuje uchovavat pˇredchoz´ı stav klienta ... Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
14/ 37
Command Struktura Command
Invoker
receiver execute() : void
Receiver
actionA() : void ConcreteCommandB
ConcreteCommandA
state
state
execute() : void
execute() : void
Radek Koˇc´ı
Client
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
15/ 37
Command
Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
16/ 37
´ Navrhov e´ vzory
Zdroje Erich Gamma, Richard Helm, Ralph Johnson, John ´ Vlissides: Navrh programu˚ pomoc´ı vzoru˚ ´ popis 23 zakladn´ ıch vzoru˚
http://objekty.vse.cz/Objekty/Vzory http://en.wikipedia.org
Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
17/ 37
´ ´ ı Zasady programovan´
´ ´ ı Zasady programovan´
Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
18/ 37
´ Co uˇz zname ´ ı metod tˇr´ıdy Object Pˇrekr´yvan´ ´ ı metody equals, hashCode, toString nefinaln´ vˇzdy kdyˇz pˇrekryjete metodu equals, pˇrekryjte i metodu hashCode vˇzdy pˇrekryjte metodu toString ˇ cnost (znovupouˇzitelnost kodu) ´ Kompozice vs. dediˇ ˇ cnost (tˇr´ıda je odvozena z jine´ tˇr´ıdy) Dediˇ ´ naruˇsuje zapouzdˇren´ı (zavisl e´ na implementaˇcn´ıch detailech)
Kompozice (objekt je sloˇzen z jin´ych objekt˚u) ´ (nezavisl ´ metody jsou delegovany e´ na implementaˇcn´ıch detailech) ´ SELF problem
Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
19/ 37
Duplicitn´ı objekty
Duplicitn´ı objekty objekty maj´ıc´ı stejn´y stav ˇ sinou nemenn ˇ e´ vetˇ ´ ren´ı objektu˚ je zbyteˇcne´ vytvaˇ ´ objektu Opakovane´ pouˇzit´ı shodneho ´ ı vyuˇzit´ı pameti) ˇ a pˇrehlednejˇ ˇ s´ı muˇ ˚ ze b´yt rychlejˇs´ı (optimaln´ ˇ sinou pouˇzitelne´ pro nemenn ˇ e´ objekty vetˇ
Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
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ˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
21/ 37
Duplicitn´ı objekty
´ ren´ı mal´ych objekt˚u Vytvaˇ mala´ funkcionalita kontruktoru˚ rychle´ (modern´ı implementace JVM) ´ ren´ı nov´ych objektu˚ Vytvaˇ muˇ ˚ ze zlepˇsovat jednoduchost nebo s´ılu programu Kdy lze opakovaneˇ pouˇzit objekty ˇ e´ objekty jsou nemenn klesa´ v´ykon
Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
22/ 37
Defenzivn´ı kopie objektu˚
´ ı Defenzivn´ı programovan´ pˇredpoklad, zˇ e klienti vaˇs´ı tˇr´ıdy se pokus´ı zniˇcit jej´ı invarianty neodkr´yvat intern´ı prvky objektu˚ ´ defenzivn´ı kopii pˇred uloˇzen´ım provest ´ ´ defenzivn´ı kopii pˇred vracen´ ım provest DefCopy.java
Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
23/ 37
´ ı metody m´ısto konstruktoru˚ Tovarn´ ´ ı instance tˇr´ıdy Z´ıskan´ konstruktory ´ ı metody staticke´ tovarn´ ´ ıch metod V´yhody tovarn´ ´ maj´ı nazvy ´ ret nov´y objekt pˇri volan´ ´ ı nemus´ı vytvaˇ nemus´ı vracet instanci pouze volane´ tˇr´ıdy napˇr. synchronizovane´ kolekce, . . . Nev´yhody ˇ zko odliˇsitelne´ od jin´ych statick´ych metod teˇ ´ ı konvenc´ı pojmenovan´ ´ ı nutnost dodrˇzovan´
Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
24/ 37
´ ı metody m´ısto konstruktoru˚ Tovarn´ 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
Set synchronizedSet(Set s) { return new SynchronizedSet(s); } Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
25/ 37
Rozhran´ı a abstraktn´ı tˇr´ıdy ˇ Definice typu, kter´y umoˇznuje v´ıce implementac´ı rozhran´ı abstraktn´ı tˇr´ıda ´ ı Porovnan´ tˇr´ıdy lze snadno pˇrizpusobit ˚ tak, aby implementovaly rozhran´ı ´ rozhran´ı muˇ ˚ ze definovat sm´ısˇ en´y typ nezavisl´ y na ˇ cnosti tˇr´ıd dediˇ ˇ ı flexibiln´ı a (typove) ˇ bezpeˇcna´ vylepˇsen´ı rozhran´ı umoˇznuj´ funkˇcnosti rozv´ıjet abstraktn´ı tˇr´ıdu je jednoduˇssˇ ´ı neˇz rozv´ıjet rozhran´ı
Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
26/ 37
Rozhran´ı a abstraktn´ı tˇr´ıdy
Doporuˇcen´ı pro definici typu˚ pouˇz´ıvejte (pokud to jde) vˇzdy rozhran´ı ˇ ˇ zmena implementace rozhran´ı pak znamena´ pouze zmenu ´ ´ ı metody) bez nutnosti nazvu konstruktoru (nebo tovarn´ ´ pˇrepisovat dalˇs´ı kod
Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
27/ 37
Neveˇrejne´ atributy ˇ m´ıt pod kontrolou zmenu ˇ sv´ych atributu˚ Objekt by mel ˇ jen v´yjimeˇcneˇ definovat veˇrejne´ atributy tˇr´ıda by mela pˇr´ıstup pˇres veˇrejne´ metody zajistit, aby pˇr´ıma´ modifikace atributu nebyla moˇzna´
public static final Type[] VALUES = { ... }; // => prvky pole se mohou mˇ enit!
private static final Type[] privateVALUES = { ... }; public static final List VALUES = Collections. unmodifiableList(Arrays.asList(privateVALUES));
Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
28/ 37
Kontrola platnosti parametru˚ vˇzdy kontrolujte platnost parametr˚u metod podm´ınky vˇzdy 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ˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
29/ 37
ˇ zovan´ ´ ı s rozvahou Pˇreteˇ
ˇ cnost) zavis´ ´ ı na behov ˇ ´ typu volba pˇrekryte´ metody (dediˇ em ˇ s´ı varianta) objektu (vybere se vˇzdy ta nejspecifiˇctejˇ ´ ı pˇri kompilaci volba pˇret´ızˇ ene´ metody se provad´
Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
30/ 37
ˇ zovan´ ´ ı s rozvahou Pˇreteˇ 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ˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
31/ 37
Zastarale´ odkazy na objekty
Pameˇ ˇtove´ uniky ´ ´ ı jiˇz nepouˇz´ıvan´ych objektu˚ neumysln ´ e´ zachovan´ ˇ vyˇssˇ ´ı aktivita GC, vyˇssˇ ´ı spotˇreba pameti nejsou zˇrejme´ (ˇspatneˇ se odhaluj´ı) Zdroj ´ vlastn´ı pameti ˇ sprava cache Stack.java
Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
32/ 37
Zastarale´ odkazy na objekty
ˇ sen´ı Reˇ nastavit null ˇ e´ opakovane´ pouˇzit´ı promenn ˇ ´ oboru definovat promennou v nejmenˇs´ım moˇznem platnosti
Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
33/ 37
´ pameti) ˇ Zv´ysˇ en´ı v´ykonu (sprava
´ pameti ˇ Eliminace spravy ˇ ych (v cyklech apod.) zmenˇsit poˇcet doˇcasn´ych promenn´ ´ rej´ı doˇcasne´ objekty nebo pouˇz´ıvat metody, ktere´ nevytvaˇ nevracej´ı kopii objektu String s = "55"; int i = new Integer(s).intValue(); int i = Integer.parseInt(s); ˇ m´ısto rˇetezen´ ı + pouˇz´ıvat StringBuffer Str.java
Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
34/ 37
Optimalizace ˇ ´ Optimalizace se rˇ´ıd´ı dvema zasadami: ˇ 1. Nedelejte ji. ˇ ´ dokonale jasne´ ˇreˇsen´ı. 2. Zat´ım ji nedelejte (pro experty); dokud nemate – M. A. Jackson
´ poznamek ´ Par k optimalizaci ´ dobre, ´ nikoliv rychle´ programy snaˇzte se psat dobre´ programy lze dobˇre optimalizovat, chyby ve sˇ patneˇ ˇ zko napsan´ych optimalizovan´ych programech se hledaj´ı teˇ ˇ rte v´ykonnost pˇred a po optimalizaci! meˇ mnohdy ma´ ”optimalizace” velmi mal´y nebo i negativn´ı dopad na v´ykonnost
´ ´ m´ısta identifikace problemov eho ´ ´ nespolehat se na intuitivn´ı pohled (tady mus´ı b´yt problem) ´ profilovac´ı nastroje
Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
35/ 37
´ re Dokumentaˇcn´ı komentaˇ
Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
36/ 37
´ ´ ı Zasady programovan´
Zdroje Joshua Bloch: Effective Java (2nd Edition) Martin Fowler: Refactoring: Improving the Design of Existing Code
Radek Koˇc´ı
´ ´ ´ r Java – Navrhov e´ vzory, Zasady ... Seminaˇ
37/ 37