Alap tanfolyam programozás Java-ban - PDF ingyenes letöltés

Adalékok Dietmar Ratz, Jens Scheffler, Detlef Seese, Jan Wiesenberger alaptanfolyam Java-programozáshoz

java-ban

Tartalomjegyzék I. elmélet. 11 1 Karakterláncok haladó felhasználók számára. 13 1.1 Reguláris kifejezések. 13 1.2 Konkrét példa. 14 1.3 Szövegcsere. 16 1.4 Összefoglalás. 17 2 Jegyzetek Java-ban. 19 2.1 Standard kommentárok a Java SDK-ban. 19 2.1.1 DieS @ Override Annotation. 21 2.1.2 DieS @ elavult kommentár. 22 2.1.3 DieS @ SuppressWarnings felirat. . 24 2.2 Barkácsjegyzések. 28 2.2.1 CoDo: Kóddokumentáció kommentárok használatával. 28 2.2.2 Új jegyzeteket írunk. 29 2.2.3 A kommentárok értékelése. 32 2.3 Összegzés. 36 3 JUnit vagy a hibamentes kódírás művészete. 37 3.1 Állítások haladó felhasználók számára. 38 3.2 Egységvizsgálatok. 40 3.3 Annotációk és JUnit. 45 3.4 Legjobb gyakorlatok. 46 3.5 Összegzés. 48 4 tervminta. 49 4.1 Mik azok a tervezési minták. 49 4.2 A megfigyelő minta. 51 4.2.1 Alapvető gondolat. 51 4.2.2 Az objektum modell. 51 4.2.3 Példa megvalósításra. 52 4.2.3.1 Csak egy megfigyelővel dolgozni. 52 4.2.3.2 Több megfigyelővel való együttműködés. 55

4 Tartalomjegyzék 4.2.4 A minta variációi. 60 4.2.5 Összefoglalás. 61 4.2.6 Gyakorlatok. 61 4.3 Az összetett minta. 62 4.3.1 Alapvető gondolat. 62 4.3.2 Az objektum modell. 65 4.3.3 Példa megvalósításra. 66 4.3.3.1 Két funkció összege. 66 4.3.3.2 Két funkció szorzata. 67 4.3.4 A minta variációi. 69 4.3.5 Összefoglalás. 71 4.3.6 Gyakorlatok. 72 II Gyakorlat. 73 5 Gyakorlati példák: Egyéni etűdök. 75 5.1 Oszthatóság az elsőhöz. 75 5.1.1 Előzetes ismeretek a könyvből. 75 5.1.2 Feladat. 75 5.1.3 A probléma elemzése. 75 5.1.4 Algoritmikus leírás. 76 5.1.5 Programozás Java-ban. 77 5.1.6 Vigyázat, csapda. 78 5.1.7 Gyakorlatok. 79 5.2 Oszthatóság a másodikra. 79 5.2.1 Előzetes ismeretek a könyvből. 79 5.2.2 Feladat. 79 5.2.3 A probléma elemzése. 79 5.2.4 Algoritmikus leírás. 80 5.2.5 Programozás Java-ban. 80 5.2.6 Vigyázat, csapda. 81 5.2.7 Gyakorlatok. 82 5.3 Három dolog. 82 5.3.1 Előzetes ismeretek a könyvből. 82 5.3.2 Feladat. 82 5.3.3 A probléma elemzése. 83 5.3.4 Algoritmikus leírás. 83 5.3.5 Programozás Java-ban. 84 5.3.6 Vigyázat, csapda. 87 5.3.7 Gyakorlatok. 87 5.4 A tudatosság problémája. 87 5.4.1 Előzetes ismeretek a könyvből. 87 5.4.2 Feladat. 87

Tartalom 7 6.9 9. iteráció: Amikor az s a legjobb. 210 6.9.1 Néhány előkészület. 210 6.9.2 Órák összehasonlítása. 212 6.9.3 A Beállítások párbeszédpanel. 214 6.9.4 Összegzés. 217 Irodalomjegyzék. 219

Üdvözöljük Üdvözöljük az "Alapvető tanfolyam programozás Java-ban" mellékletét. Feltételezzük, hogy könyvünkön keresztül találkozott ezzel a dokumentummal. Ha igen, csak gratulálhatunk a további információk szomjúságához. Reméljük, hogy a webbővítmények segítenek elmélyíteni és alkalmazni a megszerzett ismereteket. Ez a dokumentum két részre oszlik: elméletre és gyakorlatra. Az elméleti részben a Java programozás szempontjaival foglalkozunk, amelyeknek sajnos nincs helyük a könyvben. Ide tartoznak a Java kommentárok, egységtesztek és tervezési minták. A gyakorlati részben megtanuljuk gyakorlati programozási feladatok segítségével alkalmazni könyvismereteinket. Sokat tanultunk a Java-ról, és elméletileg képesek vagyunk megírni az első összetettebb programokat. Sajnos ugyanolyan lehetetlen nyelvet tanulni elméletből, mint autót vezetni - gyakorlásra van szükségünk. Ebből a célból megpróbálunk különféle feladatokat megoldani, és elsősorban azzal foglalkozunk, hogy hogyan lehet szisztematikusan megközelíteni a problémát, hogyan kell megoldást keresni és Java-ban programozni.

14 1 Húrok Haladó Majernek. Ha jól nézed meg, akkor valóban csak az első és az utolsó két betűt ismerjük. Az utónév H betűvel kezdődik, de nem emlékszünk. nem tudjuk, hogy az illetőnek van-e még középső neve, amely szerepel a telefonkönyvben. Szerencsére telefonkönyvünkben van egy CD-ROM, amelyen kereshetünk bizonyos keresési feltételeket. A keresési feltételeket egy bizonyos formátumban közöljük a számítógéppel - ez egy reguláris kifejezés. Tehát minden világos, ez csak egy másik számítógépes nyelv (például a Java), amelyet csak meg kell tanulnunk. 1.2 Konkrét példa Ez a szakasz nem célja a reguláris kifejezések világának teljes bevezetése, további részletekért javasoljuk, hogy olvassa el a java.util.regex.pattern osztály dokumentációját. Amint a következő példából láthatjuk, az alapok nem különösebben nehézek. A következő program az elektronikus telefonkönyvünk egyszerűsített változata: 1 nyilvános osztály szöveges keresése < 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 Jegyzetek a Java-ban 2.1.3 A @SuppressWarnings kommentár Az előző részben bemutattuk, hogy a @Deprecated Annotation használata hogyan adhat további információkat a Java fordítónak, amelyek figyelmeztetéseket eredményeztek a fordítási folyamat során. A figyelmeztetések azért hasznosak, mert figyelmeztetik a programozót olyan problémákra, amelyek problémát jelenthetnek. A túl sok (és haszontalan) figyelmeztetés azonban problémát jelent, mert olyanok, mint a telefonvonal zaja: zavarják és elvonják a figyelmet az igazán fontos dolgokról, amelyekre figyelni kell. Vegyük például a következő módszert: 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 Jegyzetek a Java 34 osztályban [] (); 35 logikai érték nem törölhető () alapértelmezett hamis; 36 37 El kell ismerni, hogy az új annotációk írása kissé furcsa érzés (a szerzőnek a pontos szintaxist is fel kell keresnie, valahányszor új annotációt ír). Jó hír, hogy a gyakorlatban sokkal kevesebb időt fordítasz az írásra és sokkal több időt fordítasz a kész kommentár használatára, és ezt szeretnénk megtenni. 2.2.3 A kommentárok értékelése A kommentárokat kétféle formában használják: egy programozó ki akarja értékelni őket akár futás közben, akár egy program összeállítása alatt. Ez utóbbi meglehetősen összetett, ezért hivatkozunk [17]. A fejezet végén egy CodoProxy osztályt szeretnénk írni, amely automatikusan ellenőrzi az interfész megvalósításának előfeltételeit. Összeadó felületünk esetében a használatnak így kell kinéznie: 1 import codo.codoproxy; 2 3 nyilvános osztály bemutató 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 Javasolatok a Java-ban, amelyek a módszer paramétereit díszítik. A visszatérési érték kétdimenziós mező. Az első dimenzió megfelel a 8. paraméternek. Tegyük fel, hogy van egy m módszerünk és egy paraméterparaméterünk, amellyel meg kell hívni, és ellenőrizni akarjuk a NotNull annotációt. Első lépésként el kell jutnunk az összes annotáció listájához: Annotation [] [] all = m.getparameterannotations (); Most végigvezetjük a mező első dimenzióját, amely megfelel a paraméterek paramétereinek, és megnézzük az egyes annotációkat, amelyek a megfelelő paraméterhez vannak definiálva: for (int i = 0; i S makeproxy (53 final class interfaceclass, final) T belső tárgy) < 54 return (T) Proxy.newProxyInstance( 55 innerobject.getclass().getclassloader(), 56 new Class[]

3.1 A haladó felhasználóknak szóló állítások 39 eltávolítva a programból, és helyettesítve őket egy módszerhívással. Ennek előnyei és hátrányai is vannak: A hátrány az, hogy a JUnit állításait nem lehet egyszerűen kikapcsolni. A Java állítások egyszerűen aktiválhatók vagy deaktiválhatók a virtuális gépben 2. Ez lelassíthatja a végrehajtást, különösen a rendkívül számításigényes kódoknál. Előnye, hogy a JUnit állításai a régebbi Java verziókkal is működnek (azaz az 1.3-at megelőzően). Ezeket még ma is használják a projektekben 3, így lefelé kompatibilisek maradunk. Természetesen ezek az érvek önmagukban nem igazolják az Assert osztályra való váltást. Ennek az osztálynak a fő előnyét még nem említették meg: további állítási módszereket biztosít: 1 import junit.framework.assert; 2 3 nyilvános osztály 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 (tábla [i] == j) true értéket ad vissza;

5.4 A nyolc nő problémája 91 4. Ha az ott végzett keresés sikertelen, folytassa a 2. lépéssel. Ha a keresés sikeres, készen vagyunk. Jelentse ennek eredményeként a sikert. 5. Ha sikertelenül értük el a nyolcadik oszlopot, akkor zsákutcában vagyunk. Jelentse vissza a hibát ennek eredményeként. Nem csak azt látjuk, hogy a megfelelő hölgy keresése minden oszlopban azonos módon épül fel; inkább azt is felismerjük, hogy az egyes oszlopkeresések közötti kommunikáció egyszerű igazra (= a keresés sikeres volt) vagy hamisra (= a keresés nem volt sikeres) vezethető vissza. Viszont egyetlen logikai érték nagyon kényelmesen visszaadható egy módszerrel. Először úgy definiáljuk a módszerünket, mintha csak egy nagyon specifikus oszlopra akarnánk keresni a megoldást. Tehát paraméterként szükségünk van az oszlop számára, amelyben keresünk, és arra a mezőre, amelyben elhelyeznünk kell. A visszatérési érték (a fentiek szerint) logikai érték: nyilvános statikus logikai készlet (int [] tábla, int oszlop) < 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 Ž uvtuvlwwifvxyz

ƒ 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 \ NMDNL DKK`f JKN NM J œ 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 Âëàä CAEA éêëìíîï AA ðîãêåññ Deo AAO ôåêåëõöêãã æ øãåùåæ ø NNU" ¼½û¼üüâ "¼ü ÅÆÇÈÉÊ ËÌÍÌÎÈÌÏÐÎÑÒÓÉÏÐ ÔÕÖýÕþþÛÔÕþÞß AAAA Âëàä CAEA éêëìíîï AA AAE AA ðîãêåññåæ ÿêæäå AO åñäåòåæøãåë øãåùåæ ø NNU" ¼½ ¼ ¼ ÅÆÇÈÉÊ ËÌÍÌÎÈÌÏÐÎÑÒÓÉÏÐ OOO Û Ó u ÕÞß AAAA Âëàä ðóåæ AAO áåñåø Dno Âëàä éêëìíîú „¼½½¼½ ÅÆÇÈÉÊ EIO ÔÕÖÖÕÖÞÉÏÒ Ó EIO eess AAAA Âëàä ðîãêåññåæ æùðñã åáæåø âåøãáóóãåæ ôåñäåø éêëìíîú o o AAA åáñåï æ Dae AE Una EE õ AAA ðñãåï æ Dae AE! una à „½½ # À¼üü¼ $ ÅÆÇÈÉÊ IE% Ü & ÖÖ'ÙÕþþÕ (Theio Ó EIO eess áæðñáøáåëãï Adoo AAA âåøãáóóãåë öêãã æ åäëìíîã) êëäåú o o AAA åáñåï æ Dae AE Una EE õ AAA ðñãåï æ Dae AE UNA * ¼ # À¼üü¼ $ ÅÆÇÈÉÊ ÍÉ% + ØÙÕ'ÙÕþþÕ (Þß áæðñáøåëãï äðøø äåë ôåêåëõöêãã æ åäëìíîã) êëäåú, -. // 0122 324125.627 8972:; 2-4? AV T @ WDCF = TP> FXWV V> FBSAR US> AV T @ WDCF = TP> FXWV 5.6. Ábra: A GameModel osztály dokumentálása (2. oldal)

152 5 Gyakorlati példa: Egyéni tanulmányok húzás: 3 kezdet: = (03) = cél: = segédoszlop: = (02) = (01) = húzás: 4 indítás: = cél: = (03) = segédoszlop: = (02) = (01) = vonat: 5 indítás: = (01) = cél: = (03) = segédrúd: = (02) = vonat: 6 indítás: = (01) = cél: = (03) = (02) = segédrúd: = Vonat: 7 Indulás: = Úticél: = (03) = (02) = (01) = Kiegészítő sáv: = 5.10 Testtömegindex A testtömeg-index egy nagyon egyszerű paraméter abban a kérdésben, hogy egy személy túlsúlyos vagy túlsúlyos. Kiszámítása a következő képlet alapján történik: BMI = súly kg-ban (magasság m-ben). 2 Az 5.2. Táblázat bemutatja, hogyan lehet a testtömeg-indexet meghatározni annak, hogy egy személy túlsúlyos vagy alacsony. Meg kell jegyezni, hogy a BMI általában nem értelmes 18 év alatti serdülők számára. Ebben a részben egy könnyen használható programot szeretnénk írni, amely lehetővé teszi a felhasználó számára a BMI kiszámítását, és figyelmeztetést jelenít meg, ha az érték túl magas vagy túl alacsony. 5.10.1 Előzetes ismeretek a könyvből Ez a gyakorlat számos új fogalommal foglalkozik a grafikus interfészek programozásával kapcsolatban: