Programovanie základného kurzu v jazyku Java - PDF na stiahnutie zadarmo

Prírastky v knihe Dietmar Ratz, Jens Scheffler, Detlef Seese, Jan Wiesenberger Základné programovanie kurzu v Jave

kurzu

Obsah I Teória. 11 1 Struny pre pokročilých používateľov. 13 1.1 Regulárne výrazy. 13 1.2 Konkrétny príklad. 14 1.3 Výmena textu. 16 1.4 Zhrnutie. 17 2 Anotácie v prostredí Java. 19 2.1 Štandardné poznámky v súprave Java SDK. 19 2.1.1 Anotácia DieS @ Override. 21 2.1.2 DieS @ Zastaraná anotácia. 22 2.1.3 Anotácia DieS @ SuppressWarnings. 24 2.2 Poznámky pre domácich majstrov. 28 2.2.1 CoDo: Dokumentácia kódu pomocou anotácií. 28 2.2.2 Píšeme nové anotácie. 29 2.2.3 Vyhodnotenie anotácií. 32 2.3 Zhrnutie. 36 3 JUnit alebo umenie písania bezchybného kódu. 37 3.1 Tvrdenia pre pokročilých používateľov. 38 3.2 Skúšky jednotky. 40 3.3 Poznámky a JUnit. 45 3.4 Osvedčené postupy. 46 3.5 Zhrnutie. 48 4 návrhových vzoriek. 49 4.1 Čo sú návrhové vzory. 49 4.2 Vzor pozorovateľa. 51 4.2.1 Základná myšlienka. 51 4.2.2 Objektový model. 51 4.2.3 Príklad implementácie. 52 4.2.3.1 Práca iba s jedným pozorovateľom. 52 4.2.3.2 Práca s niekoľkými pozorovateľmi. 55

4 Obsah 4.2.4 Variácie vzoru. 60 4.2.5 Zhrnutie. 61 4.2.6 Cvičenia. 61 4.3 Zložený vzor. 62 4.3.1 Základná myšlienka. 62 4.3.2 Objektový model. 65 4.3.3 Príklad implementácie. 66 4.3.3.1 Súčet dvoch funkcií. 66 4.3.3.2 Produkt dvoch funkcií. 67 4.3.4 Variácie vzoru. 69 4.3.5 Zhrnutie. 71 4.3.6 Cvičenia. 72 II Prax. 73 5 Praktické príklady: Jednotlivé etudy. 75 5.1 Deliteľnosť na prvú. 75 5.1.1 Predchádzajúce poznatky z knihy. 75 5.1.2 Úloha. 75 5.1.3 Analýza problému. 75 5.1.4 Algoritmický popis. 76 5.1.5 Programovanie v prostredí Java. 77 5.1.6 Pozor, pasca. 78 5.1.7 Cvičenie. 79 5.2 Deliteľnosť na druhú. 79 5.2.1 Predchádzajúce poznatky z knihy. 79 5.2.2 Úloha. 79 5.2.3 Analýza problému. 79 5.2.4 Algoritmický popis. 80 5.2.5 Programovanie v prostredí Java. 80 5.2.6 Pozor, pasca. 81 5.2.7 Cvičenia. 82 5.3 Tri veci. 82 5.3.1 Predchádzajúce poznatky z knihy. 82 5.3.2 Úloha. 82 5.3.3 Analýza problému. 83 5.3.4 Algoritmický popis. 83 5.3.5 Programovanie v prostredí Java. 84 5.3.6 Pozor, pasca. 87 5.3.7 Cvičenia. 87 5.4 Problém všímavosti. 87 5.4.1 Predchádzajúce poznatky z knihy. 87 5.4.2 Úloha. 87

Obsah 7 6.9 Iterácia 9: Keď je s najlepšie. 210 6.9.1 Niektoré prípravky. 210 6.9.2 Porovnanie hodín. 212 6.9.3 Dialógové okno Nastavenia. 214 6.9.4 Zhrnutie. 217 Bibliografia. 219

Vitajte Vitajte v dodatku k „Programovaniu základného kurzu v jazyku Java“. Predpokladáme, že ste sa k tomuto dokumentu dostali prostredníctvom našej knihy. Ak je to tak, môžeme vám iba pogratulovať k vašej túžbe po ďalších informáciách. Dúfame, že webové rozšírenia vám pomôžu prehĺbiť a uplatniť vedomosti, ktoré ste získali. Tento dokument je rozdelený do dvoch častí: teória a prax. V teoretickej časti sa budeme zaoberať aspektmi programovania v jazyku Java, ktoré v knihe bohužiaľ nemajú miesto. Patria sem anotácie Java, jednotkové testy a vzory návrhu. V praktickej časti sa naučíme aplikovať svoje knižné vedomosti pomocou praktických programovacích úloh. Naučili sme sa toho veľa o Jave a teraz sme teoreticky schopní napísať prvé zložitejšie programy. Naučiť sa jazyk z teórie je, bohužiaľ, rovnako nemožné ako riadiť auto - potrebujeme cvik. Za týmto účelom sa pokúsime vyriešiť rôzne úlohy a predovšetkým sa vysporiadať s tým, ako k problému pristupovať systematicky, hľadať riešenie a programovať ho v Jave.

14 1 Struny pre pokročilých Majer. Ak sa na to pozriete správne, poznáme skutočne iba prvé a posledné dve písmená. Prvé meno začína na H, ale nevieme si spomenúť. nevieme, či má dotyčná osoba stále druhé meno, ktoré je v telefónnom zozname. Našťastie má náš telefónny zoznam disk CD-ROM, na ktorom môžeme vyhľadávať určité kritériá vyhľadávania. Kritériá vyhľadávania sú komunikované s počítačom v určitom formáte - regulárny výraz. Všetko je teda jasné, je to iba ďalší počítačový jazyk (napríklad Java), ktorý sa musíme naučiť. 1.2 Konkrétny príklad Táto časť nemá byť úplným úvodom do sveta regulárnych výrazov. Podrobnejšie odporúčame pozrieť sa do dokumentácie triedy java.util.regex.pattern. Ako uvidíme z nasledujúceho príkladu, základy nie sú nijako zvlášť náročné. Nasledujúci program je zjednodušenou verziou nášho elektronického telefónneho zoznamu: 1 verejné triedne textové vyhľadávanie < 2 3 public static void main(string[] args) < 4 String[] namensliste = < 5 "Fritz Maier", 6 "Karl Hansen", 7 "Fred Mustermann", 8 "Horst Metzger", 9 "Hermann Meyer", 10 "Fritz H. Maurer", 11 "Hoerbi Maier", 12 "Hans Maler", 13 "Harry Mooshammer", 14 "Hurgan Malinkow" 15; 16 String suchstring = ". "; 17 for(int i = 0; i javac -Xlint SmallDog.java SmallDog.java:3: warning: [deprecation] belle() in Dog has been deprecated public String belle() < ˆ 1 warning Mit dieser einfachen Änderung haben wir es den Benutzern unserer Klasse leicht gemacht, veralteten Code zu erkennen und zu vermeiden. Es sollte an dieser Stelle auch erwähnt werden, dass es guter Stil ist, in der Javadoc Dokumentation zu erklären, wie diese Vermeidung stattfinden kann. Das folgende Programm zeigt die komplette Klasse mit veraltetem Code und inklusive korrekter Dokumentation: 1 public class Dog < 2 3 /** 4 * @deprecated verwende stattdessen

24 2 Annotations in Java 2.1.3 The @SuppressWarnings Annotation V predchádzajúcej časti sa ukázalo, ako by použitie @Deprecated Annotation mohlo poskytnúť kompilátoru Java ďalšie informácie, ktoré v priebehu kompilácie vyústili do varovaní. Varovania sú užitočné, pretože upozorňujú programátora na veci, ktoré by mohli byť problémom. Príliš veľa (a zbytočných) varovaní však predstavuje problém, pretože sú ako šum na telefónnej linke: vyrušujú a odvádzajú pozornosť od skutočne dôležitých vecí, na ktoré si treba dať pozor. Vezmime si napríklad nasledujúcu metódu: public static Map of (K key1, V value1, Object. Morekeyvals) < Map result = new HashMap (); result.put(key1, value1); for (int i = 0; i javac -Xlint SuppressWarningsExample.java SuppressWarningsExample.java:23: warning: [unchecked] unchecked cast found: java.lang.object required: K (K) morekeyvals[i], ˆ SuppressWarningsExample.java:24: warning: [unchecked] unchecked cast found: java.lang.object required: V (V) morekeyvals[i + 1]); ˆ Wo liegt das Problem, und wie lösen wir es? Wie wir in Abschnitt 11.2 des Buches gelernt haben, sind generische Methoden ein wunderbares Mittel, um

32 2 Poznámky v Jave 34 Trieda [] z (); 35 boolean isnullable () predvolené false; 36 37 Je pravda, že písanie nových anotácií je trochu zvláštne (autor musí tiež pri každom písaní novej anotácie vyhľadať presnú syntax). Dobrá správa je, že v praxi trávite oveľa menej času písaním a oveľa viac času používaním hotových anotácií, a to je to, čo chceme robiť. 2.2.3 Hodnotenie anotácií Anotácie sa používajú v dvoch rôznych formách: programátor ich bude chcieť vyhodnotiť za behu programu alebo počas kompilácie programu. Druhá z nich je pomerne zložitá, a preto sa odvolávame na [17]. Na konci tejto kapitoly chceme napísať triedu CodoProxy, ktorá automaticky kontroluje predpoklady na implementáciu rozhrania. V prípade nášho sčítacieho rozhrania by použitie malo vyzerať takto: 1 import codo.codoproxy; 2 3 verejný ukážkový program < 4 5 public static class AddiererImpl implements Addierer < 6 @Override 7 public Integer addvalues(integer v1, Integer v2) < 8 return v1 + v2; 9 10 11 @Override 12 public Integer addtoint(integer v1, Number v2) < 13 return addvalues(v1, v2.intvalue()); 14 15 16 17 public static void main(string[] args) < 18 Addierer proxied = CodoProxy.makeProxy(Addierer.class, 19 new AddiererImpl()); 20 21 // Normalfall 22 System.out.println(proxied.addValues(1, 2)); 23 System.out.println(proxied.addToInt(1, (byte) 2)); 24 25 // Parameter ist null 26 try < 27 System.out.println(proxied.addValues(1, null)); 28 catch (NullPointerException expected) < 29 expected.printstacktrace(); 30

34 2 Anotácie v Jave, ktorými sú zdobené parametre metódy. Návratová hodnota je dvojrozmerné pole. Prvá dimenzia zodpovedá parametrom 8. Takže predpokladajme, že máme metódu ma pole parametrových parametrov, pomocou ktorých sa má volať, a chceme skontrolovať anotáciu NotNull. V prvom kroku sa musíme dostať k zoznamu všetkých anotácií: Annotation [] [] all = m.getparameterannotations (); Teraz prechádzame prvou dimenziou poľa, ktorá zodpovedá parametrom parametrov, a pozrime sa na každú anotáciu definovanú pre príslušný parameter: for (int i = 0; i S makeproxy (53 final class interfaceclass, final T innerobject) < 54 return (T) Proxy.newProxyInstance( 55 innerobject.getclass().getclassloader(), 56 new Class[]

3.1 Tvrdenia pre pokročilých používateľov 39 boli z programu odstránené a nahradené volaním metódy. To má výhody aj nevýhody: Nevýhodou je, že tvrdenia JUnit nemožno jednoducho vypnúť. Vyhlásenia Java je možné vo virtuálnom stroji jednoducho aktivovať alebo deaktivovať 2. To môže spomaliť vykonávanie, najmä v extrémne výpočtovo náročnom kóde. Výhodou je, že tvrdenia JUnit fungujú aj so staršími verziami Java (t. J. Pred verziou 1.3). Tieto sa v projektoch používajú dodnes 3, takže zostávame kompatibilné smerom dole. Samotné tieto argumenty samozrejme neospravedlňujú prechod na triedu Assert. Hlavná výhoda tejto triedy ešte nebola spomenutá: poskytuje ďalšie metódy presadzovania: 1 import junit.framework.assert; 2 3 verejná trieda AssertionTest2 < 4 5 public static void main(string[] args) < 6 Assert.assertNotNull("Parameter-Arrary ist null",args); 7 // assert args!= null: "Parameter-Array ist null" 8 for(int i = 0; i = 0; i--,j--) if (brett[i] == j) return true; 3. Befindet sich in der Diagonale, die schräg nach unten links verläuft, eine Dame? Die Überprüfung dieser Bedingung funktioniert genau wie die andere Diagonalrichtung mit dem Unterschied, dass wir die Variable j nun erhöhen statt erniedrigen müssen: for (int i = spalte-1, j = brett[spalte]+1; i >= 0; i -, j ++) if (doska [i] == j) vráti true;

5.4 Problém ôsmich žien 91 4. Ak tam hľadanie nie je úspešné, vráťte sa na krok 2. Ak je hľadanie úspešné, máme hotovo. Výsledkom je správa o úspechu. 5. Ak sme sa bez úspechu dostali do ôsmeho stĺpca, uviazli sme v slepej uličke. Výsledok zlyhania nahláste späť. Nielenže vidíme, že hľadanie správnej dámy je štruktúrované rovnako pre všetky stĺpce; skôr tiež uznávame, že komunikáciu medzi jednotlivými vyhľadávaniami v stĺpcoch možno vysledovať späť k jednoduchému pravému (= hľadanie bolo úspešné) alebo nepravdivému (= hľadanie nebolo úspešné). Jedna boolovská hodnota môže byť zase veľmi pohodlne vrátená metódou. Našu metódu definujeme predovšetkým tak, akoby sme chceli hľadať riešenie len pre veľmi konkrétny stĺpec. Ako parametre teda potrebujeme číslo stĺpca, do ktorého hľadáme, a poľa, do ktorého by sme mali umiestniť. Návratová hodnota je (ako je požadované vyššie) logická hodnota: verejná statická logická množina (doska int [], stĺpec int) < Wir wollen nun überlegen, wie wir obige fünf Schritte am besten in ein Java- Programm kleiden. Beginne in der ersten Zeile und versuche es eine Zeile tiefer das klingt verdächtig nach einer Schleife! Wir formulieren also einefor- Schleife, die über die einzelnen Zeilennummern läuft: for (int i=0; i = 0; i--,j--) 11 if (brett[i] == j) 12 return true; 13 14 // Teste, ob in der unteren Diagonale eine Dame steht 15 for (int i = spalte-1, j = brett[spalte]+1; i >= 0; i -, j ++)

ƒ dgcmifgjgnlky ZIJJ NGM ENJKG \\ KNL DKK`M cnzl H] K edlznf m ˆr pšswyƒ agek ZGN MŒI F ZNL dcifknm ZNJ dcgnfelnkkj ŒDL H] f klmn Ž uvtuvlwwifv

ƒ agek ZNM I] KDNFFNM [M IFK NGMNJ ENJKG \\ KNM NFZNJ ŒDL H] fk š œ m vq uvžÿov yƒ agek ZNM NK ŒDL H] Y ZNL I] KDNFF IDO ZN \ NDNL DKK`M JKN NM J`FFf œ m vq ŸŠv ŸŠvyƒ agek ZNM I \ NM ZNJ dcgnfnj IFJ dklgmc ŒDL H] fk š œ m vq vwwÿ vwyƒ agek ZNM NK ŒDL H] Y ZNL GM ZNL I`] KDNFFNM DMZN ZGN MŒI F ZNL NGFNM ZNJ dcgnfelnkkj ŒDL H] f? 87g @ A ª87; «B ± ² zz< ur wyƒ agek ZGN MŒI F ZNL NGFNM ZNJ dcgnfelnkkj ŒDL H]f ³GN MŒI F ZILO JGH G\ IDON ZNJ dcgnfnj MGH K \N L _NLµMZNLMf ¹º ±² z z< ˆr pšswyƒ agek ZGN MŒI F ZNL dcifknm ZNJ dcgnfelnkkj ŒDL H]f ³GN MŒI F ZILO JGH G\ IDON ZNJ dcgnfnj MGH K \N L _NLµMZNLMf Abbildung 5.5: Dokumentation der KlasseGameModel (Seite 1)

5.7 Game of Life 119 "¼½¾ À¼ÁÂÃ¼Ä ÅÆÇÈÉÊ ËÌÍÌÎÈÌÏÐÎÑÒÓÉÏÐ OOO ØÙÕÚÛÜÕÝÞß AAAA AEAA CAEA éêëìíîï AA ðîãêåññ Deo AAO ôåêåëõöêãã æ øãåùåæ ø NNU" ¼½û¼üüâ "¼ü ÅÆÇÈÉÊ ËÌÍÌÎÈÌÏÐÎÑÒÓÉÏÐ ÔÕÖýÕþþÛÔÕþÞß AAAA AEAA CAEA éêëìíîï AA AAE AA ðîãêåññåæ ÿêæäå AO åñäåòåæøãåë øãåùåæ ø NNU" ¼½ ¼ ¼ ÅÆÇÈÉÊ ËÌÍÌÎÈÌÏÐÎÑÒÓÉÏÐ OOO Û O U ÕÞß AAAA AEAA ðóåæ AAO Aana DNO AEAA éêëìíîú "¼½½¼½ ÅÆÇÈÉÊ EIO ÔÕÖÖÕÖÞÉÏÒ Ó EIO EESSI AAAA AEAA ðîãêåññåæ æùðñã åáæåø âåøãáóóãåæ ôåñäåø éêëìíîú O O AAA Aana æ Dae AE una EE Ø AAA ðñãåï æ Dae AE! una à "½½ # À¼üü¼ $ ÅÆÇÈÉÊ IE% Ü & ÖÖ'ÙÕþþÕ (Theia Ó EIO EESSI áæðñáøáåëãï äðøø AAA âåøãáóóãåë œAâ æ åäëìíîã) êëäåú O O AAA Aana æ Dae AE una EE õ AAA ðñãåï æ Dae AE una * ¼ # À¼üü¼ $ ÅÆÇÈÉÊ ÍÉ% + ØÙÕ'ÙÕþþÕ (Þß áæðñáøåëãï äðøø äåë ôåêåëõöêãã æ åäëìíîã) êëäåú, -. // 0122 324125,627 8972:; 2-4? @ QR GKI = TAB> TAB> TAB AV T @ WDCF = TP> FXWV V> FBSAR US> AV T @ WDCF = TP> FXWV Obrázok 5.6: Dokumentácia triedy GameModel (strana 2)

152 5 Praktické príklady: Individuálne štúdie Ťah: 3 Štart: = (03) = Cieľ: = Pomocný pól: = (02) = (01) = Ťah: 4 Štart: = Cieľ: = (03) = Pomocný pól: = (02) = (01) = Vlak: 5 Štart: = (01) = Cieľ: = (03) = Pomocná tyč: = (02) = Vlak: 6 Štart: = (01) = Cieľ: = (03) = (02) = Pomocná tyč: = Vlak: 7 Štart: = Cieľ: = (03) = (02) = (01) = Pomocná lišta: = 5.10 Index telesnej hmotnosti Index telesnej hmotnosti je veľmi jednoduchý parameter, pokiaľ ide o otázku, či osoba má nadváhu alebo podváhu. Vypočíta sa pomocou vzorca BMI = hmotnosť v kg (výška vm) 2. Tabuľka 5.2 ukazuje, ako je možné pomocou indexu telesnej hmotnosti určiť, či má osoba nadváhu alebo podváhu. Je potrebné poznamenať, že BMI zvyčajne nemá význam pre dospievajúcich mladších ako 18 rokov. V tejto časti chceme napísať ľahko použiteľný program, ktorý umožní používateľovi vypočítať jeho BMI a zobrazí varovanie, ak je hodnota príliš vysoká alebo príliš nízka. 5.10.1 Predchádzajúce poznatky z knihy Toto cvičenie sa zaoberá veľkým počtom nových konceptov z programovania grafických rozhraní: