44G UOA2 J8 ZLOM.doc verze , uloženo: pá :35 Strana 2 z 651

Rozměr: px
Začít zobrazení ze stránky:

Download "44G UOA2 J8 ZLOM.doc verze , uloženo: pá :35 Strana 2 z 651"

Transkript

1

2 44G UOA2 J8 ZLOM.doc verze , uloženo: pá :35 Strana 2 z 651

3 Java 8 úvod do objektové architektury pro mírně pokročilé Rudolf Pecinovský G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 3 z 651

4 Upozornění pro čtenáře a uživatele této knihy Všechna práva vyhrazena. Žádná část této tištěné či elektronické knihy nesmí být reprodukována a šířena v papírové, elektronické či jiné podobě bez předchozího písemného souhlasu nakladatele. Neoprávněné užití této knihy bude trestně stíháno. Rudolf Pecinovský Java 8 Úvod do objektové architektury pro mírně pokročilé TIRÁŽ TIŠTĚNÉ PUBLIKACE Vydala Grada Publishing a.s. U Průhonu 22, Praha 7 jako svoji publikaci Odborní lektoři: doc. Ing. Pavel Herout, Ph.D., doc. MUDr. Jiří Kofránek, CSc., doc. Ing. Vojtěch Merunka, Ph.D., doc. Ing. Miroslav Virius, CSc. Odpovědný redaktor: Martin Vondráček, Ladislava Soukupová Návrh vnitřního layoutu: Rudolf Pecinovský Zlom: Rudolf Pecinovský Počet stran 656 První vydání, Praha 2014 Vytiskla tiskárna PROTISK, s. r. o. V knize použité názvy mohou být ochrannými známkami nebo registrovanými ochrannými známkami příslušných vlastníků. Copyright Grada Publishing, a.s., 2014 Cover Photo fotobanka Allphoto.cz ISBN TIRÁŽ ELEKTRONICKÉ PUBLIKACE ISBN (ve formátu PDF) ISBN (ve formátu EPUB)

5 Mé ženě Jarušce a dětem Štěpánce, Pavlínce, Ivance a Michalovi 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 5 z 651

6 6 Java 8 Úvod do objektové architektury pro mírně pokročilé Stručný obsah Stručný obsah Skrytí spoluautoři Úvod Část I: Vývojové prostředí Co byste měli znát z prvního dílu Vývojové prostředí NetBeans Projekty v NetBeans Library Vytváříme nový projekt AHA Práce na připraveném projektu Elevator Spolupráce projektů Vehicle Testovací třída VehicleTest, Robot Ladění programů Robot Část II: Vylepšování architektury Program ve výjimečné situaci Návrhový vzor Tovární metoda Návrhový vzor Stav Robot Návrhový vzor Stavitel RingBuilder Návrhový vzor Dekorátor SmoothVehicle Implicitní implementace RingVehicle, ControlledVehicle Generické datové typy a metody Pokročilejší práce s typovými parametry Funkční interfejsy a lambda-výrazy Rekurzivní volání Interní datové typy Kontejnery a datovody G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 6 z 651

7 Stručný obsah 7 Část III: Dědění implementace Podrobnosti o konstruktorech tříd a instancí Úvod do dědění implementace: Mother Daughter Granddaughter Zakrývání atributů a metod Virtuální metody a jejich přebíjení Pasti a propasti dědění implementace Vytváříme rodičovskou třídu ARobot Část IV: Další užitečné programové konstrukce Učíme program přemýšlet Ještě jednu rundu, prosím Další důležité datové struktury O čem jsme ještě nehovořili Rejstřík G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 7 z 651

8 8 Java 8 Úvod do objektové architektury pro mírně pokročilé Podrobný obsah Podrobný obsah Skrytí spoluautoři Úvod Komu je kniha určena Koncepce knihy Co se naučíte, uspořádání knihy Programovací jazyk Potřebné vybavení Doprovodné projekty Doplňková literatura Použité konvence Místní nabídka Formátování Odbočka Část I: Vývojové prostředí Co byste měli znát z prvního dílu Přehled látky prvního dílu Definice deklarace Co je to objekt Datový typ, třída, class-objekt Zpráva metoda, polymorfismus Rozhraní interfejs Zapouzdření a skrývání implementace Datové typy a jejich dědění Vlastní instance třídy a mateřská třída objektu LSP Liskov Substitution Principle Přetěžování přebíjení zakrývání metod Odkazové a hodnotové datové typy Návrhové vzory Modul komponenta knihovna framework Modul Komponenta Knihovna Framework Změny šablon Knihovna CanvasManager Shrnutí co jsme se naučili Vývojové prostředí NetBeans Instalace Instalace pro Windows První spuštění G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 8 z 651

9 Podrobný obsah Aplikační okno, panely a karty Změny rozměrů panelů...53 Minimalizace a obnovení panelů a karet...53 Další možnosti Otevření existujícího projektu Navigátor a jeho ikony Úprava nastavení prostředí General obecná nastavení Editor nastavení editoru Karta General...59 Braces Matching...59 Camel Case Behavior...59 Search...59 Karta Folding...60 Karta Formatting...60 Karta Code Completion...61 Language...61 Karta Code Templates...62 Karta Hints...63 Karta Highlighting...63 Karta Macros...63 Karta OnSave...64 Karta Spellchecker Fonts & Colors nastavení písma a barev Nastavení písma...64 Vybarvení komentářů Keymap klávesové zkratky Java nastavení pro Javu Team Karta Action Items Appearance nastavení vzhledu Karta Document Tabs...68 Karta Windows...69 Karta Look and Feel Miscellaneous zbylá nastavení Karta CSS Preprocessors...70 Karta Diff...70 Karta Files...70 Karta Output...70 Karta Terminal Nastavení panelů nástrojů Export a import nastavení Export...73 Import Shrnutí co jsme se naučili Projekty v NetBeans Library Balíčky programů tohoto dílu Balíčková struktura knihovny Složky se zdrojovými soubory Balíčky na kartě projektů Práce s balíčky Vytvoření nového balíčku...81 Přesun tříd mezi balíčky...82 Importy z vlastního balíčku G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 9 z 651

10 10 Java 8 Úvod do objektové architektury pro mírně pokročilé Přejmenování balíčku Překlad a sestavení projektu Programátorská dokumentace (API) Dokumentace při psaní kódu Možnosti okna dokumentace Samostatná karta dokumentace Vytvoření dokumentace projektu Karta souborů Vlastnosti projektu Stránka Sources Stránka Libraries Stránka Compiling Stránka Documenting Stránka Run Přejmenování projektu Definice projektu jako knihovny Shrnutí co jsme se naučili Vytváříme nový projekt AHA Vytvoření nového projektu Spuštění aplikace Vytvoření kopie třídy Nápověda při psaní kódu Zadání spouštěcí třídy projektu Spouštěcí konfigurace Vytvoření a spuštění aplikace Paralelní spuštění více aplikací Shrnutí co jsme se naučili Práce na připraveném projektu Elevator Poloprázdná třída a metoda Zadání Analýza problému Sjednocení různých řešení Implementované interfejsy Okolí Konstruktory Dva přístupy k řešení problému Potřebné metody Interfejs IElevator Vzorový projekt Testovací třída Přizpůsobující se společná testovací třída Inicializace a finalizace bloku testů v dané třídě Třídy jako objekty class-objekt třídy Zafixování testované třídy Vynechání konkrétního testu Spuštění a vyhodnocení testů Definice vlastní třídy Atributy Konstruktory a metody interfejsů IPaintable a IMovable Interfejs a data Postup při návrhu metod deklarovaných v interfejsu IElevator Metoda goto(int) předehra Metody floor2y(int) a y2floor(int) G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 10 z 651

11 Podrobný obsah 11 Metoda goto(int) realizace Metoda cometo(imovable) Metoda enter(imovable) Metody exitleft() a exitright() Test převozu pasažéra Metody transportright(imovable,int) a transportleft(imovable,int) Porovnání řešení Práce s více soubory Shrnutí co jsme se naučili Spolupráce projektů Vehicle Zadání Vytvoření nové třídy Zakomentování a odkomentování části kódu Dokumentace balíčku Použití frameworku či knihovny Třída IO jako aplikace návrhového vzoru Fasáda Zkopírování zdrojových souborů Podporované způsoby připojení potřebného projektu Připojení celého potřebného projektu Přidání JAR-souboru mezi knihovny Přidání propojení na knihovnu Oprava špatného nastavení Nevytvořený JAR-soubor Přestěhování souborů na jiné místo disku Poloautomatická implementace interfejsu Konstruktory Poloautomatická generace konstruktoru Poloautomatické doplnění komentářových značek Doplnění těl konstruktorů Dokončení těla konstruktoru Výraz lokální proměnná Lokální proměnná atribut Rychlý test Historie změn Podrobnosti o barvách Shrnutí co jsme se naučili Testovací třída VehicleTest, Robot Vytvoření Obsah testovací třídy Inicializace a finalizace Těla poloprázdných metod Šablona testovací třídy Parametry 7.4 Využití služeb třídy IndentingReporter Popis některých metod Použití odsazení Získání názvu spouštěného testu Spuštění testů Spuštění konkrétního testu Spuštění všech testů dané třídy Spuštění všech testů projektu Definice inicializačních a finalizačních metod Získání správce plátna Lokální proměnná statická konstanta G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 11 z 651

12 12 Java 8 Úvod do objektové architektury pro mírně pokročilé 7.7 Nechtěné automatické doplnění identifikátoru Vytvoření požadovaných testů Test funkce přípravku Test implementovaných metod Definice přístupových metod testované třídy Lokalizace souboru v projektu Přejmenování třídy spolu s testem Přesun do nového balíčku Vyhledávání a nahrazování textu Shrnutí co jsme se naučili Ladění programů Robot Metody ladění Kontrolní tisky Používání ladícího programu Nastavení zarážky v řádku kódu Možnosti krokování Zobrazování dat Zásobník volání Zarážka na entitě Trvalost zarážek Záložky (bookmark) Úkoly Shrnutí co jsme se naučili Část II: Vylepšování architektury Program ve výjimečné situaci Co to jsou výjimky Nejdůležitější výjimky Vyhození výjimky Výjimky a nedosažitelný kód Co výjimky umí getmessage() tostring() printstacktrace() printstacktrace(printstream) Hierarchie dědění výjimek Zachycení vyhozené výjimky Analýza rekurzivní metody Několik současně odchytávaných výjimek Společná reakce na několik výjimek Společný úklid blok finally Testování správného vyhození výjimky Tělo metody testující správné vyhození výjimky Specifikace očekávané výjimky v anotaci Definice vlastních výjimek Kontrolované výjimky Převedení kontrolované výjimky na nekontrolovanou Informace o skutečném původci výjimky Ověřování podmínek příkaz assert Design by Contract Shrnutí co jsme se naučili G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 12 z 651

13 Podrobný obsah Návrhový vzor Tovární metoda Motivace Jak na to Použití v projektu s výtahy Programování proti rozhraní Použití tovární třídy v projektu s vozidly Definice interfejsu IVehicle Testovací třída VehicleTest Možnost výběru testované třídy Přepínání mezi pevně zadanou a volitelnou tovární třídou Možnost využití konstruktoru třídy Shrnutí co jsme se naučili Návrhový vzor Stav Robot Řešený problém Vozidla na šachovnici Společné rozhraní otočných vozidel IVehicle Různé chování v závislosti na směru Jednostavové třídy Čtyřstavová třída Stavové rozhraní Definice jednostavových tříd Definice vícestavové třídy Testovací třída Zásady použití vzoru Stav Shrnutí co jsme se naučili Návrhový vzor Stavitel RingBuilder Řešený problém Dvě skupiny požadavků na segment Definice segmentů Nastavení barvy Konstruktory Test správného vytvoření segmentů Přidání následníka Potřebné atributy Zbylé metody Zdánlivý problém s viditelností segmentů Definice dopravního okruhu Správa vytvořeného okruhu Zobrazení okruhu Přizpůsobení se změně kroku plátna Oznámení startovního segmentu Konstrukce okruhu Návrhový vzor Stavitel Definice stavitele RingBuilder Atributy Konstruktor Start stavby okruhu Zřetězení volání metod Pokračování ve stavbě okruhu Ukončení stavby okruhu Test stavby okruhů Ověřování podmínek G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 13 z 651

14 14 Java 8 Úvod do objektové architektury pro mírně pokročilé 12.9 Test vyhazování výjimky Dokončení definice okruhu Nastavení políčkové pozice Prozrazení políčkového rozměru Přizpůsobení se změně kroku plátna Extrakce části kódu do samostatné metody Test vybudovaného okruhu Továrna na okruhy Shrnutí co jsme se naučili Návrhový vzor Dekorátor SmoothVehicle Modifikace chování skupiny objektů Plynule posuvná vozidla Definice dekorující třídy Delegát a konstruktory Implementace metod pro porovnání objektů Implementace zbylých metod Ještě trochu kosmetiky Definice těla metody goforward() Doplnění metody delegující zodpovědnost na atribut Přidání vlastnosti Dokončení úprav Test Princip vzoru Dekorátor Shrnutí co jsme se naučili Implicitní implementace RingVehicle, ControlledVehicle Dekorátor přidávající další funkčnost Třída Multimover a interfejs IMultiMovable Definice třídy RingVehicle Implicitní definice metod interfejsu Statické metody definované v interfejsu Šablona interfejsů Čím se liší interfejs od třídy Výhody implicitní implementace Úprava interfejsu IVehicle Doplnění konstruktorů továrních objektů Rozšíření interfejsu IVehicleFactory Test Pokračování definice přesunu Vypuštění vozidla na okruh Test Vozidlo ovládané z klávesnice Návrhový vzor Adaptér (Adapter) Návrh třídy ControlledVehicle Přebití implicitních definic Testování Mechanismus reakce na klávesnici Shrnutí co jsme se naučili Generické datové typy a metody Motivace Generické a parametrizované datové typy G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 14 z 651

15 Podrobný obsah Definice generických typů Použití generických typů Rizika nepoužití typových parametrů Varování překladače a jejich potlačení Proč vypínat varování Překlad generických datových typů a očišťování Omezení typových atributů na instanční členy Generické metody Shrnutí co jsme se naučili Pokročilejší práce s typovými parametry Omezení typových parametrů Typové parametry s více předky Potomci a předci generických typů Žolíky Příklad: datový typ Interval<T extends Comparable<? super T>> Ternární operátor?: podmíněný výraz Definice parametrizovaného datového typu Grupy Deklarace IGroup<B, G extends IGroup<B, G>> Definice třídy DirectionGroup Na co potřebujeme interfejs IGroup Shrnutí co jsme se naučili Funkční interfejsy a lambda-výrazy Motivace Funkční interfejs (functional interface) Lambda-výrazy Použití lambda výrazů v programu Předčasné zhasínání Metoda stopblinking() Modifikátor volatile a synchronizace vláken Test ukončení neexistujícího blikání testwrongstopblinking() Reakce na ukončení blikání Test správné reakce na předčasné spuštění Test korektního ukončení blikání teststoppedmovingandblinking() Alternativní definice funkčních objektů Světlo umožňující ovlivnit tvar žárovky Získání žárovky Požadavky na typ žárovky Uložení žárovky Uložení továrního objektu Upravená definice třídy Light Testy Generická verze třídy třída LightG <B extends IChangeable & IColorable> Důsledky definice třídy LightG jako generické Sjednocení definic otoček robota Shrnutí co jsme se naučili Rekurzivní volání Princip Přímá a nepřímá rekurze Přeplnění zásobníku návratových adres Pojezdy tam zpět metoda zigzag G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 15 z 651

16 16 Java 8 Úvod do objektové architektury pro mírně pokročilé 1. Úkol Otočka Délka pojezdu Cílová pozice Předání metody multipřesouvači Odbočka: rekurze versus zpětné volání Test správného naprogramování přesunu Objíždění čtverce Shrnutí co jsme se naučili Interní datové typy Motivace Terminologie Společné charakteristiky interních typů Použití Pomocný soukromý typ Objekt znající útroby a implementující veřejné rozhraní Sdružení souvisejících typů Globální interní (členské) datové typy Vnořené datové typy Pomocná vnořená přepravka Řešený problém První nástřel: poloveřejná přepravka Test Co je na předchozím řešení nešikovné Vnořená tovární třída Výhody a nevýhody jednotlivých možností Vnitřní třídy Blikající světlo s vnitřní třídou Hraniční obdélník objektu na plátně Lokální třídy Pojmenované lokální třídy Anonymní třídy Blikající světlo s anonymní třídou Použití anonymních tříd Shrnutí co jsme se naučili Kontejnery a datovody Kontejnery Zvláštnosti programových kontejnerů Přepravky Pole (array) Kolekce (collection) Mapy, slovníky (map, dictionary) Motivace pro zavedení datovodů Deklarativní a imperativní styl programování Datovody (streams) Druhy operací Práce datovodu Vytváření datovodů z kolekcí a polí Použití datovodu blikající světla Třída StreamTest Pomocná metoda streamblink(stream<light>,string) Porovnání sériového a paralelního datovodu Použití metody foreach(runnable) Použití filtrů G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 16 z 651

17 Podrobný obsah Řazení objektů v datovodu Složitější příklad Zadání Rozbor Test metoda testmovementsstepobj() Vytvoření a zpracování proudu kroků metoda movementsstepobj(string, Collection<? extends IChangeable>) Přesun objektů v daném kroku metoda moveinstepallobjects(string, Collection<? extends IChangeable>) Definice metod plynulé verze Konverze prvků v datovodu Metoda createanddrive(ivehiclefactory, String, Position...) Pomocná metoda goindirections(string) Test Vytvoření vlastního datovodu Shrnutí co jsme se naučili Část III: Dědění implementace Podrobnosti o konstruktorech tříd a instancí Opakování: co víme o konstruktorech instancí Zavádění třídy java.lang.classloader Statický konstruktor konstruktor třídy Instanční inicializační blok Dvojitost těla konstruktoru instancí Příklad Statický konstruktor, konstruktor třídy Důležitá pravidla : Úvodní statický inicializační blok : Předčasné použití atributu : Nekorektní použití metod : Předčasné použití konstanty : Nekorektní volání konstruktoru Doporučení: jediný statický inicializační blok Konstruktor instancí Roztroušená část : Úvodní instanční inicializační blok : Deklarace konstanty loaded : Inicializační výpočet : Použití this : Závěrečný blok Tělo osloveného konstruktoru : Bezparametrický konstruktor : Jednoparametrický konstruktor : Dvouparametrický konstruktor : Tříparametrický konstruktor Experimenty Shrnutí co jsme se naučili Úvod do dědění implementace: Mother Daughter Granddaughter Úvodní poznámky Definice dceřiné třídy Rodičovský podobjekt Konstruktor G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 17 z 651

18 18 Java 8 Úvod do objektové architektury pro mírně pokročilé * Konstrukce rodičovského podobjektu Přetížené verze konstruktorů použití super this Test Konstruktory rodiče a potomka Emulace dědění dekorátorem Přípony názvů typů v přípravku Demonstrace chování konstruktorů Konstrukce podpisu Zpráva o zavedení třídy Demonstrace Rodičovský podobjekt je abstrakce Vytváření instancí tříd využívajících dekorátor Chráněné členy modifikátor přístupu protected Zákaz vytváření potomků třídy Shrnutí co jsme se naučili Zakrývání atributů a metod Posílání zpráv a volání metod Dědění metod Zděděné, dále neupravované metody Zděděné metody, pro něž potomek definuje lepší implementaci Kompatibilita signatur Zakrývání metod předka (method hiding) Metody, které není možno v potomku zakrýt či přebít modifikátor final Třídy, které nemohou mít potomky Zakrývání atributů předka Emulace zakrývání v D-třídách Metody nově definované v potomku Staticky dynamicky typované jazyky Proč je situace jednoduchá jen zdánlivě Zakrývání interních datových typů Závěr Shrnutí co jsme se naučili Virtuální metody a jejich přebíjení Virtuální metody a jejich přebíjení Časná a pozdní vazba Virtuální metody Které metody jsou v Javě virtuální Chování virtuálních metod Emulace virtuálních metod v dekorátoru Zdokonalení třídy Square Přebití metody copy() Problémy s nastavováním velikosti První návrh definice metody setsize(int,int) Test prvního návrhu Oprava Co se nám na dědění nelíbí Návrhový vzor Šablonová metoda (Template method) Princip Implicitní metody interfejsů Metoda tostring() Shrnutí co jsme se naučili Pasti a propasti dědění implementace G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 18 z 651

19 Podrobný obsah Třída XCRectangle Testovací třída Podklady pro vlastní řešení Definice konstruktorů Definice tovární třídy Metoda paint(painter) Změny pozice a velikosti Upravená podoba definice třídy Co je na uvedeném řešení nevhodné Řešení definicí atributu Řešení sloučením dědění a dekorátoru Typové parametry Předci Statické členy Instanční členy Samostatná úloha: Terč Virtuální metody v konstruktoru Definice třídy Aureole Test objektů se svatozáří Řešení 1: Změna řešení Řešení 2: Devirtualizace metody Řešení 3: Využití rodičovské verze metody Řešení 4: Definice ekvivalentní soukromé metody Shrnutí co jsme se naučili Vytváříme rodičovskou třídu ARobot Abstraktní metody a třídy Abstraktní a konkrétní metody Interfejsy Třídy Abstraktní a konkrétní třídy Účel abstraktních tříd Účel abstraktních metod Proč společný rodič Návrhový vzor Stav s rodičovskou třídou Vytvoření prázdného společného rodiče Příprava potomků Členy třídy Konstantní atributy instancí Konstruktory Metody instancí Ověření regresním testem Rodičovská třída segmentů okruhu Specifikace předků IRingSegment IChangeable copy() IRingBuildSegment Společný abstraktní rodič Definice potomků Návrhový vzor Adaptér podruhé Společný rodič dekorátorů Použití ve třídě ControlledVehicle Společný rodič výtahů Shrnutí co jsme se naučili G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 19 z 651

20 20 Java 8 Úvod do objektové architektury pro mírně pokročilé Část IV: Další užitečné programové konstrukce Učíme program přemýšlet Jednoduchý podmíněný příkaz Předčasné ukončení metody Kdy assert a kdy if Blok příkazů (složený příkaz) Formátování bloků příkazů Blok je chápán jako jeden příkaz Další vlastnosti bloku příkazů Vnořování bloků příkazů Metoda equals(object) Kontrakt metody Definice metody Metoda hashcode() Neměnnost objektů Zanořování podmíněných příkazů Architektura Výběr ze dvou možností Kaskáda možností Tovární metoda jednosměrného vozidla Přepínač příkaz switch Slučování návěští Přepínač nad výčtovým typem Kvalifikace v návěštích Přepínač nad řetězci Shrnutí co jsme se naučili Ještě jednu rundu, prosím Měření času v Javě Cykly Jak máme rychlý počítač cyklus s koncovou podmínkou Jeden test nestačí cyklus s počáteční podmínkou Cyklus s parametrem Nekonečný cyklus Vnořování cyklů Cyklus s podmínkou uprostřed Příkaz break s návěštím Cyklus s prázdným tělem Dvojtečkový cyklus for Shrnutí co jsme se naučili Další důležité datové struktury Pracujeme s náhodou Kontejnery Statické a dynamické kontejnery Kolekce (Collection) Množina (Set) Seznam (List) Fronta (Queue) Oboustranná fronta (Deque) Zásobník (Stack) Strom (Tree) Graf (Graph) G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 20 z 651

21 Podrobný obsah 21 Mapa (Map), Slovník (Dictionary) Standardní knihovna kolekcí Javy Převod datovodu na kolekci či pole Návrhový vzor Iterátor (Iterator) Princip Interfejsy java.util.iterator<e> a java.lang.iterable<e> Použití iterátorů v Javě Odebírání objektů během cyklu Zobecnění možností cyklu for(:) Shrnutí co jsme se naučili O čem jsme ještě nehovořili Užitečné třídy ze standardní knihovny Výčtové datové typy Datový typ Optional<T> Regulární výrazy (regular expressions) Seznam doporučené a nedoporučené literatury Slovo na závěr Rejstřík G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 21 z 651

22 22 Java 8 Úvod do objektové architektury pro mírně pokročilé Skrytí spoluautoři Skrytí spoluautoři Při tvorbě takto rozsáhlé knihy se autor nemůže spolehnout pouze sám na sebe. Je známou věcí, že když po sobě autor čte svůj rukopis, čte velmi často to, co chtěl napsat, a ne to, co doopravdy napsal. S kontrolou jazykových chyb mu může pomoci redaktor a jazykový korektor. S kontrolou odborných zaškobrtnutí mu však musí pomoci někdo jiný. S kontrolou odborné správnosti musí pomoci někdo, kdo je odborně na výši a odhalí, že se autor vyjadřuje nepřesně nebo dokonce chybně. S kontrolou srozumitelnosti výkladu musí zase pomoci někdo, kdo se chce látku naučit a je ochoten text podrobně pročíst a upozorňovat na místa, kde výkladu zcela nerozumí nebo se mu zdá, že by bylo vhodné ještě něco doplnit. Úplně dokonalé pak je, když váš text čte zkušený učitel, který umí odhalit nejenom oba výše popsané druhy nepřesností či dokonce chyb, ale také naznačit možná potenciální nedorozumění a dezinterpretace vzniklá z podobnosti vykládané látky s jinými oblastmi, o nichž se výklad nezmiňuje. Měl jsem to štěstí, že se mi podařilo získat spolupracovníky (a tím i kritiky) ze všech tří zmiňovaných skupin. Všem bych jim chtěl tímto poděkovat. Řekl bych, že díky jejich připomínkám a doporučením je výsledný text kvalitnější. Všechny tyto dobrovolné spolupracovníky vnímám jako spoluautory. Proto mi dovolte, abych je tu alespoň abecedně vyjmenoval byli to: Milan Augustin, Tibor Bako, Jakub Hadam, Michael Charvát, Jiří Kofránek, Jiří Kubala, Petr Kuchař, David Král, Filip Malý, Nikolas Patrik, Jarmila Pavlíčková, Luboš Pavlíček, Josef Svoboda, Petr Vidrman, Martin Vondráček a Martin Žamberský. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 22 z 651

23 Úvod 23 Úvod Úvod Otevíráte knížku, která vás chce naučit programovat moderním, objektově orientovaným stylem. Stylem, jímž se v dnešní době vyvíjí drtivá většina klíčových aplikací, ale k jehož výuce ještě řada škol nedospěla. Po nastudování této knížky budou proto mnozí z vás vědět o moderním programování víc než leckterý z vašich učitelů. Komu je kniha určena Kniha je určena programátorům, kteří potřebují získat hlubší vhled do problematiky objektově orientovaného programování a návrhu architektury objektově orientovaných programů. K jejímu studiu přitom nepotřebují žádné velké předběžné zkušenosti. Stačí znalosti na úrovni mých začátečnických učebnic. Kniha je reakcí na nepřetržité nářky vedoucích programátorských týmů, kteří posílají nastoupivší absolventy do mých přeškolovacích kurzů. Stěžují si, že školy opouštějí možná skvělí kodéři, ale neschopní architekti, že tito absolventi znají několik programovacích jazyků a řadu užitečných frameworků, ale mají problém s návrhem kvalitní architektury zadávaného programu. Většina škol, učebnic a výukových kurzů se soustředí především na výklad syntaxe probíraného programovacího jazyka a probrání hlavních knihoven používané platformy. Jejich autoři se soustřeďují na detaily v bláhové naději, že jejich studenti a čtenáři pak v průběhu následující praxe pochopí vyšší principy. Když se ve výukovém programu objeví kurzy návrhových vzorů, končí často jako defilé technik, jak to či ono šikovně zakódovat. Koncepce knihy Ve svých knihách se pokouším tento stereotyp změnit. Soustředím se především na předvádění toho, jak program navrhnout a probrat věci, které považuji za důležité a přitom je v jiných učebnicích většinou nenajdete. Přitom se pokouším vše demonstrovat na příkladech. Na rozdíl od některých učebnic se však nechci omezovat pouze na AHA-příklady, jejichž jediným cílem je, aby po jejich prostudování student prohlásil Aha! Takto to funguje!, i když se jim v některých chvílích nevyhnu. Snažím se ale co největší část látky demonstrovat na složitějších příkladech, které však nejsou zahlceny spoustou šumu, za který považuji kód, který se 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 23 z 651

24 24 Java 8 Úvod do objektové architektury pro mírně pokročilé musí naprogramovat, i když s vykládanou látkou přímo nesouvisí. Dávám přitom přednost příkladům používajícím grafiku, protože jsou pro daný účel většinou nejnázornější. Kniha je koncipována jako druhý díl knihy Java 7 Učebnice objektové architektury pro začátečníky 1. Předpokládá proto, že znáte látku zhruba na úrovni prvního dílu. Protože ale očekávám, že knihu bude číst i řada čtenářů, kteří získali své první programátorské zkušenosti z jiných zdrojů, tak pro jistotu na počátku nejdůležitější věci velice stručně zopakuji. Co se naučíte, uspořádání knihy Snažil jsem se v knize soustředit na oblasti, které se do jiných knih nevešly, a přitom je jejich osvojení velmi důležité, protože jejich neznalost je v lepším případě příčinou těžkopádných řešení a v horším případě příčinou špatně odhalitelných chyb. V první části nejprve bleskově zopakuji základní látku prvního dílu a pak vás seznámím s jedním ze tří nejpoužívanějších profesionálních vývojových prostředí: s prostředím NetBeans. V minulém dílu jsme pracovali s vývojovým prostředím BlueJ. To je sice asi nejlepší prostředí pro získání základních představ a návyků objektově orientovaného programování, ale pro profesionální práci se příliš nehodí. Protože je ale zvládnutí vývojového prostředí zhruba stejně náročné jako zvládnutí programovacího jazyka, je mu věnován celý zbytek první části. Naučíte se je konfigurovat, vytvářet v něm projekty a využívat jeho výhodných vlastností pro zefektivnění své práce. V druhé části si postupně ukážeme různé programové konstrukce a postupy, které můžete využít při návrhu architektury projektu. Postupně se seznámíte s dalšími návrhovými vzory, osvojíte si definici interfejsů obsahujících definice metod včetně jejich implementace, dozvíte se o možnosti parametrizace datových typů a jejich vzájemném vnořování, naučíte se používat lambda-výrazy, které umožňují pracovat s částmi kódu jako s proměnnými, a získáte první zkušenosti s prací s kontejnery a datovody. Ve třetí části se ponoříme do výkladu dědění implementace. Začneme podrobným výkladem zavádění objektů a tříd a budeme pokračovat základními vlastnostmi dědění implementace. Dozvíte se, jak vytvářet třídy, jejichž předky jsou jiné třídy, a hlavně na co si dát při konstrukci takovýchto tříd pozor. Pokusím 1 Kniha je současně slibovaným druhým dílem starší učebnice OOP Naučte se myslet a programovat objektově. Ta sice vyšla v jiném nakladatelství, ale protože dané nakladatelství nedokázalo před několikeré upomínky dostát svým závazkům, tak jsem z tvorby druhého dílu vycouval. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 24 z 651

25 Úvod 25 se vám demonstrovat některé vlastnosti dědění na třídách, které dědění emulují využitím návrhového vzoru Dekorátor a předvedu vám, jak definovat společného rodiče skupině tříd, které mají některé společné vlastnosti. Ve čtvrté, závěrečné části, vám představím algoritmické konstrukce, jejichž používání je sice postupně nahrazováno jinými technikami (ty probírají předchozí části učebnice), ale prozatím se bez nich stále ještě neobejdeme. Navíc se ve starších programech s některými novějšími konstrukcemi ani nesetkáte. Programovací jazyk Přestože má kniha ve svém názvu uveden jazyk Java, tak musím dopředu oznámit, že se nejedná o učebnici jazyka Java. Těch je k dispozici více než dost. Jedná se o učebnici objektově orientovaného programování a jazyk Java je zde používán jako jazyk, v němž jsou zapsány programy demonstrující probíranou látku. Tento jazyk jsem zvolil z několika důvodů: Je to stále s odstupem nejpoužívanější objektově orientovaný jazyk. Programátoři v Javě jsou stále nejžádanější (a mají i jedny z nejvyšších platů). Je to jazyk poskytující všechny klíčové konstrukce používané v moderním programování. Vytvořené programy nejsou omezeny na jediný operační systém, ale můžete je přenášet mezi různými operačními systémy. A vlastnost neocenitelná pro studium a začátečnické experimenty: nástroje pro vývoj všech druhů aplikací od čipových karet až po rozsáhlé aplikace běžící na několika počítačích můžete sehnat zdarma. Potřebné vybavení Pro úspěšné studium této knihy budete potřebovat: chuť naučit se objektově programovat a výdrž v situacích, kdy se vám nebude zcela dařit, rozumně výkonný počítač, základní vývojovou sadu Javy (JDK) ve verzi 8 a vyšší, kterou si můžete stáhnout se stránek vývojové prostředí NetBeans ve verzi 8 a vyšší, které si můžete stáhnout ze stránek doprovodné příklady, které si můžete stáhnout ze stránky knihy 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 25 z 651

26 26 Java 8 Úvod do objektové architektury pro mírně pokročilé Doprovodné projekty Na stránce knihy na adrese najdete také soubor s generátorem projektů použitých v knize. Téměř každá kapitola má svůj doprovodný projekt. Některé kapitoly jich mají dokonce několik. Možná bude někomu připadat zbytečné vytvářet takové množství projektů, když jsou jednotlivé sekce umísťovány do samostatných balíčků a řada projektů ve svém obsahu vychází z projektů předchozích, k nimž buď něco přidá a/nebo něco jiného drobně upraví. Důvodem tohoto uspořádání je snaha vyjít začátečníkům vstříc a umožnit jim v každé kapitole začít znovu s funkčním projektem nezávisle na tom, do jakého stavu přivedli projekt z kapitoly přechozí. První díl byl určen pro naprosté začátečníky, kterým jsem se snažil vyjít vstříc, a protože vím, jaký problém s angličtinou má značná část studentů, používal jsem pro větší názornost české identifikátory. Pořízením této učebnice jste se přihlásili mezi pokročilejší programátory, a ti se bez znalosti angličtiny neobejdou. V této branži platí: programátor musí umět anglicky, anebo musí změnit zaměstnání. V tomto dílu jsou proto už všechny identifikátory anglicky. České zůstávají pouze dokumentační komentáře. Doplňková literatura Kniha je tlustá, ale ani tak se do ní nevešlo vše, co by bylo potřeba. Navíc se mi nechtělo podrobně rozebírat témata, která už jsem vysvětlil v publikaci, kterou si můžete zdarma stáhnout. Hovořím konkrétně o knize Java 5.0 Novinky jazyka a upgrade aplikací, kterou si můžete zdarma stáhnout na mých webových stránkách na adrese htp://knihy.pecinovsky.cz/java5novinky. Kromě toho se na svých stránkách chystám postupně zveřejňovat materiály, které budu připravovat pro studenty a případné polotovary budoucích publikací. Když si uvědomím, že při psaní knih vychází honorář asi tak na 7 korun za hodinu práce, tak se domnívám, že nic neztratím, když budu budoucí texty poskytovat zdarma a ponechám na rozhodnutí čtenářů, zda si jich cení tak, že jsou za ně ochotni něco zaplatit. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 26 z 651

27 Úvod 27 Použité konvence Místní nabídka Skrytí spoluautoři, kteří četli vytvářený rukopis, mne upozornili na některé formulace, které je nebo jejich kolegy trochu zaskočily. Jednou z nich je termín místní nabídka, který se sice v počítačové literatuře používá od počátku devadesátých let, nicméně do programátorského slangu ještě nepronikl. Opatrně proto připomenu, že budu-li někde hovořit o tom, že máte zadat nějaký příkaz v místní nabídce objektu Xyz, znamená to, že máte na tento objekt najet myší, stisknutím pravého tlačítka rozbalit jeho místní nabídku (anglicky context menu) a v ní zadat požadovaný příkaz. Formátování K tomu, abyste se v textu lépe vyznali a také abyste si vykládanou látku lépe zapamatovali, používám několik prostředků pro odlišení a zvýraznění textu. Objekty Názvy Citace Adresy Program První výskyt nějakého termínu a další texty, které chci zvýraznit, vysazuji tučně. Názvy firem a jejich produktů vysazuji kurzivou. Kurzivou vysazuji také názvy kapitol, podkapitol a oddílů, na které se v textu odkazuji. Texty, které si můžete přečíst na displeji, např. názvy polí v dialogových oknech či názvy příkazů v nabídkách, vysazuji tučným bezpatkovým písmem. Názvy souborů a internetové adresy vysazuji obyčejným bezpatkovým písmem. Texty programů a jejich částí vysazuji neproporcionálním písmem. Kromě částí textu, které považuji za důležité zvýraznit nebo alespoň odlišit od okolního textu, najdete v textu ještě řadu doplňujících poznámek a vysvětlivek. Všechny budou v jednotném rámečku, který bude označen ikonou charakterizující druh informace, kterou vám chce poznámka či vysvětlivka předat. Symbol jin-jang bude uvozovat poznámky, s nimiž se setkáte na počátku každé kapitoly. Zde vám vždy prozradím, co se v dané kapitole naučíte. Otevřená schránka s dopisy označuje informace o projektu, s nímž budeme v dalším textu pracovat, nebo v něm najdete vzorové řešení. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 27 z 651

28 28 Java 8 Úvod do objektové architektury pro mírně pokročilé Obrázek knihy označuje poznámku týkající se používané terminologie. Tato poznámka většinou upozorňuje na další používané termíny označující stejnou skutečnost nebo na konvence, které se k probírané problematice vztahují. Seznam všech terminologických poznámek najdete v rejstříku pod heslem terminologie. Obrázek počítače označuje zadání úkolu, který máte samostatně vypracovat. Seznam všech úloh najdete v rejstříku pod heslem úloha. Píšící ruka označuje obyčejnou poznámku, která pouze doplňuje informace z hlavního proudu výkladu o nějakou zajímavost. Ruka s hrozícím prstem upozorňuje na věci, které byste měli určitě vědět a na které byste si měli dát pozor, protože jejich zanedbání vás většinou dostane do problémů. Usměváček vás bude upozorňovat na různé tipy, kterými můžete vylepšit svůj program nebo zefektivnit svoji práci. Mračoun vás naopak bude upozorňovat na různá úskalí programovacího jazyka nebo programů, s nimiž budeme pracovat, a bude vám radit, jak se těmto nástrahám vyhnout či jak to zařídit, aby vám alespoň pokud možno nevadily. Brýle označují tzv. poznámky pro šťouraly, v nichž se vás snažím seznámit s některými zajímavými vlastnostmi probírané konstrukce nebo upozorňuji na některé souvislosti, jejichž znalost však není k pochopení látky nezbytná. Odbočka Občas je potřeba vysvětlit něco, co nezapadá přímo do okolního textu. V takových případech používám podšeděný blok se silnou čarou po straně. Tento podšeděný blok je takovou drobnou odbočkou od ostatního výkladu. Nadpis podšeděného bloku pak najdete i v podrobném obsahu mezi nečíslovanými nadpisy. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 28 z 651

29 Část I: Vývojové prostředí Část I: Vývojové prostředí Tato část vám nejprve připomene, co byste měli znát z prvního dílu, abyste mohli bez problémů pokračovat ve čtení knihy. Pak vás postupně seznámí s vývojovým prostředím NetBeans a jeho základními vlastnostmi, které by vám mohly pomoci výrazně zefektivnit vývoj programů. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 29 z 651

30 00 30 Java 8 Úvod do objektové architektury pro mírně pokročilé 1. Co byste měli znát z prvního dílu Kapitola 1 Co byste měli znát z prvního dílu Co se v kapitole naučíte V této kapitole si velmi stručně připomeneme, co jste se naučili v prvním dílu učebnice, a seznámím vás s několika termíny, které budeme v dalším textu používat. 1.1 Přehled látky prvního dílu V první verzi rukopisu této knihy jsem z minulého dílu převzal podkapitoly nazvané Shrnutí co jsme se naučili, v nichž jsem na konci každé kapitoly vždy stručně vyjmenoval, co se v dané lekci probíralo. Přitom jsem s údivem zjistil, že tento velmi zhuštěný přehled má přes 30 stránek. To mne zaskočilo. I když jsem jej prošel a vyjmul vše, co se týkalo jen BlueJ a projektů vytvářených v prvním dílu, stále mi ještě připadal na úvodní kapitolu příliš velký. Rozhodl jsem se proto, že původní text úvodní kapitoly vyjmu z učebnice, nepatrně jej upravím a vystavím v samostatném souboru na webových stránkách knihy, odkud si jej budou moci stáhnout a přečíst i ti, kteří první díl nečetli a rozhodli se začít rovnou tímto druhým dílem (zmíněný text najdete na stránce knihy). V dalším textu budu předpokládat, že vše, co je v onom stručném shrnutí uvedeno, již znáte a mohu na to plynule navázat. Pro jistotu ale ještě v následujících pasážích připomenu některé klíčové termíny, které jsem v prvním dílu zavedl a které nemusí být zcela srozumitelné těm, kteří získávali prvotní informace z jiných zdrojů než z prvního dílu. Zkušenost totiž ukazuje, že řada studentů tyto termíny zaměňuje, směšuje a/nebo je špatně 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 30 z 651

31 Kapitola 1: Co byste měli znát z prvního dílu 31 interpretuje. Stručný přehled klíčových termínů uvádím především proto, abyste v okamžiku, kdy narazíte na daný termín v textu, věděli, o čem hovořím. 1.2 Definice deklarace Než začneme s vlastním opakováním, chtěl bych připomenout dva obecné jazykové termíny, které si studenti občas pletou, a to termíny deklarace a definice: Deklarace je část kódu, v níž předem oznamujeme některé vlastnosti vytvářeného programu. Je to takové prohlášení. Účelem deklarace je poskytnout překladači informace, na jejichž základě pak může kontrolovat, jestli ve svém programu neděláte nějaké evidentní chyby. Definice je část kódu, v níž něco doopravdy vytváříme. Jedná-li se o metodu, opravdu se někde objeví předpis definující, jak metoda pracuje. Jedná-li se o objekt, necháváme mu přidělit paměť a přiřadit počáteční hodnotu. U datových objektů (proměnných a konstant) se často slučuje deklarace s definicí. Danou proměnnou deklarujeme (prozradíme, jaký bude mít datový typ a jak se bude jmenovat) a současně ji i definujeme (přiřadíme jí počáteční hodnotu, čímž donutíme překladač, aby pro ni vyhradil potřebnou paměť). Klasické abstraktní metody, s nimiž se setkáme v interfejsech, jsou zde pouze deklarovány. V deklaraci pouze překladači vysvětlujeme, jakou by měla mít požadovaná metoda signaturu, jaká by měla být, kdyby ji někdo definoval. Ve třídách jsme pak metody přímo definovali, protože jsme za hlavičkou metody zapisovali její tělo, v němž jsme popisovali, co má daná metoda dělat. V tomto dílu se dozvíte, že situace není tak jednoduchá, jak se původně zdálo, tj. že se v interfejsech metody deklarovaly a ve třídách definovaly. Dozvíte se, že ve třídě můžete deklarovat abstraktní metodu a naopak v interfejsu definovat konkrétní metodu. K tomu všemu postupně dojdeme. 1.3 Co je to objekt Vraťme se ale k objektovému programování. Říkali jsme si, že každý program je simulací reálného nebo virtuálního světa. Tento svět je tvořen objekty, které jsou v programu reprezentovány pojmenovanými daty. Jako objekt označujeme v programu kolekci dat reprezentující odpovídající objekt z onoho simulovaného světa. Oproti běžnému chápání objektů v reálném světě je však v programu používán termín objekt mnohem obecněji: objekty v programu mohou reprezentovat cokoliv, co můžeme pojmenovat, tj. cokoliv, co můžeme označit podstatným jménem. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 31 z 651

32 32 Java 8 Úvod do objektové architektury pro mírně pokročilé V programu proto chápeme jako objekty i vlastnosti (velikost, směr, krása), děje (připojení, přerušení, výpočet) a další pojmenovatelné entity. Objektem je proto i třída, rozhraní, metoda atd. Malá poznámka pro ty, kteří mají zkušenosti s jazyky Turbo Pacal a Delphi. Jejich autor nám přichystal malý terminologický guláš, protože to, co zbytek světa označuje termínem třída, začal nazývat objekt. Možná proto budete chvíli zmateni, ale věřím, že jenom chvíli. 1.4 Datový typ, třída, class-objekt V programech se vyskytují celé skupiny objektů, které mají stejnou charakteristiku. Tuto charakteristiku označujeme jako datový typ oněch objektů. Objekty s charakteristikou definovanou nějakým datovým typem označujeme jako instance daného datového typu. Datové typy lze rozdělit do několika skupin. Jazyk Java rozlišuje následující druhy datových typů: Primitivní datové typy představují typy, které nejsou objektové (nemají své instance), ale zato mají přímou podporu v instrukčním souboru většiny procesorů. Nabourávají čistou objektovou orientovanost jazyka a byly do něj zavedeny pro zvýšení efektivity. Prozatím se bez nich neobejdeme, ale to by se mělo v některé z příštích verzí změnit. Třídy představují základní druh objektového datového typu. Výčtové typy jsou speciální třídy, které mají pouze předem definované instance, přičemž tuto množinu instancí není možno dále měnit. Interfejsy představují datové typy reprezentující rozhraní instancí tříd, které tyto interfejsy implementují (podrobněji za chvíli). Datové typy jsou zvláštním druhem objektů. V jazyce Java nejsou (na rozdíl např. od jazyka Smalltalk) instancí žádného datového typu. Můžeme je však oslovovat prostřednictvím speciálních zástupných objektů, které jsou instancemi třídy java.lang.class (podrobněji se s nimi seznámíme v pasáži Třídy jako objekty class-objekt třídy na straně 123). 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 32 z 651

33 Kapitola 1: Co byste měli znát z prvního dílu Zpráva metoda, polymorfismus Objekty simulovaného světa spolu navzájem komunikují fyzikálně, chemicky, biologicky, verbálně, společensky atd. Veškeré tyto interakce reprezentujeme v programu jako zasílání zpráv jednoho objektu jinému. Zpráva Termínem zpráva označujeme požadavek, který zasílá jeden objekt druhému. Odesílatel zprávy přitom očekává od adresáta reakci odpovídající kontraktu dané zprávy (co je to kontrakt, si připomeneme za chvíli). Metoda Termínem metoda označujeme kód definující, jak bude daný objekt reagovat na zaslanou zprávu. Každá zpráva, na kterou umí objekt zareagovat, má přiřazenu metodu, v níž je definována požadovaná reakce objektu na zaslání dané zprávy. Některým zprávám ale může být přiřazeno více metod a to, která metoda se použije, záleží na různých věcech. Většina jazyků (a Java mezi nimi) odvozuje to, jaká metoda bude použita, od typu osloveného objektu; obecně to ale může záviset i na jiných věcech. Schopnost objektů reagovat na stejnou zprávu různě označujeme jako polymorfismus. Takové chování ale pouze reprezentuje stav v onom světě simulovaném naším programem. Představte si např. nějaký sportovní zápas. Všichni v hledišti jsou instance typu Člověk. Nicméně na zprávu o vstřeleném gólu budou instance podtypu FanoušekTýmuA reagovat jinak než instance podtypu FanoušekTýmuB a opět jinak budou reagovat instance podtypu ProdavačkaNaTribuně. 1.6 Rozhraní interfejs Pro ty, kteří nečetli minulý díl, bych připomněl, že v textu učebnice rozlišuji mezi termíny rozhraní a interfejs: Rozhraní představuje množinu charakteristik, jimiž se daná entita (balíček, třída, metoda, atribut, ) prezentuje svému okolí, a které tím pádem okolí o dané entitě explicitně zná. Své rozhraní má každá entita programu. Interfejs je programová konstrukce, kterou Java zavedla a kterou od ní mnohé další programovací jazyky převzaly. Díky interfejsu můžeme specifikovat požadavky na rozhraní objektů, s nimiž se chystáme pracovat. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 33 z 651

34 34 Java 8 Úvod do objektové architektury pro mírně pokročilé Některé programátory irituje, že používám počeštěnou podobu anglického interface. V tištěném textu však musíme dávat přednost spisovným tvarům před slangovými. Převzaté slovo interface nelze skloňovat, a proto dávám přednost povolenému (viz Akademický slovník cizích slov. Academia Praha ISBN ) počeštěnému tvaru. Ostatně počeštění tvaru často používaných převzatých slov je běžné podívejte se např. na slova fotbal, hokej či tenis. V minulém dílu jsem navíc využil toho, že interfejs sloužil opravdu jenom k popisu požadovaného rozhraní, a pokud jsem se domníval, že nemůže dojít k nedorozumění, používal jsem český termín rozhraní i při označování dané programové konstrukce. To už si v tomto dílu nemohu dovolit, protože v Javě 8 přestal interfejs pouze deklarovat požadované rozhraní. Java 8 totiž umožňuje, abychom v interfejsu definovali i doporučenou implementaci (viz kapitolu 14 Implicitní implementace RingVehicle, ControlledVehicle na straně 300), a navíc může obsahovat i definice statických metod. Protože se nyní významy obou termínů vzdálily, budu jejich terminologické rozdělení důsledně dodržovat. V souvislosti s rozhraním bych ještě připomněl další dva termíny: signatura a kontrakt: Signatura označuje tu část rozhraní, kterou může zkontrolovat překladač. Sem patří např. název dané entity, její datový typ (případně typ metod návratové hodnoty), u metod typy jednotlivých parametrů a některé další překladačem kontrolovatelné charakteristiky. Kontrakt označuje tu část rozhraní, kterou překladač zkontrolovat nedokáže např. že šířka obdélníku nesmí být záporná. Kontrakt popisujeme v dokumentačních komentářích a za jeho dodržení je zodpovědný programátor. Za prvé tak, že sám kontrakty dodržuje, a za druhé tak, že za běhu programu kontroluje, že je dodržují i používané objekty (s jednou ověřovací konstrukcí se seznámíme v podkapitole 9.15 Ověřování podmínek příkaz assert na straně 222). 1.7 Zapouzdření a skrývání implementace Vedle rozhraní má každá entita programu svoji implementaci, která specifikuje, jak daná entita dosahuje funkčnosti deklarované v jejím rozhraní. Jedna z hlavních zásad správného programování doporučuje programovat tak, abyste v každé situaci využívali pouze znalostí rozhraní používané entity a nesnažili se vylepšit program díky znalostem její implementace. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 34 z 651

35 Kapitola 1: Co byste měli znát z prvního dílu 35 Zásada se nejlépe dodržuje tak, že nemám šanci ji porušit. Proto moderní programovací jazyky umožňují maximálně skrývat implementační detaily. V souvislosti se skrýváním implementace se často hovoří o zapouzdření. Tímto termínem byla původně označována skutečnost, že objektové programování zapouzdřuje do společného objektu data i kód, který s těmito daty pracuje. Postupem času původní význam termínu zapouzdření ustupoval do pozadí a stále častěji se tímto termínem označovalo především skrývání implementace. Podvolím se tomuto všeobecnému trendu a budu jej v tomto významu používat i v této učebnici. 1.8 Datové typy a jejich dědění V minulém dílu jsme se seznámili s konstrukcí dědění datových typů. Vysvětlili jsme si, že datový typ potomka specifikuje společné vlastnosti nějaké speciální podmnožiny instancí předka, přičemž objekty z této podmnožiny mají oproti ostatním instancím předka jisté speciální vlastnosti, kvůli nimž je pro ně vhodné definovat samostatný datový typ. Současně jsem vám prozradil, že existují tři typy dědění: Přirozené (nativní) dědění hovoří o tom, jak specializaci objektů cítíme bez ohledu na to, jak ji naprogramujeme. Ve škole jsme se např. učili, že čtverec je speciální případ obdélníku. Vysvětlovali jsme si, kdy můžeme tuto obecnou znalost promítnout do našeho programu, a kdy si to naopak dovolit nemůžeme. Dědění typu odpovídá v programech dědění rozhraní. Toto dědění se uplatňuje nejen při dědění interfejsů, ale i při implementaci interfejsu třídou. Z hlediska dědění typů lze proto implementovaný interfejs považovat za jednoho z rodičů tříd, které jej implementují. Připomínám, že dědění typů je o slibech. Když datový typ prohlásí, že dědí nějaký jiný typ, tak překladač může zkontrolovat pouze to, jestli dodržuje požadovanou signaturu. Na zodpovědnosti programátora pak je, aby vedle signatury dodržel i kontrakt, a splnil tak slib, který dal, když přihlašoval datový typ k dědění jeho rodiče. Nedodržení tohoto slibu je příčinou celé řady chyb. Dědění implementace se uplatní při dědění tříd. Při něm třída od svého rodiče přebírá nejenom jeho rozhraní, ale překladač zabezpečí, že přebere také veškerou jeho implementaci. Nemusí tedy definovat pro všechno vlastní metody, ale v řadě případů může použít metodu zděděnou od svého rodiče či od některého z prarodičů. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 35 z 651

36 36 Java 8 Úvod do objektové architektury pro mírně pokročilé V dědění implementace jsou skryty mnohé záludnosti (na některé z nich jsem v minulém dílu upozorňoval), a proto jsem jeho výklad odložil až do tohoto dílu. Budeme o něm hovořit ve třetí části, kdy budete mít větší zkušenosti, které vám za prvé pomohou: odhalit situace, v nichž je použití dědění implementace nešikovné či přímo nevhodné (velmi oblíbená chyba, kterou dělají mnozí zdánlivě zkušení programátoři), orientovat se v situacích, kdy je použití dědění implementace výhodné, ale hrozí při něm riziko zanesení oblíbených chyb. Má-li být náš program stabilní a v budoucnu snadno rozšiřitelný, musíme při dědění vždy respektovat všechny tři aspekty. Vlastní instance třídy a mateřská třída objektu Abych usnadnil orientaci v příslušnosti objektu k datovým typům, zavedl jsem ještě další dva termíny: Vlastní instance třídy (anglicky class own instance) je instance, kterou porodila daná třída, a není proto instancí žádného z jejích potomků. Mateřská třída objektu (anglicky home class). Je-li objekt vlastní instancí nějaké třídy, označujeme tuto třídu jako mateřskou třídu daného objektu. LSP Liskov Substitution Principle Před chvílí jsem říkal, že odvozený typ specifikuje společné vlastnosti podmnožiny instancí předka. Z vlastnosti, že prvky podmnožiny nepřestávají být prvky původní množiny, vyplývá, že instance potomků nepřestávají být instancemi předka, a měly by proto být schopny kdykoliv vystupovat v roli instance kteréhokoliv ze svých předků. Zásadu, že potomek musí být schopen kdykoliv plnohodnotně vystupovat v roli instance předka, formulovala v roce 1987 ve své přednášce 2 Barbora Liskov a od té doby je označována jako Liskov Substitution Principle (Substituční princip Liskové) a používá se pro ni zkratka LSP. 2 Liskov, B Keynote address data abstraction and hierarchy. In Addendum To the Proceedings on Object-Oriented Programming Systems, Languages and Applications (Addendum) (Orlando, Florida, United States, October 04 08, 1987). L. Power and Z. Weiss, Eds. OOPSLA '87. ACM, New York, NY, DOI= 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 36 z 651

37 Kapitola 1: Co byste měli znát z prvního dílu 37 Bohužel, řada programátorů tuto zásadu ve svých programech porušuje, a pak se diví, proč jim jejich dokonalé programy nechodí. S příklady porušujícími tuto zásadu se bohužel setkáte i v přednáškách řady universit (včetně těch nejprestižnějších) o učebnicích a kurzech programování ani nemluvě. Přetěžování přebíjení zakrývání metod V souvislosti s děděním bych připomněl další tři termíny, které si začátečníci občas pletou, a to přetěžování, přebíjení a zakrývání metod. O přetěžování (anglicky overloading) metod hovoříme tehdy, definuje-li jeden datový typ několik metod se stejným názvem, ale rozdílnou signaturou. O přebíjení (anglicky overriding) nebo překrývání metod hovoříme tehdy, definuje-li potomek metodu se stejnou signaturou, jako má některá z viditelných metod rodiče. Potomkova verze metody je přitom začleněna do definice objektu tak, aby se použila pokaždé, když potomkovi někdo pošle příslušnou zprávu, a to nezávisle na tom, za instanci jakého typu se v danou chvíli potomek vydává. Přebíjení se budeme podrobněji věnovat v kapitole 24 Virtuální metody a jejich přebíjení na straně 515. O zakrývání (anglicky hiding) metod hovoříme tehdy, pokud potomek definuje metodu se stejnou signaturou, jako má některá z metod jeho rodiče, avšak rodičovská metoda zůstává dostupná a to, která z metod se použije, záleží na tom, komu se daná zpráva posílá. V Javě je možno zakrývat pouze statické metody. Instanční metody je možné pouze přetížit či přebít. Zakrývání se budeme podrobněji věnovat v kapitole 23 Zakrývání atributů a metod na straně 498. Překlad přebít přesněji odpovídá anglickému originálu, a proto mu budu dávat přednost. V minulém dílu jsem si to ještě netroufl a dal na námitky kolegů, že takový termín je příliš lidový a do odborné terminologie nepatří. Pak jsem si ale řekl, že nemusíme být tak úzkoprsí. Když mohou být lidové výrazy v angličtině, proč bychom je nemohli mít v češtině. Angličan či Američan klidně označí programový modul termínem podniková fazole (enterprise bean). Našim programátorům z takového označení naskakuje kopřivka. Pokud máte s takovýmito termíny mentální problémy, doporučuji vám počkat si na vydání anglické verze této učebnice. Tam budu sice používat tytéž výrazy, ale v anglickém textu takovéto termíny nikoho neuráží. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 37 z 651

38 38 Java 8 Úvod do objektové architektury pro mírně pokročilé 1.9 Odkazové a hodnotové datové typy Objektové datové typy rozdělujeme na odkazové a hodnotové podle toho, jak přistupujeme k posouzení ekvivalence dvou instancí. Instance hodnotových datových typů reprezentují nějakou hodnotu a jejich dvě instance považujeme za ekvivalentní, pokud obě reprezentují stejnou hodnotu. Naproti tomu instance odkazových datových typů reprezentují nějaké jedinečné entity a jsou ekvivalentní pouze samy se sebou. To, jestli je daný typ odkazový či hodnotový, poznáme snadno podle toho, definuje-li vlastní verzi metody equals(object). Odkazové datové typy se spokojí s verzí zděděnou od třídy objekt, která je definovaná tak, že (stejně jako operátor ==) vracejí true pouze v případě, kdy porovnáváme instanci samu se sebou. V opačném případě vracejí false. U odkazových datových typů bývá tato informace opravdu tím, na co se chceme zeptat. U hodnotových datových typů nás ale většinou nezajímá porovnání instancí, ale porovnání jimi reprezentovaných hodnot, a proto musejí přebít zděděnou verzi verzí vlastní. Tato poznámka je určena pro čtenáře, kteří mají zkušenosti s programováním v prostředí.net. Tam totiž zavádějí terminologický guláš, protože typy nerozlišují podle toho, zda reprezentují hodnotu, ale podle způsobu alokace jejich instancí v paměti. Jako hodnotové datové typy označují typy, které se nealokují na haldě, ale na zásobníku návratových adres. To ale obecně nemusí být hodnotové typy, protože nemusejí představovat žádnou hodnotu. Tyto typy bychom mohli označit spíše jako kopírované, protože se u nich přiřazení realizuje zkopírováním daného objektu, a ne zkopírováním pouhého odkazu Návrhové vzory V minulém dílu jsme se seznámili s několika návrhovými vzory. V tomto dílu k nim přidáme další. Připomenu, že návrhové vzory jsou programátorské ekvivalenty matematických vzorečků, v nichž místo čísel vystupují objekty a datové typy. Jsou to doporučení, jak vyřešit některé často se vyskytující úlohy. Zopakujme si alespoň ve stručnosti ty, které byste měli z minulého dílu znát (uvádím je v abecedním pořadí). Neznáte-li je, pokuste se před dalším čtením doplnit své znalosti. Jedináček (singleton) řeší problém třídy, která má mít právě jednu instanci 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 38 z 651

39 Kapitola 1: Co byste měli znát z prvního dílu 39 Jednoduchá tovární metoda (simple factory method) je statická metoda vracející jako svoji funkční hodnotu instanci třídy, v níž je definována. Odstraňuje některé nevýhody konstruktoru, a proto ji některé datové typy používají místo konstruktoru. Knihovní třída (library class, utility) je třída, která nemá žádné instanční členy. Definuje pouze statické konstanty a metody. Protože nepotřebuje instance, je definována tak, aby její instance nešlo vytvořit. Posluchač (listener) navrhuje efektivní řešení situace, kdy jeden či více objektů čeká na výskyt nějaké události (např. stisk tlačítka), aby na ni mohly zareagovat. Pozorovatel (observer) je pouze jiný název pro návrhový vzor Posluchač. Prázdný objekt (null object) představuje nesmyslnou instanci své mateřské třídy a používá se v situacích, kdy metoda nemůže vrátit žádnou platnou instanci. Mnohé metody vracejí v takových situacích prázdný odkaz (null), ale tomu se pak nedají posílat zprávy a tím se komplikuje okolní program. Alternativní způsob řešení tohoto problému si naznačíme v podkapitole 30.3 Datový typ Optional<T> na straně 639. Prototyp (prototype) nabízí alternativní způsob vytváření nových instancí jako kopií instancí již existujících. Prostředník (mediator) řeší problém přílišného množství vazeb mezi jednotlivými třídami zavedením prostředníka, který komunikaci mezi třídami či jejich instancemi zprostředkuje. Služebník (servant) řeší problém, jak dodat dodatečnou společnou funkcionalitu skupině tříd, aniž bychom museli do každé přidávat téměř shodnou metodu. Statická tovární metoda (static factory method) je pouze jiný název pro návrhový vzor Jednoduchá tovární metoda. Šablonová metoda (template method) doporučuje definovat v předku metodu i v případě, že je v ní potřeba použít činnosti, které budou definovat až potomci. Tyto činnosti se deklarují jako abstraktní metody s tím, že potomek je přebije vlastními, konkrétními metodami, které daná (šablonová) metoda předka použije. Výčtový typ (enumerated type, enumeration, enum, factor) je datový typ, jenž má předem dané instance, které není možno v průběhu programu přidat, ubrat ani změnit. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 39 z 651

40 40 Java 8 Úvod do objektové architektury pro mírně pokročilé 1.11 Modul komponenta knihovna framework Knihovny podprogramů se používají od začátku programování. S nástupem objektově orientovaného programování se zrodila i nová kategorie pomocných programů, pro které se vžilo označení framework. Paralelně se začalo hovořit o modulech a modulárním programování, které následně dospělo do vyšší etapy komponentového programování. Protože se s těmito termíny často setkáte (a to nejen v této učebnici) a protože v nich řada programátorů nemá zcela jasno, trochu je rozebereme. Modul Modul je logicky samostatná část programu určená k plnění dané funkce. Modul se snaží vyřešit vše sám a minimalizovat komunikaci s ostatními moduly s výjimkou případů, kdy některý z okolních modulů řeší nějakou jednodušší funkci, která je pro daný modul užitečná. Vzájemnou závislost modulů se ale snažíme minimalizovat. Modul se může sám skládat z podmodulů, které plní dílčí funkce většího modulu a které se zase snažíme navrhnout vzájemně nezávislé. Definice jazyka Java považuje za ekvivalenty klasických modulů balíčky. Programátoři, kteří přecházejí na objektové programování ze starších paradigmat (např. strukturované programování), často uvádějí jako příklady malých modulů i třídy (třída je podle nich modul obsahující sadu definic metod). Jenomže starší paradigmata neumožňovala s dostatečnou efektivitou vytvářet tak rozsáhlé programy, takže i granularita vnímání programátorů byla menší. Objektoví programátoři většinou považují za modul balíček či skupinu balíčků. Komponenta Komponenta je modul, který je možno použít samostatně, tj. nezávisle na aplikaci, pro niž původně vznikl. Komponenta má definované rozhraní a deklaruje požadavky na rozhraní komponent, s nimiž má spolupracovat. Se svým okolím komunikuje pouze prostřednictvím tohoto rozhraní. (Toto rozhraní nemusí(!) být definováno jako interfejs, i když v Javě tomu tak většinou bývá.) Důležitou vlastností komponenty je, že je nahraditelná jinou komponentou se stejným rozhraním a funkcionalitou, a to nejenom v době návrhu, ale i za běhu programu. V grafickém uživatelském rozhraní můžete např. vyměnit seznam položek za přepínač. Každá z těchto komponent vypadá jinak, ale jejich funkčnost je stejná. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 40 z 651

41 Kapitola 1: Co byste měli znát z prvního dílu 41 Další důležitou vlastností komponent je, že jsou do jisté míry schopny se přizpůsobit potřebám svého uživatele, aniž by bylo nutno dělat zásahy do jejich kódu. Jinými slovy: jsou konfigurovatelné. Zůstaňme u grafického uživatelského rozhraní, které mívá jako jednu ze svých komponent tlačítko. Tato komponenta je definovaná v samostatné knihovně. Nicméně je definovaná tak, že jí program může jednoduše zadat, jak má upravit svůj vzhled, jak má reagovat na stisk či přejetí myší apod. To vše bez zásahu do kódu komponenty. Jako příklad velice jednoduchých komponent jsou někdy uváděny třídy, resp. jejich instance. Instanci jedné třídy můžete nahradit instancí jiné třídy se stejným rozhraním. Současně ji můžete prostřednictvím přístupových metod do jisté míry konfigurovat, aniž byste museli měnit její kód. Knihovna Knihovnou je sada pasivních entit (pasivních proto, že čekají, až je někdo použije) určených k použití okolním programem. V dřívějších dobách byly těmito entitami procedury a funkce a později se jimi stávaly i moduly a případně i komponenty. Každý člen knihovny poskytuje nějakou službu, kterou lze využít. Organizace celého řešení je přitom zcela v rukou daného uživatele (uživatelem bývá většinou nějaký program). Jako příklad knihovny by mohl sloužit např. balíček util projektu, s nímž jsme pracovali v minulém dílu. Ten obsahoval několik tříd, jejichž služeb jsme mohli využít, aniž bychom se jim museli nějak významně přizpůsobovat. Framework Framework se podobá knihovně s několika speciálními vlastnostmi: Organizace řešení nespočívá na bedrech uživatele, ale využitím principu inverze závislosti (viz první díl, strana 165, podkapitola 8.8 Nová koncepce projektu) je vše v rukou frameworku, jemuž se musí jeho uživatel přizpůsobit. Framework má definované smysluplné implicitní chování. Framework není obecně modifikovatelný. Přesněji řečeno: veškeré požadavky na úpravu či rozšíření jeho funkčnosti by měly být realizovatelné bez zásahu do jeho kódu. Framework je ale rozšiřitelný. Jeho funkčnost lze rozšiřovat či upravovat přidáním vhodného kódu, který se požadovaným způsobem naváže na původní kód daného frameworku. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 41 z 651

42 42 Java 8 Úvod do objektové architektury pro mírně pokročilé Příkladem jednoduchého frameworku by mohl být správce plátna (v novém projektu instance třídy CanvasManager) spolu s instancemi spolupracujících tříd. Chtějí-li objekty využívat služeb správce plátna a býti zobrazovány v aplikačním okně, musí se mu přizpůsobit tím, že implementují interfejs IPaintable a přihlásí se do správy správce. Ten pak sám rozhodne, kdy se má ten který přihlášený objekt nakreslit. Framework má rozumné implicitní chování, i když po něm nic nechceme (CanvasManager zobrazí prázdné plátno). V minulém dílu jsme si navíc vyzkoušeli, že vhodnou definicí tříd implementujících požadované interfejsy lze dosáhnout zajímavých výsledků. Protože z jistého zorného úhlu není mezi knihovnou a frameworkem žádný podstatný rozdíl, nebudu v dalším textu tyto termíny úpěnlivě odlišovat a budu-li hovořit o knihovnách, bude se to vztahovat i na frameworky. Kdyby tomu tak nemělo být, výrazně na to upozorním Změny šablon V prvním dílu jsem zavedl šablony, které definovaly výchozí podobu vytvářených zdrojových souborů. Při práci se studenty a řešení jejich problémů ale časem vykrystalizoval jeden z důvodů, proč mají začátečníci často potíže s konstrukcemi týkajícími se atributů a metod třídy. Tímto důvodem je zaužívaný způsob zápisu zdrojových programů, při němž se do zdrojového kódu zapisují odděleně atributy a metody a v rámci jejich sekcí se pak definují zvlášť členy třídy a zvlášť členy instancí. To vede k promíchání částí zdrojového kódu definujících vlastnosti a schopnosti objektu třídy a vlastnosti a schopnosti jejích instancí. Se studenty jsme se shodli, že by pro ně bylo výhodnější (a srozumitelnější), kdybychom ve zdrojovém kódu napsali zvlášť vše, co se týká objektu třídy, a pak odděleně vše, co se týká instancí této třídy. Podle tohoto pravidla jsem proto upravil šablony pro všechny následující kurzy, a tím pádem i pro tuto knihu. Zdrojový kód prázdné třídy definované podle nové šablony si můžete prohlédnout ve výpisu 1.1. Jak se můžete přesvědčit, části věnované třídním atributům a metodám jsou v ní výrazně odděleny od částí věnovaných instančním atributům a metodám. Obě pak mají téměř shodnou strukturu. O interních datových typech, jimž je věnována poslední sekce nadepsaná NESTED DATA TYPES, jsme ještě nehovořili. Budeme se jim podrobně věnovat v kapitole 19 Interní datové typy na straně G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 42 z 651

43 Kapitola 1: Co byste měli znát z prvního dílu 43 Výpis 1.1: Prázdná třída vytvořená podle standardní šablony 1 /******************************************************************************* 2 * Instance třídy {@code ClassTemplate} představují 3 * 4 Rudolf PECINOVSKÝ yy-mm-dd 6 */ 7 public class ClassTemplate 8 { 9 //== CONSTANT CLASS ATTRIBUTES ================================================= 10 //== VARIABLE CLASS ATTRIBUTES ================================================= //############################################################################## 15 //== STATIC INITIALIZER (CLASS CONSTRUCTOR) ==================================== 16 //== CLASS GETTERS AND SETTERS ================================================= 17 //== OTHER NON-PRIVATE CLASS METHODS =========================================== 18 //== PRIVATE AND AUXILIARY CLASS METHODS ======================================= //############################################################################## 23 //== CONSTANT INSTANCE ATTRIBUTES ============================================== 24 //== VARIABLE INSTANCE ATTRIBUTES ============================================== //############################################################################## 29 //== CONSTUCTORS AND FACTORY METHODS =========================================== /*************************************************************************** 32 * 33 */ 34 public ClassTemplate() 35 { 36 } //== ABSTRACT METHODS ========================================================== 41 //== INSTANCE GETTERS AND SETTERS ============================================== 42 //== OTHER NON-PRIVATE INSTANCE METHODS ======================================== 43 //== PRIVATE AND AUXILIARY INSTANCE METHODS ==================================== //############################################################################## 48 //== NESTED DATA TYPES ========================================================= 49 } 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 43 z 651

44 44 Java 8 Úvod do objektové architektury pro mírně pokročilé Šablona interfejsů má také novou podobu. Tu vám ale prozatím neukážu, protože Java 8 výrazně rozšiřuje jejich dosavadní účel. Se šablonou interfejsů vás proto seznámím až v podkapitole 14.6 Šablona interfejsů na straně 306, kdy už budete potřebné novinky znát, a budete proto chápat význam jednotlivých jejích sekcí. Stejně tak si budete muset počkat na šablonu testovací třídy, protože v ní začneme používat jednu zajímavou pomocnou třídu. Šablonu testovací třídy vám proto představím až v podkapitole 7.3 Šablona testovací třídy na straně Knihovna CanvasManager V tomto dílu budeme dále pracovat s knihovnou CanvasManager, s níž jsme pracovali v minulém dílu. Budu přitom předpokládat, že knihovnu již znáte, takže se na její třídy budu poměrně často odvolávat. Ti, kteří nečetli minulý díl, anebo již vlastnosti jejích jednotlivých tříd zapomněli, najdou potřebné informace v její programátorské dokumentaci, která je součástí stejnojmenného projektu Shrnutí co jsme se naučili Přehled předpokládaných znalostí, které budete při studiu této knihy potřebovat, najdete na stránce knihy v samostatném souboru. Deklarace je část kódu, v níž předem oznamujeme některé vlastnosti vytvářeného programu. Definice je část kódu, v níž něco doopravdy vytváříme. Každý program je simulací reálného nebo virtuálního světa. Jako objekt označujeme v programu kolekci dat reprezentující odpovídající skutečnost z onoho simulovaného světa. Objekty v programu mohou reprezentovat cokoliv, co můžeme pojmenovat, tj. cokoliv, co můžeme označit podstatným jménem. Termínem zpráva označujeme požadavek, který zasílá jeden objekt druhému. Odesílatel zprávy přitom očekává od adresáta reakci odpovídající kontraktu dané zprávy. Termínem metoda označujeme kód definující, jak bude daný objekt reagovat na zaslanou zprávu. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 44 z 651

45 Kapitola 1: Co byste měli znát z prvního dílu 45 Některým zprávám je přiřazeno více metod, mezi nimiž si oslovený objekt může vybrat. Schopnost objektů reagovat na stejnou zprávu různě označujeme jako polymorfismus. V knize budu důsledně odlišovat termíny rozhraní jako obecnou vlastnost libovolné entity v programu a interfejs jako označení programové konstrukce specifikující požadované rozhraní, a případně i doporučující implicitní implementaci. Interfejsy představují datové typy reprezentující rozhraní instancí tříd, které tyto interfejsy implementují. Modul je logicky samostatná část programu určená k plnění dané funkce. Modul se může sám skládat z podmodulů. Komponenta je modul, který je možno použít samostatně. Komponenta by měla být nahraditelná jinou komponentou se stejným rozhraním a funkcionalitou. Komponenty jsou konfigurovatelné, jejich funkcionalitu je možné do jisté míry upravovat bez zásahu do jejich kódu. Knihovna je sada pasivních entit určených k použití okolním programem. Framework je knihovna se speciálními vlastnostmi: Použitím principu inverze závislosti přebírá framework řízení chování programu. Má definované smysluplné implicitní chování. Není modifikovatelný, ale je rozšiřitelný. Oproti předchozímu dílu se změnilo pořadí sekcí standardní šablony; nyní je v ní pohromadě veškerý kód týkající se třídy, který je konstruktory a továrními metodami oddělen od kódu týkajícího se instancí. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 45 z 651

46 00 46 Java 8 Úvod do objektové architektury pro mírně pokročilé 2. Vývojové prostředí NetBeans Kapitola 2 Vývojové prostředí NetBeans Co se v kapitole naučíte Seznámíte se s profesionálním vývojovým prostředím NetBeans. Nejprve vám ukážu, jak se instaluje. Potom v něm otevřeme existující projekt a předvedeme si, jak se pracuje s panely. Ve zbytku kapitoly vám budu vysvětlovat, jak upravit konfiguraci prostředí podle potřeby. Při té příležitosti se dozvíte řadu informací o jeho vlastnostech. V této kapitole si po instalaci prostředí otevřeme projekt N202a_Library (ten si stáhnete prostřednictvím generátoru, o němž jsem mluvil v úvodu), na němž si předvedeme některé základní vlastnosti vývojového prostředí. V minulém dílu jsme pracovali ve vývojovém prostředí BlueJ. Řekli jsme si, že patří mezi nejjednodušší IDE, což je zkratka z anglického Integrated Development Environment integrované vývojové prostředí, přičemž adjektivum integrovaný označuje, že daný program integruje více nástrojů dohromady editor, překladač, ladící program a řadu dalších. Prostředí BlueJ je optimalizované na výuku a na to, aby se s jeho pomocí studenti naučili přemýšlet objektově. Pro tvorbu složitějších programů to však není optimální volba pro tu je vhodné použít některé z profesionálních IDE. Pro vývoj programů v jazyce Java se nejvíce používají tři prostředí: Eclipse, IntelliJ IDEA a NetBeans. Tato prostředí jsou si vzájemně velmi podobná, a jakmile přijde některé z nich se zajímavou novinkou, zanedlouho ji do svého repertoáru začlení i ta ostatní. Zkušenost ale ukázala, že pro výuku je nejvhodnější poslední z nich, protože předchozí dvě nenabízejí některé funkce, které při tvorbě a následné demonstraci výukových programů využívám. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 46 z 651

47 Kapitola 2: Vývojové prostředí NetBeans 47 Jak jsem již ale řekl v úvodu, zvládnutí profesionálního vývojového prostředí je zhruba stejně náročné jako zvládnutí programovacího jazyka. Proto bude zbytek první části věnován seznámení se základními vlastnostmi NetBeans. Můžete samozřejmě dát přednost jinému IDE, ale základní popisované principy budou u všech velmi podobné. Bude se jen maličko lišit jejich ovládání a některé další detaily. 2.1 Instalace Vývojové prostředí NetBeans je profesionální vývojové prostředí, které je k dispozici zdarma. Můžete si je stáhnout z jeho stránek. 1. Otevřete stránku a stiskněte tlačítko Download umístěné vpravo pod názvem produktu (viz obrázek 2.1). Obrázek 2.1 Domovská stránka produktu NetBeans 2. Otevře se stahovací stránka, na které si budete moci vybrat jazyk lokalizace staženého prostředí (k dispozici je angličtina, japonština, čínština, portugalština a ruština) a operační systém (na obrázku 2.2 je tato nabídka rozbalená). V seznamu dostupných operačních systémů bych rád upozornil na poslední položku (na obrázku je zvýrazněna), která umožní stáhnout ZIP, jenž můžete rozbalit a spustit kdekoliv. Musíte se však smířit s tím, že tento instalační soubor je, oproti instalaci pro konkrétní operační systém o 70 až 87 MB větší (záleží na tom, který z nabízených systémů berete jako referenční) a některé drobnosti (např. instalaci knihovny JUnit) musíte realizovat ručně. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 47 z 651

48 48 Java 8 Úvod do objektové architektury pro mírně pokročilé Obrázek 2.2 Stránka, na níž si vybíráte možné konfigurace instalovaného programu 3. Když už jste si vybrali jazyk a operační systém, musíte ještě zvolit, jakou instalační sadu chcete stáhnout, přičemž u každé z nabízených sad hned vidíte, co vše je příslušná sada schopna podporovat (viz obrázek 2.2) a jak velký je její instalační soubor. (Jak jistě sami odhadnete, pro náš kurz bude stačit ta nejjednodušší, cca 90MB verze.) Stiskněte proto tlačítko pod vybraným sloupcem. 4. Zadaná instalační sada se stáhne do vašeho počítače. Kam, to záleží na nastavení vašeho prohlížeče. Instalace pro Windows V dalším výkladu budu pokračovat popisem instalace pro Windows, protože tento operační systém používá přes 80 % studentů a účastníků mých kurzů. Ti z vás, kteří si stáhli onen univerzální ZIP, mohou výklad přeskočit, ti, kteří budou instalovat pod jiným operačním systémem, mi musejí odpustit případné odchylky. Takže pokračujeme: 5. Spusťte stažený instalační soubor. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 48 z 651

49 Kapitola 2: Vývojové prostředí NetBeans Program zanalyzuje váš počítač, a bude-li vše v pořádku, otevře okno instalátoru, v němž vám oznámí, co se chystáte instalovat a kolik diskového prostoru k tomu budete potřebovat. Stiskněte Next>. 7. Otevře se okno s licenčním ujednáním. Přečtěte si je, zaškrtněte políčko označující souhlas (předpokládám, že budete ochotni toto ujednání akceptovat) a stiskněte Next>. 8. Objeví se další okno s licenčním ujednáním tentokrát na knihovnu JUnit, s níž jsme se již seznámili v minulém dílu. Tentokrát si budete moci vybrat, zda chcete knihovnu instalovat. V knize předpokládám, že nastavíte horní položku přepínače, čímž oznamujete, že licenční ujednání akceptujete a knihovna se smí instalovat. Nastavte ji a stiskněte Next>. 9. Otevře se okno se dvěma vstupními poli: v horním zadáváte, kam chcete NetBeans instalovat, v dolním oznamujete, kde je instalovaná verze Javy (přesněji JDK), pod kterou budete NetBeans spouštět. Obě políčka jsou předvyplněná. Nechce-li se vám přemýšlet nad umístěním programu, můžete rovnou jít dál. Jak už jsem ale říkal v minulém dílu, já jsem se rozhodl všechny programy v Javě umísťovat do složky Java v kořenové složce mého systémového disku. Oddělí se tak programy spouštěné přímo nad platformou mého operačního systému od programů spouštěných nad platformou Java. Rozhodnutí nechám na vás. Poté, co zadáte obě umístění, stiskněte tlačítko Next>. 10. Otevře se závěrečné okno průvodce instalací, v němž vám instalátor oznamuje, kam bude NetBeans instalovat, že se knihovna JUnit nainstaluje po prvním spuštění, že se budou automaticky zjišťovat případné aktualizace a kolik celá instalace zabere místa na disku. V tuto chvíli máte poslední šanci se stiskem tlačítka <Back vrátit do některého z předchozích oken a opravit svoje zadání. Jste-li se zadáním spokojeni, stiskněte tlačítko Install. 11. Otevře se instalační okno, v němž vás bude program průběžně informovat o aktuálně instalovaných souborech a o tom, jak je s instalací daleko. Pro případ, že byste si to s instalací rozmysleli, je připraveno tlačítko Cancel, ale předpokládám, že necháte instalaci doběhnout do konce. 12. Po skončení instalace se otevře ukončovací okno, v němž vám instalátor oznamuje, že instalaci úspěšně dokončil, a současně vám prozradí, jak lze program spustit. Zároveň zde najdete zaškrtávací políčko, jehož zaškrtnutím souhlasíte s tím, aby program posílal vývojovému týmu stručné anonymní informace o používaných funkcích, které budou podkladem pro rozhodnutí, o co by mohla být vylepšena příští verze. Já je zaškrtávám, ale vy se můžete rozhodnout jinak. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 49 z 651

50 50 Java 8 Úvod do objektové architektury pro mírně pokročilé 2.2 První spuštění Po spuštění programu chvíli uvidíte startovací okno, které u svého spodního okraje zobrazuje, jak je natahování programu daleko. Po několika vteřinách (nebo desítkách vteřin záleží na rychlosti počítače a použitých disků) se otevře aplikační okno se startovní stránkou Start Page, která má tři karty (viz obrázek 2.3). Obrázek 2.3 Uvítací stránka aplikačního okna Karta Learn & Discover obsahuje hypertextové odkazy na stránky s nejrůznějšími tutoriály, návody, ukázkovými příklady a dalšími informacemi, z nichž byste se mohli poučit. Prostřední karta My NetBeans teď bude téměř prázdná, ale až začnete NetBeans používat, bude zobrazovat seznam naposledy otevřených projektů a instalovaných pluginů. Poslední karta What s New nabízí seznam posledních článků o NetBeans. Najdete zde odkazy na zprávy, tutoriály i různé blogy. Odkazy na této stránce vedou k informacím různých úrovní některé jsou vhodné i pro začátečníky, jiné předpokládají jisté znalosti a zkušenosti. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 50 z 651

51 Kapitola 2: Vývojové prostředí NetBeans 51 Hlavní nevýhodou všech těchto výukových a informačních textů je (alespoň pro některé) to, že jsou všechny anglicky. Jak už jsem ale říkal v úvodu, slušně programovat se bez znalosti angličtiny nedá. Na stránce je v pravém horním rohu připravené zaškrtávací políčko Show On Startup (na obrázku 2.3 na něj ukazuje kurzor myši), jehož odzaškrtnutím oznámíte, že se při příštím startu stránka nemá zobrazovat. Kdybyste si to později rozmysleli a chtěli tuto stránku opět zobrazit, stačí v nabídce Help zadat příkaz Start Page a stránka se okamžitě zobrazí. My ale teď na nějakou dobu oželíme její dobrodiní. Zrušte proto zaškrtnutí políčka Show On Startup a startovní stránku zavřete. 2.3 Aplikační okno, panely a karty Po zavření startovní stránky se objeví prázdné aplikační okno (zmenšené je na obrázku 2.4) rozdělené na dva panely. Pravý z nich je prázdný, kdežto levý uchovává tři karty 3 se záložkami v záhlaví. Pravá záložka reprezentuje kartu Services. Tu využijí až pokročilí vývojáři, takže ji nebudeme v průběhu celého kurzu potřebovat, a můžeme ji proto zavřít. Před tím si ale vyzkoušíme, co vše můžeme s takovou kartou dělat. Obrázek 2.4 Zavření karty Services v levém panelu aplikačního okna Najeďte myší na její záložku a uchopte ji. (Pozor ale, abyste ji místo toho klepnutím na zavírací ikonu nezavřeli, jak se k tomu chystá myš na obrázku 2.4.) Když nyní popojedete s myší, bude ji karta poslušně následovat. Jak s ní budete jezdit 3 Nabídky, dokumentace i nápověda hovoří sice o oknech, ale pak musíte říkat, že v okně je okno se záložkou a jiná podivná tvrzení. S kartami bude výklad srozumitelnější. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 51 z 651

52 52 Java 8 Úvod do objektové architektury pro mírně pokročilé po aplikačním okně, tak se budou na různých místech objevovat červené rámečky, které budou naznačovat, kam by se karta usadila, kdybyste ji v daném okamžiku pustili (viz obrázek 2.5). Obrázek 2.5 Přesun okna Services do alternativního umístění Při popojíždění může nastat několik situací: Přejedete-li s myší k okraji nějakého panelu (je jedno, jestli to bude panel, v němž se okno nachází, nebo nějaký jiný), zobrazí se obdélníkový rámeček obdobný tomu, který vidíte na obrázku 2.5, kde jsem s ním přejel až do sousedního panelu. Pak se panel, v němž se právě nacházíte, rozdělí na dva a část naznačenou rámečkem zabere nový panel, do něhož bude umístěna přesouvaná karta. Přejedete-li s myší do oblasti záložek, zobrazí se zubatý rámeček naznačující záložku. Pak karta zůstane ve stejném panelu, jenom její záložka bude mezi záložkami daného panelu na jiném místě. Odjedete-li myší mimo aplikační okno, otevře se pro ni nové okno. Do tohoto okna se umístí naše karta se záložkou. K ní pak můžete v budoucnu přidávat i další karty. Okno už ale nepůjde rozdělit na několik panelů. Této možnosti můžete využít, používáte-li počítač s několika monitory. Na každém monitoru pak můžete mít jedno či více oken a v nich libovolné množství karet. Já to využívám zejména při ladění. Až si o něm budeme povídat, tak vám to připomenu. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 52 z 651

53 Kapitola 2: Vývojové prostředí NetBeans 53 Změny rozměrů panelů Vyzkoušejte si různé možnosti umisťování karty. Při té příležitosti si vyzkoušejte, že vzájemnou velikost panelů můžete změnit tak, že myší najedete na dělící hranu, uchopíte ji a přesunete. To platí jak pro panely umístěné vedle sebe, tak pro panely umístěné nad sebou. Minimalizace a obnovení panelů a karet Občas se stane, že nám zrovna nějaký z panelů u okraje plátna překáží a potřebovali bychom mít k dispozici místo, které zabírá. Jednou z možností, jak takovouto situaci řešit, je změnit rozměr daného panelu, jak jsme si říkali před chvílí. Druhou možností je panel dočasně (nebo i trvale) minimalizovat. Na obrázku 2.5 jste si jistě všimli, že vpravo vedle karty Services je připravené minimalizační tlačítko. Pokud je stisknete, panel zaparkuje do okraje aplikačního okna, u kterého právě sídlí. Záložky karet se seřadí podél daného okraje. Klepnutím na kteroukoliv z nich příslušnou kartu rozbalíte a dalším klepnutím ji opět sbalíte. Obrázek 2.6 Znovuotevření zaparkovaného panelu Vedle záložek se současně objeví obnovovací tlačítko (viz obrázek 2.6). Když na ně klepnete, panel zaujme svoji původní pozici i rozměr a záložky karet z tohoto panelu se opět vrátí do jeho záhlaví. Další možnosti Panely nabízejí ještě další možnosti uspořádání, o nichž jsem nehovořil. Nechtěl jsem vás totiž zbytečně zdržovat, protože vím, že už se nemůžete dočkat, až začneme opět programovat. Probral jsem proto zrychleně pouze ty možnosti, které budeme za chvíli potřebovat. Koho další možnosti zajímají, tak na ně při troše experimentování jistě přijde. Vše si vyzkoušejte a až si dostatečně pohrajete, tak kartu Services zavřete. 2.4 Otevření existujícího projektu Obdobně jako v BlueJ, i v NetBeans jsou vyvíjené programy uspořádány do projektů. Jeden program může být rozdělen do několika projektů, aby na něm mohlo snáze pracovat několik vývojářů. Nicméně součástí NetBeans jsou i nástroje, které umožnují dostatečně efektivní práci několika vývojářů na jediném projektu. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 53 z 651

54 54 Java 8 Úvod do objektové architektury pro mírně pokročilé Otevřeme svůj první projekt v NetBeans. Abychom se nejprve dozvěděli něco o NetBeans, nebudeme otevírat nový, prázdný projekt, v němž bychom museli teprve definovat jeho programy (i na to časem dojde), ale otevřeme předpřipravený projekt s funkčním programem. Postupně se seznámíme s jeho součástmi a ukážeme si, jaké výhodné funkce pro práci nám NetBeans nabízejí. Pojďme tedy na to. Předpokládám, že jste již spustili generátor a na zvolené místo uložili jeho projekty (pro tuto kapitolu bude stačit, budete-li mít uložený projekt N202a_Library). Existující projekt otevřete buď klepnutím na ikonu Open Project (standardně je umístěna jako třetí zleva viz obrázek 2.7), nebo zadáním příkazu File Open Project, anebo stiskem klávesové zkratky CTRL+SHIFT+O. Obrázek 2.7 Žádost o otevření existujícího projektu NetBeans otevřou dialogové okno pro otevření existujícího projektu (viz obrázek 2.8). V něm buďto zadáte do vstupního pole File name cestu ke složce s projektem, anebo tuto složku najdete prostřednictvím polí panelu se stromem složek. Ve stromu složek poznáte složku s projektem podle ikony představující šálek kávy. Vyberte složku s projektem N202a_Library a své zadání potvrďte stiskem tlačítka Open Project. Obrázek 2.8 Dialogové okno pro otevření existujícího projektu 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 54 z 651

55 Kapitola 2: Vývojové prostředí NetBeans 55 V NetBeans se na kartě projektů objeví položka s právě otevřeným projektem. Pod panelem s kartou projektů se narodí další panel. V něm bude jediná karta, jejíž záložka nám prozradí, že se jedná o kartu navigátoru (za chvíli si prozradíme, co to znamená). Toto uspořádání (tj. panel s kartou navigátoru pod panelem s kartou projektů) přetrvává z dob, kdy byly ještě používány monitory s poměrem stran 4:3. Protože předpokládám, že již používáte širokoúhlý monitor, doporučím vám uspořádání, které považuji za výhodnější: uchopte kartu navigátoru, a způsobem, který jste si před chvílí zkoušeli s kartou Services, ji přesuňte (a s ní i její panel) zcela vpravo, aby mezi jejím panelem a panelem s projekty zůstalo ještě volné místo (viz obrázek 2.9) tam budeme za chvíli otevírat okna editoru. Než se pustíme do analýzy struktury projektu, chtěl bych vás upozornit na jeden rozdíl oproti tomu, na co jste byli zvyklí v předchozím dílu. Prostředí BlueJ, s nímž jsme pracovali v předchozím dílu, umísťovalo všechny soubory do jedné složky. Profesionální vývojová prostředí umožňují umístění souborů do více složek a sama pak implicitně nastavují samostatný strom složek pro zdrojové soubory vlastní aplikace a další pro zdrojové soubory testů. K tomuto rozdělení se ještě několikrát vrátíme. Vraťme se ke kartě projektů. Položka s projektem je prozatím sbalená. Když ji rozbalíte, najdete v ní několik složek: Složka Source Packages obsahuje zdrojové soubory daného projektu. Rozbalíte-li ji, najdete v ní tři podsložky odpovídající třem balíčkům (viz obrázek 2.9). Obrázek 2.9 Rozbalování projektu v panelu projektů 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 55 z 651

56 56 Java 8 Úvod do objektové architektury pro mírně pokročilé Složka Test Packages obsahuje testovací soubory projektu. Rozbalíte-li ji, najdete v ní jedinou podsložku odpovídající balíčku s testovacími třídami. Složka Libraries obsahuje seznam odkazů na potřebné knihovny, frameworky a jiné projekty, které daný projekt potřebuje ke své práci. Rozbalíte-li ji, najdete v ní jedinou podsložku odpovídající standardní knihovně. Tu můžete dále rozbalovat a analyzovat její jednotlivé součásti, ale já budu prozatím tuto možnost ignorovat a její analýzu ponechám vaší soukromé iniciativě. Složka Test Libraries obsahuje doplňkový seznam knihoven, frameworků a pomocných projektů potřebných pro funkci testů. Rozbalíte-li ji, najdete v ní jedinou podsložku odpovídající testovací knihovně (frameworku) JUnit, kterou jsme využívali již v minulém dílu, i když to prostředí BlueJ veřejně nijak neinzerovalo. Pojďme se věnovat zdrojovým souborům projektu. Rozbalíte-li ve složce Source Packages druhou podsložku odpovídající balíčku cz.pecinovsky.util, najdete v ní jednotlivé zdrojové soubory daného balíčku. Klepnutím na položku požádáte panel navigátoru o zobrazení struktury daného souboru. Navigátor zobrazí definované třídy, atributy a metody tak, jak to ukazuje obrázek Poklepáním na položku zdrojového souboru nebo zadáním příkazu Open v její místní nabídce otevřete v panelu editoru kartu se zdrojovým kódem tohoto souboru. Obrázek 2.10 Zobrazení obsahu souboru v panelu navigátoru 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 56 z 651

57 Kapitola 2: Vývojové prostředí NetBeans Navigátor a jeho ikony Vraťme se ale k seznamu definovaných typů, metod a atributů zobrazovanému v panelu navigátoru. Protože u některých tříd je těchto položek opravdu požehnaně, umožňují ikony pod seznamem ovlivnit, co vše se bude zobrazovat. Význam jednotlivých tlačítek je následující: Show inherited members Zobrazování zděděných členů Show fields Zobrazování atributů Show static members Zobrazování statických členů Show non-public members Zobrazování neveřejných členů (není-li stisknuto, zobrazují se pouze členy s modifikátorem přístupu public). Show inner classes Zobrazování interních typových členů (budeme je probírat v kapitole 19 Interní datové typy na straně 397). Show Fully Qualified Names Zobrazování názvů tříd s úplnou kvalifikací Sort by Name Členy jsou seřazeny dle abecedy Sort by Source Členy jsou seřazeny stejně jako ve zdrojovém kódu Poklepáním na položku v navigátoru se v panelu editoru zobrazí zdrojový kód s touto položkou. Pokud se ještě zdrojový kód nezobrazoval, otevře se jeho karta. 2.6 Úprava nastavení prostředí Vítězně jsme se tedy dvěma způsoby probojovali ke zdrojovým souborům. Než si ale začneme vyprávět o práci s nimi, naučím vás, jak nastavovat některé vlastnosti vývojového prostředí NetBeans. Při té příležitosti se dozvíte o jeho vlastnostech a funkcích i řadu informací, které se vám budou při práci hodit. Nebudu vám ale vysvětlovat všechny možnosti, které si můžete v NetBeans nastavit to bychom se pak už v knize nedostali k ničemu jinému. Seznámím vás s několika nastaveními, která mohou být užitečná i začátečníkům. Zadejte proto příkaz Tools Options, a otevřete tak dialogové okno (viz obrázek 2.11), s jehož pomocí můžete vlastnosti vývojového prostředí přizpůsobit svým požadavkům a potřebám. Okno pro nastavování vlastností prostředí nabízí nastavení pro osm oblastí reprezentovaných ikonami v horním řádku. Pojďme si je postupně probrat. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 57 z 651

58 58 Java 8 Úvod do objektové architektury pro mírně pokročilé Obrázek 2.11 Dialogové okno pro nastavování vlastností prostředí 2.7 General obecná nastavení Pro obecná nastavení (ikona General aktivovaná na obrázku 2.11) toho tu moc není. Nastavení internetového prohlížeče v seznamu Web Browser se uplatní při prohlížení vygenerované dokumentace API. Nechcete-li používat jiný než implicitně nastavený prohlížeč vašeho systému, můžete je ignorovat. Zaškrtávací políčko Usage Statistics umožňuje dodatečně změnit vaše rozhodnutí o zasílání anonymních statistik vaší činnosti, o kterém jsme již hovořili v pasáži o instalaci NetBeans. Zajímavá by pro vás mohla být tlačítka Export a Import. Ta umožňují uložit vaše aktuální nastavení do ZIP souboru (Export), resp. načíst obdržené nastavení (Import), a přizpůsobit tak svoje prostředí podle vzoru toho, kdo pro vás své nastavení exportoval. Připravil jsem pro vás soubor s některými svými nastaveními, která by se vám mohla hodit. Projdeme si nejprve, co vše by mohlo být užitečné nastavit. Na konci vám pak v podkapitole 2.16 Export a import nastavení na straně 72 ukážu, jak můžete importovat nastavení, která chcete převzít. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 58 z 651

59 Kapitola 2: Vývojové prostředí NetBeans Editor nastavení editoru V oblasti Editor je k dispozici deset karet. Většinou je již nebudu zobrazovat to si můžete udělat na počítači sami. Pouze vás seznámím s nejdůležitějšími možnostmi, které si na nich můžete nastavit. Karta General Na kartě obecných nastavení editoru najdete tři sekce: Braces Matching Zaškrtnutím políčka Show outline požadujete, aby se po vybrání závorky zvýraznila i její párová závorka a snáze jste tak odhalili, jestli máte závorky správně spárované, a pokud ne, tak která vám chybí či přebývá. Zaškrtnutím políčka Show tooltips si objednáváte chování editoru pro případ, kdy je otevírací závorka bloku, v němž se právě nacházíte, mimo zobrazovanou oblast zdrojového textu. Při zaškrtnutí tohoto pole se v takovém případě u horního okraje okna editoru zobrazí začátek aktuálního bloku jako nápověda (tool tip). Camel Case Behavior Zaškrtnutím políčka v této sekci aktivujete příjemnou vlastnost, kterou bychom mohli v překladu označit jako velbloudí vyhledávání. Kdykoliv potřebujete zadat v programu nějaký identifikátor, stačí zapsat první písmeno a pokračovat jenom velkými písmeny daného identifikátoru. Editor vám pak nabídne seznam identifikátorů, které lze na daném místě použít a jejichž velbloudí notace odpovídá zadané. Budete-li chtít zadat identifikátor metodasezvláštnímnázvem, stačí zadat mszn a seznam nabídnutých identifikátorů již bude pravděpodobně obsahovat pouze tuto metodu. Znaky samozřejmě nemusíte zadat všechny tak, jak je budete postupně doplňovat, bude se seznam zkracovat. Search Poslední sekce umožňuje nastavit, jak bude editor při vyhledávání reagovat na stisk klávesy ENTER. Můžete buď přejít k dalšímu výskytu (Enter to find next), nebo ukončit vyhledávání (Enter to finish search). 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 59 z 651

60 60 Java 8 Úvod do objektové architektury pro mírně pokročilé Karta Folding Termínem Code Folding se označuje skrývání (nebo chcete-li sbalení) částí kódu. Na této kartě nastavujete, zda mají NetBeans tuto možnost podporovat (Enable Code Folding doporučuji zaškrtnout) a které části kódu mají být po otevření souboru skryté (sbalené) doporučuji žádné, jak je to v implicitním nastavení. Zobrazení a skrytí částí kódu můžete měnit kdykoliv během editace. Na obrázku 2.12 vidíte výsek programu se dvěma metodami. U první je jak komentář, tak tělo metody zobrazené, u druhé je skryté. Zobrazení či skrytí změníte klepnutím na značku vedle dotyčného kódu, jak to ukazuje kurzorová šipka na obrázku. Kromě toho můžete změnit sbalení všech sekcí daného Obrázek 2.12 Zobrazování a skrývání částí kódu druhu v celém zdrojovém kódu zadáním příslušného povelu v podnabídce Code Folds nabídky View. Karta Formatting Tato karta umožňuje zadat vaše preference při formátování zdrojového kódu. Popisem možností této karty bych zaplnil klidně dalších 20 stránek, takže opravdu jen ve stručnosti. Již v základní konfiguraci, kterou jsme instalovali, nabízí rozbalovací seznam Language pět možností: společné nastavení All Languages a vedle něj pak nastavení pro Javu, JavaScript, JSON a HTML. Nastavení pro Javu je velmi košaté a detailní. Nebudu je zde rozebírat, koho zajímá, může si je proklikat sám a podívat se, co vše se dá pro formátování zdrojových kódů Javy nastavit. Já se tu podrobněji zmíním pouze o společném nastavení, v němž můžete zadat jen zpracování tabulátorů a zalamování řádků. Určitě bych vám doporučoval zaškrtnout políčko Expand Tabs to Spaces, čímž zabezpečíte, že všechny zadané tabulátory budou převedeny na mezery. V opačném případě se totiž může stát, že když otevřete zdrojový kód v jiném editoru, bude zcela jinak zalomen a bude obtížnější se v něm vyznat. Velikost odsazení po stisku tabulátoru radím ponechat na standardních 4 znacích. Vzdálenost tabulačních zarážek při použití znaků tabulátoru zadávám většinou větší (místo 8 znaků třeba 16), aby se případné zapomenuté tabulátory v cizích kódech co nejmarkantněji projevily a mohl jsem je odstranit. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 60 z 651

61 Kapitola 2: Vývojové prostředí NetBeans 61 Nastavení pravého okraje zadávaného v poli Right Margin, které specifikuje, kde se bude v kódu naznačovat, že by řádek už měl skončit, doporučuji nechat na standardních 80 znacích. Dlouhé řádky jsou známkou nedbale psaného kódu. Někdo svoji neochotu řízeně zalamovat řádky maskuje nastavením automatického zalamování řádků po dosažení pravého okraje, které se zadává v seznamu Line Wrap. Můžete zadat, že chcete řádek zalomit kdekoliv (Anywhere), anebo jen mezi slovy (After words). Já však preferuji automatické zalamování vypnuté (Off). Karta Code Completion Na kartě Code Completion zadáváte svá přání, jak by vám měl editor napovídat při tvorbě kódu. S nápovědou aktivovanou stiskem kombinace CTRL+MEZERA jsme se potkali již v BlueJ. NetBeans ale nabízejí nápovědu na mnohem vyšší úrovni odpovídající požadavkům profesionálních programátorů. Language V rozbalovacím seznamu Language zadáváte (programovací) jazyk, pro nějž byste chtěli nastavit parametry průběžné nápovědy. Při zadání All Languages nastavujete obecné zadání pro všechny jazyky. Konkrétně zde můžete nastavit: Auto Popup Completion Window určuje, zda vůbec budete požadovat, aby vám editor při psaní kódu napovídal. Určitě zaškrtnout. Auto Popup Documentation Window určuje, zda se spolu s nápovědou bude automaticky objevovat i okno s dokumentací nabídnuté třídy, metody či atributu. Doporučuji zaškrtnout. Display Documentation Next to Completion určuje, zda se bude dokumentace objevovat vedle seznamu nabízených hodnot (zaškrtnuto), nebo někde nad ním či pod ním. Vyberte si podle svého gusta, já nezaškrtávám. Insert Single Proposals Automatically určuje, zda se bude vůbec něco nabízet v případě, kdy si je editor jistý, jaká hodnota na dané místo patří. Je-li si editor jistý, tak na požádání rovnou doplní potřebnou hodnotu a už vás neobtěžuje dotazy. Mně to vyhovuje, takže zaškrtávám. Case Sensitive Code Completion určuje, zda bude respektována velikost zadávaných znaků. Mně osobně vyhovuje, když IDE reaguje na písmena, a ne na jejich velikost, takže nezaškrtávám. Show Deprecated Members in Code Completion určuje, zda budou nabízeny i zavržené (deprecated) třídy a jejich členy. Jako začátečníci byste měli používat pouze perspektivní konstrukce, takže doporučuji nezaškrtávat. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 61 z 651

62 62 Java 8 Úvod do objektové architektury pro mírně pokročilé Insert Closing Brackets Automatically určuje, zda se má po zapsání otevírací závorky (uvozovky, apostrofu) automaticky doplnit také zavírací. Mně to vyhovuje, takže zaškrtávám. Při zadání volby Java se objeví specializovanější sada možností: Guess Filled Method Arguments určuje, že při nabídce doplňování parametrů metod bude editor nabízet proměnné z daného kontextu. Úspěšnost jeho odhadu, která proměnná na dané místo patří, je tak kolem 40 % a záleží na způsobu psaní zdrojového kódu. Když se ale trefí a vy už nemusíte nic psát, je to příjemné. Auto Popup Triggers for Java určuje, čím můžete automaticky aktivovat nápovědu v průběhu psaní. Implicitně je v poli tečka, takže jakmile napíšete v kódu tečku, editor začne napovídat, co byste za ni mohli napsat. Auto Popup on Typing Any Java Identifier Type určuje, zda se automatické doplňování bude aktivovat i při zapisování zcela nových identifikátorů. Pak editor většinou nabízí přidat na konec identifikátoru název (případně část názvu) jeho datového typu. Někdy se to hodí, takže nabídku přijmete, jindy vás bude obtěžovat. Zaškrtnutí nechám na vás já ji mám zaškrtnutou. Completion Selectors for Java určuje, jaké znaky budou potvrzovat nabídnutou možnost. Zadáte-li libovolný z uvedených znaků, bude editor považovat svoji nabídku za přijatou a nebude identifikátor doplňovat o další vámi psané znaky. Subword completion umožňuje doplňování i u částí slov. To je novinka NetBeans 8.0, na kterou jsem si ještě nezvykl, takže já zatím nezaškrtávám. Zkuste zaexperimentovat, třeba se vám líbit bude. Dvoukartový seznam Package /classes je další novinkou verze 8.0. Umožňuje zadat balíčky, jejichž obsah se nebude (karta Exclude) nebo naopak určitě bude (karta Include) zobrazovat v seznamu nabízených identifikátorů. Ve standardní knihovně je totiž řada tříd, které se vyskytují ve více balíčcích. Rozhodnete-li se např. vyvíjet GUI (grafické uživatelské rozhraní) v doporučované knihovně JavaFX, asi nebudete chtít, aby vám editor nabízel stejnojmenné třídy z historického balíčku java.awt. Karta Code Templates Na této kartě můžete zadat nejrůznější zkratky, které se po zadání rozvinou do části kódu. Např. napíšete-li v kódu sout a stisknete tabulátor, napíše se System.out.println(""); 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 62 z 651

63 Kapitola 2: Vývojové prostředí NetBeans 63 a kurzor se umístí mezi uvozovky. Napíšete-li psvm (zkratka z public static void main), vloží se do kódu hlavní metoda programu. Takovýchto zkratek je připravena celá záplava a sami si můžete doplnit další. Karta Hints Na této kartě si můžete nastavit, na jaké programátorské prohřešky vás má editor upozorňovat. Skoro si říkám, že byste si měli jako začátečníci zaškrtnout všechny, protože byste se měli naučit nedopouštět se žádných programátorských prohřešků. Až budete zkušenější, jistě odhadnete, kdy je výhodnější některou ze zásad porušit, a kdy jde pouze o programátorovu lenost napsat kód správně. Na druhou stranu ale musím uznat, že řada z hlídaných prohřešků není obecně považována za tak vážné a prosazují je pouze některé skupiny programátorů. Udělal jsem proto malou probírku, a kdo bude importovat moje nastavení, bude s ním importovat i tato doporučení. Programátorské prohřešky, o nichž jsem hovořil, nejsou syntaktické chyby. Jsou to zlozvyky, které zvyšují pravděpodobnost zanesení chyby do programu. Prostřednictvím těchto narážek či náznaků vás vývojové prostředí jemně upozorňuje, že (v horším případě) porušujete dobré mravy, anebo jenom plně nevyužíváte možností jazyka, které vám umožňují naprogramovat některé obraty elegantněji a/nebo efektivněji. Karta Highlighting Na této kartě zaškrtáváte, čí výskyty v kódu chcete zvýraznit v okamžiku, kdy nad danou entitu najedete kurzorem. Osobně doporučuji zaškrtnout vše. Když pak najedete např. nad identifikátor proměnné, zvýrazní se v daném kontextu všechny výskyty dané proměnné. To může být někdy velice užitečné, zvláště při hledání chyb. Karta Macros Makra jsou další užitečná pomůcka pro zefektivnění psaní kódu. Makra můžete samozřejmě zadávat i v průběhu psaní v editoru, ale jednou za čas se hodí i možnost upravit přímo jejich kód. Tady tak můžete učinit. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 63 z 651

64 64 Java 8 Úvod do objektové architektury pro mírně pokročilé Karta OnSave Na této kartě můžete nastavit chování NetBeans při ukládání souborů. Můžete nastavit zásady platné pro všechny jazyky a pak případně některé speciální zásady pro nějaký konkrétní jazyk. Já preferuji jednotné nastavení pro všechny. Seznam Reformat umožňuje zadat, jestli se má ukládaný soubor ihned automaticky zformátovat. Já se snažím hned při psaní naformátovat programy tak, aby byly co nejpřehlednější, a nestojím o to, aby se mi v tom pak nějaký automat vrtal. Na druhou stranu se ale setkávám se studenty, jejichž kód je tak neskutečně nepřehledný, že bych jim nastavení automatického formátování při ukládání souboru vřele doporučoval. Seznam Remove Trailing Whitespaces From umožňuje zadat, zda se při ukládání budou odstraňovat případné koncové mezery na řádcích. Vhledem k tomu, že tyto mezery jsou v naprosté většině případů opravdu zbytečné, mám nastaveno jejich automatické odstraňování. Zatím jsem se nesetkal se situací, kdy bych potřeboval ponechat nějakou mezeru na konci řádku. Karta Spellchecker Tato karta vám umožní zadat vlastní slovník, vůči němuž se bude kontrolovat obsah zadávaných HTML stránek a dokumentačních komentářů. S NetBeans se instaluje slovník pro angličtinu, ale budete-li chtít, můžete přidat i slovník pro češtinu či slovenštinu. Já používám slovníky převzaté z editoru PSPad, které můžete stáhnout na adrese Fonts & Colors nastavení písma a barev V oblasti Fonts & Colors můžete zadat, jaké písmo má používat editor a jakou má mít barvu. Možností je opět celá řada, ale já bych vás chtěl upozornit na dvě: na nastavení optimálního písma a na možnost změny vybarvení komentářů. Obě se nastavují na kartě Syntax (viz obrázek 2.13). Nastavení písma Pokud vám použité písmo vyhovuje, můžete tuto pasáž přeskočit. Já ale v programech nemám rád písma, u nichž se špatně rozlišuje nula od písmene O a jednička od malého l (L), případně velkého I (i). Ve světě proto vzniklo několik písem vyladěných tak, aby se v nich dobře psaly (a četly) programy. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 64 z 651

65 Kapitola 2: Vývojové prostředí NetBeans 65 Používáte-li Microsoft Windows, měli byste mít v systému instalované písmo Consolas, které Microsoft vyvinul speciálně pro programátory. Používáte-li jiný operační systém, můžete instalovat např. písmo Anonymous Pro, které si můžete stáhnout na adrese Nastavení společného programátorského písma je jednoduché vlevo v seznamu Category nastavte kategorii Default a stiskněte tlačítko vpravo vedle pole Font. V následně otevřeném dialogovém okně pak zadejte požadované písmo (přesněji vyberte z instalovaných písem to, které vám bude nejvíce vyhovovat). Nezadáte-li něco jinak, tak všechny ostatní kategorie zadané písmo zdědí. Obrázek 2.13 Dialogové okno pro nastavování písma a barvy různých textů Vybarvení komentářů V implicitním nastavení mají komentáře světle šedou barvu. Podle mne je toto nastavení nepříjemně nevýrazné, takže když se do nich chce člověk začíst, musí se dost soustředit. Když chce naopak studovat okolní kód, špatně rozlišuje, kde končí komentář a kde začíná kód, protože se od sebe liší jen nepatrně. Rozhodl jsem se proto, že komentáře ve svých programech odliším barvou pozadí. Protože jsem si v BlueJ zvykl na zelené dokumentační komentáře, rozhodl jsem se pro černé písmo na světle zeleném pozadí. Podle mne toto nastavení celý program výrazně zpřehlednilo a mohu vám je vřele doporučit. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 65 z 651

66 66 Java 8 Úvod do objektové architektury pro mírně pokročilé Chcete-li si změnit vybarvení kódu podle mého doporučení, postupujte následovně: 1. V seznamu Category klepněte na položku Comment (viz obrázek 2.13). V pravé části dialogového okna se objeví nastavení písma komentářů. Jak si můžete přečíst, v aktuálním nastavení se písmo (font) i barva pozadí (background) dědí (inherited) od implicitního nastavení. Pro popředí je nastavena šedá barva. Písmo ponecháme, ale změníme barvu pozadí a popředí. 2. Barvu popředí nastavte na implicitní. Klepněte proto na rozbalovací šipku políčka Foreground a na konci rozbaleného seznamu klepněte na položku Inherited. 3. Barvu pozadí nastavte na naši oblíbenou. (Já ji mám nastavenou na zelenou, ale vy si ji můžete nastavit podle svých preferencí.) Klepněte proto na rozbalovací šipku políčka Background a budete-li se stejně jako já domnívat, že nabídnuté barvy jsou pro pozadí příliš výrazné, klepněte na konci seznamu na položku Custom. 4. Otevře se standardní okno Javy pro nastavování barvy se základní paletou barev (viz obrázek 2.14). Při ukázání na kteroukoliv z nich se u kurzoru myši objeví velikost jejích RGB komponent. Nebude-li vám vyhovovat žádná barva z nabídnuté palety, klepněte na kartu sady parametrů, jejichž prostřednictvím chcete barvu nastavit, a zadejte požadovanou barvu. Své zadání potvrďte. Obrázek 2.14 Standardní dialogové okno Javy pro nastavování barvy 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 66 z 651

67 Kapitola 2: Vývojové prostředí NetBeans Keymap klávesové zkratky V oblasti Keymap můžete zadávat své oblíbené klávesové zkratky. Přecházíte-li na NetBeans z jiného prostředí, můžete se dokonce v rozbalovacím seznamu Profile podívat, jestli tam nenajdete to vaše Java nastavení pro Javu Nastavení v oblasti Java ocení až zkušenější vývojáři, a proto je tu nebudu rozebírat Team Nastavení pro sdílení zdrojových kódu všemi vývojáři v týmu jsou sice velice užitečná, ale jsou opět poněkud mimo téma této učebnice, takže je většinou přeskočím. Zmíním se proto pouze o kartě Action Items. Karta Action Items Na kartě Action Items najdete texty, kterými zahajujete řádkové komentáře, do nichž si vkládáte poznámky o tom, že v daném místě programu je třeba ještě něco dodělat. Nejpoužívanější je text TODO, podle něhož se tyto komentáře také nazývají. Můžete si sem ale přidat i vlastní text, kterým se budete upozorňovat na části kódu, k nimž se chcete ještě vrátit. NetBeans umějí otevřít speciální kartu, v níž bude seznam všech těchto komentářů, abyste jím mohli procházet a postupně odstraňovat jednotlivé nedodělky. V průběhu kurzu se o nich ještě zmíním a ukážeme si, jak je lze využít Appearance nastavení vzhledu V oblasti Appearance můžete nastavit řadu funkcí souvisejících se vzhledem aplikace a jejím chováním. Protože tato nastavení souvisejí s programováním jenom okrajově a ovlivní opravdu pouze vzhled a s ním spojené chování, nebudu vám nic radit a nechám vás experimentovat a vyzkoušet, jaká konfigurace nastavení vám bude nejvíce vyhovovat. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 67 z 651

68 68 Java 8 Úvod do objektové architektury pro mírně pokročilé Karta Document Tabs Na kartě Document Tabs jsou nastavení, která se vztahují především k záložkám jednotlivých karet a která oceníte zejména tehdy, když budete mít současně otevřeno velké množství dokumentů (např. zdrojové kódy mnoha souborů). New document opens next to active document tab zadává, že záložka karty nově otevřeného dokumentu se v panelu editoru umístí za záložku posledního aktivního dokumentu. Není-li políčko zaškrtnuté, umístí se jako poslední. Close activates most recent document nastavuje, že při zavření dokumentu se stane aktivním ten, s nímž jsme pracovali naposledy. V opačném případě se stane aktivním dokument, jehož záložka sousedila se záložkou právě zavřeného dokumentu. Přepínač Tabs placement specifikuje, u kterého okraje panelu budou zobrazeny záložky karet. Implicitně jsou zobrazovány u horního okraje, jak jsme to doposud viděli. Tímto přepínačem je ale mohou milovníci Excelu přesunout dolů a ti, kterým připadá vodorovné uspořádání při větším počtu karet nepřehledné, je mohou umístit vpravo nebo vlevo. Při současných širokoúhlých displejích může být takovéto uspořádání výhodné. Zaškrtnutím pole Multi-row tabs povolíte editoru, aby v případě, kdy se záložky otevřených souborů nevejdou vedle sebe na šířku okna, uspořádal tyto záložky do více řad. Nastavením sdruženého přepínače na hodnotu Maximum row count můžete zadat maximální počet řádků, do nichž se záložky uspořádají, jeho nastavením na hodnotu One row per project požádáte, aby byly záložky souborů uspořádány do řádků podle toho, ke kterému projektu daný soubor patří. Zaškrtnutím volby Show parent folder name in tab title požádáte o zobrazení názvu balíčku na záložce karty editoru. Tato informace sice zabírá místo, ale někdo ji vítá. Já ji mám vypnutou a umístění daného souboru zjišťuji způsobem popsaným v podkapitole 7.10 Lokalizace souboru v projektu na straně 184. Zaškrtnutím volby Show full file path požádáte o zobrazení cesty k editovanému souboru pod záložkou editoru. Já ji mám vypnutou, protože v případě potřeby je možno tuto informaci získat z místní nabídky záložky souboru. Uznávám ale, že se její průběžné zobrazování může někdy hodit. Zaškrtnutím volby Same background color for files from the same project požádáte o to, aby záložky karet souborů ze stejného projektu měly stejnou barvu. (Karta aktuálně editovaného souboru však bude mít vlastní.) To by se vám mohlo hodit v případě, budete-li mít současně otevřené soubory z několika projektů např. abyste porovnali, co se mezi kapitolami změnilo. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 68 z 651

69 Kapitola 2: Vývojové prostředí NetBeans 69 Veřejně se přiznám, že význam volby Sort opened documents list by project jsem nepochopil, protože se mi nepodařilo objevit, který ze seznamů změní svoje chování po jejím zaškrtnutí. Až na to přijdu, napíšu to na webu knihy. Karta Windows Na kartě Windows lze nastavit některé charakteristiky práce s okny a kartami. Drag window image nastavuje, zda se karta bude při přetahování zobrazovat tak, jak jsme to viděli na obrázku 2.5 na straně 52, anebo zda budou zobrazovány pouze červené rámečky cílové pozice přesouvané karty. Transparent drag window image se uplatní pouze tehdy, pokud se při přesouvání zobrazuje celá karta. Tato volba nastavuje, zda má být přesouvaná karta zobrazována jako průsvitná, aby bylo vidět, co je pod ní. Snapping floating windows nastavuje, zda se mají samostatná okna panelů při vzájemném přiblížení k sobě přichytávat (zaškrtnout), abychom je mohli snadno dlaždicově uspořádat, anebo zda si jedno druhého nemají všímat, abychom je mohli případně jednoduše vzájemně překrýt. Snap to screen edges nastavuje, zda se mají samostatná okna panelů přichytávat k okrajům obrazovek, pokud se k nim dostatečně blízko přiblíží. To nám usnadní jejich umisťování na jednotlivých monitorech připojených k počítači. Transparent floating windows nastavuje, zda mají být samostatná okna panelů průsvitná, pokud nejsou zrovna aktivní. Mně osobně tato funkce nevyhovuje, takže políčko nezaškrtávám. Karta Look and Feel Na kartě Look and Feel nastavujete celkový požadovaný vzhled aplikace. Rozbalovací seznam Preferred look and feel vám nabídne několik možností. Musíte jenom počítat s tím, že se nově nastavený vzhled projeví až po novém spuštění NetBeans. Zaškrtnutím políčka Maximize use of native look and feel požádáte o použití komponent operačního systému např. jeho oken pro otevírání a ukládání souborů Miscellaneous zbylá nastavení Doposud nezařazená nastavení se soustředí v oblasti Miscellaneous. V naší minimální konfiguraci bychom v něm měli najít pět karet, z nichž nás první nebude zajímat, protože ji v tomto kurzu nevyužijeme. Pojďme se proto podívat na ty zbylé. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 69 z 651

70 70 Java 8 Úvod do objektové architektury pro mírně pokročilé Karta CSS Preprocessors Možnosti nastavitelné na této kartě v našem kurzu nevyužijeme, takže ji přeskočíme. Karta Diff Programátoři si při své práci každou chvíli uvědomí, že v minulé verzi měli něco naprogramováno lépe, nebo mají dvě velmi podobné verze stejného programu a potřebují zjistit, v čem se liší. K porovnávání dvou souborů (případně dvou verzí téhož souboru) mají NetBeans speciální nástroj. Na kartě Diff můžete nastavit některé z jeho parametrů. Přepínače Internal Diff / External Diff můžete nastavit, využijete-li interní porovnávač souborů, anebo zda dáte přednost nějakému vlastnímu externímu porovnávači. Mně ten interní vyhovuje (budu o něm hovořit v podkapitole 5.8 Porovnání řešení na straně 132), takže jej ponechávám nastavený. Pro něj pak mohu zadat následující nastavení: Ignore Leading And Trailing White Space nastavuje, zda chcete při porovnávání souborů ignorovat rozdílné počty úvodních a koncových mezer či jiných bílých znaků na řádku. Já osobně chci, aby řádky označené jako shodné byly opravdu shodné, a proto toto políčko nezaškrtávám. Ignore Changes In Inner Whitespace nastavuje ignoraci rozdílů v počtu bílých znaků i uprostřed řádků. To se sice může někdy hodit při porovnávání HTML souborů, ale protože většinou porovnávám programy v Javě, tak to nezaškrtávám. Ignore Changes In Case nastavuje, že při porovnávání dvou řádků budete ignorovat rozdílné velikosti písmen. To bychom možná mohli využít v Basicu či Pascalu, v Javě ale na velikosti písmen záleží, takže opět nezaškrtávám. Karta Files Na kartě Files můžete zadat sdružení souborů s danou příponou s odpovídajícím typem editoru (Java, prostý text, HTML editor, ). Protože se v této učebnici budeme zabývat pouze programy v Javě, nebudu tyto možnosti nijak rozebírat. Karta Output Na kartě Output se nastavují vlastnosti panelu, v němž se zobrazuje, co program posílá na standardní a standardní chybový výstup. Nelíbí-li se vám standardní nastavení, můžete si je upravit. Ve výstupní oblasti ve spodní části si můžete ihned prohlédnout, jak se vaše nastavení projeví. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 70 z 651

71 Kapitola 2: Vývojové prostředí NetBeans 71 Karta Terminal Okno terminálu nebudeme v našem kurzu používat, a tak nebudu vysvětlovat ani možnosti jeho nastavení Nastavení panelů nástrojů Mezi programátory je velký počet těch, kteří téměř nesundají ruce z klávesnice a všechny potřebné funkce vyvolávají klávesovými zkratkami. Neméně početná skupina ale myš nezavrhuje a vítá různé panely nástrojů, které tyto funkce spouštějí. Když na nástroj na panelu najedete myší, prozradí vám svůj název (a tím i funkci) spolu s klávesovou zkratkou, kterou můžete danou funkci také vyvolat. Patříte-li mezi uživatele myši, jistě přivítáte možnost upravit panel nástrojů podle svých požadavků. Klepněte pravým tlačítkem na volné místo na panelu nástrojů, anebo zadejte v nabídce View povel Toolbars. Rozbalí se místní nabídka se třemi oddíly. V horním je seznam existujících panelů nástrojů. Vytvoříte-li vlastní panel, objeví se i v tomto seznamu. Na počátku mají NetBeans definovány následující panely: File nabízí nástroje pro vytváření, otevírání a ukládání souborů a projektů. Clipboard poskytuje nástroje pro práci se schránkou. Undo/Redo nabízí nástroje pro odvolání poslední akce a odvolání tohoto odvolání. Run obsahuje nástroje umožňující spuštění hlavních tříd či celých projektů v běžném či ladícím režimu. Debug obsahuje nástroje pro krokování a ladění programu. Performance obsahuje nástroj zobrazující zlomek, v jehož čitateli je aktuálně spotřebovaná velikost paměti na haldě a ve jmenovateli celková velikost paměti pro haldu. (Celková velikost spotřebované paměti je samozřejmě větší, protože jistou paměť zaberou samotné NetBeans, další paměť spotřebují zásobníky a další si pro sebe vyhradí virtuální stroj.) Klepnutím na tento nástroj spustíte garbage collector, který se pokusí haldu uklidit a odstranit z ní maximum nepotřebných objektů. Střední vám umožňuje zadat, zda na panelu nástrojů dáváte přednost malým či velkým ikonám. Dolní obsahuje dva povely: Reset Toolbars vám umožní uvést panely zpět do počátečního stavu. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 71 z 651

72 72 Java 8 Úvod do objektové architektury pro mírně pokročilé Customize otevře speciální okno (viz obrázek 2.15), s jehož pomocí budete moci manipulovat s obsahem panelů, přidávat do nich nové nástroje a odebírat nepotřebné i vytvářet panely nové. Obrázek 2.15 Okno pro úpravu panelu nástrojů Činnost při úpravách panelů je jednoduchá: stačí uchopit nástroj v panelu nebo v okně a přemístit jej do požadované cílové pozice. Odstraňujete-li nástroj, přemístíte jej mimo panely. Panely můžete přemisťovat i jako celek. Na levém okraji každého panelu je zobrazen vroubkovaný úchyt, za nějž můžete panel uchopit a celý přestěhovat do nové pozice. Panely ale nemůžete odvézt kamkoliv. Můžete je uspořádat pouze v zóně, která je pro ně vyhrazena. Je však zcela na vás, zda je budete mít všechny v jednom řádku, anebo zda je umístíte do několika řádků Export a import nastavení V podkapitole 2.7 General obecná nastavení na straně 58 jsem vám slíbil, že vám na konci kapitoly ukážu, jak byste mohli převzít nastavení, která jsem pro vás připravil. Teď je ta pravá chvíle, abych svůj slib splnil. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 72 z 651

73 Kapitola 2: Vývojové prostředí NetBeans 73 Export Nejprve si ukážeme, jak byste mohli exportovat svoje stávající nastavení pro případ, že by se vám importované nastavení nelíbilo a chtěli byste se vrátit k původnímu. Začnete tím, že v okně Options (vyvoláte je příkazem Tools Options) stisknete tlačítko Export. Otevře se dialogové okno Select Options to Export (viz obrázek 2.16), v němž zadáte, co vše budete chtít exportovat a kam se má vaše nastavení exportovat. Obrázek 2.16 Dialogové okno pro export nastavení (okno pro import je téměř stejné) Nastavení se exportují do ZIP-souboru, jehož úplný název (tj. včetně absolutní cesty) zadáte do vstupního pole Target zip file. V poli Select Options for Export pak můžete zaškrtat, co budete chtít exportovat. Jakmile zadáte název souboru a zaškrtnete alespoň jednu volbu, obživne tlačítko OK, jehož stiskem své nastavení uložíte. Doporučuji vám uložit si své současné nastavení. V následující pasáži vás budu učit importovat cizí nastavení, což si budete moci vyzkoušet na tom, které jsem pro vás připravil na webových stránkách knihy. Import Import nastavení probíhá prakticky stejně, jenom obráceně. V dialogovém okně Options stisknete tlačítko Import, čímž otevřete dialogové okno Select Options to Import, 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 73 z 651

74 74 Java 8 Úvod do objektové architektury pro mírně pokročilé které vypadá zcela stejně jako okno na obrázku Zadáte název souboru, z něhož chcete importovat, zaškrtnete oblasti nastavení, které chcete importovat, a stisknete OK. NetBeans otevřou dialogové okno z obrázku 2.17, v němž vás upozorní na to, že importem nastavení nevratně přepíšete aktuální nastavení a že se pak celá aplikace restartuje. Nyní máte poslední možnost si to rozmyslet. Jakmile své rozhodnutí potvrdíte, nastavení se načte a NetBeans se restartují. Obrázek 2.17 Žádost o potvrzení importu nastavení s upozorněním na jeho nevratnost Můžete si to vše vyzkoušet. ZIP-soubor s mým nastavením pojmenovaný NBSettings_UOA2_J8.zip naleznete na webové stránce knihy 4. V souboru jsou uložena nastavení formátování, šablon, maker a panelů nástrojů. V dalším textu budu předpokládat, že jste tato nastavení importovali. Pokud se vám importovaná nastavení nebudou líbit, můžete se kdykoliv vrátit ke svým původním nastavením, která jste si uložili před chvílí Shrnutí co jsme se naučili Vývojové prostředí NetBeans je profesionální vývojové prostředí, které je k dispozici zdarma. Na jeho stránkách je k dispozici několik sad optimalizovaných pro jednotlivé skupiny vývojářů. Nám stačí ta nejjednodušší. Při spuštění programu lze zobrazovat startovací stránku s řadou užitečných informací. Aplikační okno může být rozděleno na několik panelů. 4 Pro jistotu připomínám: 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 74 z 651

75 Kapitola 2: Vývojové prostředí NetBeans 75 Každý z panelů může obsahovat několik karet. Karty lze přesouvat z panelu do panelu. Přesuneme-li kartu mimo aplikační okno, vytvoří se nové okno, do něhož pak můžeme přesunout další karty. Panely lze ukotvit ke stranám aplikačního okna. Na kartě Projects se zobrazují jednotlivé otevřené projekty. Prostředí NetBeans umožňuje mít současně otevřených více projektů. Každý z projektů má stromovou strukturu. Jednou z jejích položek je i složka se zdrojovými soubory. Poklepáním na položku souboru tento soubor otevřeme. Na kartě navigátoru se zobrazují jednotlivé členy aktuálního souboru. Ikony na kartě navigátoru umožňují specifikovat, které skupiny členů chceme zobrazovat. Zadáním povelu Tools Options otevřeme dialogové okno, v němž můžeme nastavit nejrůznější parametry. Zadáním povelu View Toolbars otevřeme dialogové okno, v němž můžeme nastavit obsah různých panelů nástrojů. Nastavení vývojového prostředí je možno exportovat a importovat. Vložením řádkového komentáře začínajícího TODO nebo některým jiným předem zadaným slovem označíme místo, kde chceme ještě upravovat kód a na něž nás bude prostředí NetBeans upozorňovat v panelu Action Items. V této kapitole jsme si pouze ukazovali, jak se pracuje s prostředím NetBeans, takže jsme na otevřeném projektu N202a_Library nic nezměnili. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 75 z 651

76 00 76 Java 8 Úvod do objektové architektury pro mírně pokročilé 3. Projekty v NetBeans Library Kapitola 3 Projekty v NetBeans Library Co se v kapitole naučíte Představím vám knihovnu (framework) grafických tvarů spravovaných správcem plátna, s níž budeme v dalším textu pracovat a používat ji v našich demonstračních příkladech. Jedná se o projekt, který jsme používali v minulém dílu, doplněný o několik dalších tříd a upravený překladem identifikátorů do angličtiny. Na této knihovně/frameworku si ukážeme standardní strukturu projektů v NetBeans a naučíte se ji začlenit do systému jako knihovnu. V této kapitole pokračujeme v práci s projektem N202a_Library obsahujícím třídy výše zmíněné knihovny. Jak jsem již naznačil v podkapitole 1.13 Knihovna CanvasManager na straně 44, v dalším textu budu předpokládat, že její třídy znáte. Kdo je nezná, měl by si přečíst její programátorskou dokumentaci. 3.1 Balíčky programů tohoto dílu V minulém dílu jsme v kapitole o balíčcích probírali konvence, podle nichž se vytvářejí názvy balíčků. Vysvětlili jsme si, že pro české vydání prvního dílu učebnice jsem definoval pseudokořenový balíček cz.pecinovský.česky.mojj_7. Do jeho podbalíčků jsme pak umístili většinu tříd, s nimiž jsme v předchozích kapitolách pracovali v kořenovém balíčku. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 76 z 651

77 Kapitola 3: Projekty v NetBeans Library 77 I tento díl bude mít svůj pseudokořenový balíček. Protože v něm budeme používat programy s anglickými identifikátory a českými komentáři, bude v jazykovém balíčku cz.pecinovsky.en_cz. A protože tato kniha je druhým dílem učebnice objektové architektury a pro doprovodné programy budu používat osmou verzi Javy, zvolil jsem název jejího podbalíčku uoa2_j8 (to už jste jistě odhadli v minulé kapitole). Tento balíček bude pseudokořenovým balíčkem všech doprovodných programů tohoto dílu. Slovo pseudokořenový znamená, že i když tento balíček není pravým kořenovým balíčkem, budu všechny doprovodné programy pro tuto knihu vytvářet v některém z jeho podbalíčků. Vám bych pak doporučil, abyste si vytvořili vlastní pseudokořenový balíček, v němž budete vytvářet své verze programů, o nichž tu budeme hovořit. Sami se pak rozhodněte, které programy budete prostřednictvím příkazu import přebírat ode mne, a které si vytvoříte sami. Své programy si pak můžete porovnat s těmi mými. 3.2 Balíčková struktura knihovny Jak už jsem naznačoval na počátku kapitoly, knihovna N202a_Library je nepatrně rozšířenou verzí knihovny, s níž jsme pracovali v předchozím dílu. Vychází z verze se zavedeným děděním, kterou jsme si představovali v poslední kapitole první části knihy. Rozdělení knihovny do balíčků pak odpovídá tomu, které jsme si ukazovali na konci prvního dílu. Před chvílí jsem vám prozradil, že pseudokořenovým balíčkem všech projektů v této knize bude balíček cz.pecinovsky.en_cz.uoa2_j8. V něm ale knihovna nebude. Protože stejnou knihovnu používám v několika publikacích a výukových kurzech, tak je umístěna ve dvou podbalíčcích balíčku cz.pecinovsky (viz obrázek 3.1): Podbalíček canvasmanager obsahuje třídu CanvasManager (v minulém dílu se její ekvivalent jmenoval SprávcePlátna) a všechny třídy a interfejsy, které s ní přímo spolupracují Podbalíček util obsahuje třídy, které správce plátna nevyužívají, a mohli bychom je proto využít i tehdy, nebudeme-li pracovat se správcem plátna. 3.3 Složky se zdrojovými soubory Před chvílí jsem řekl, že soubory knihovny jsou rozmístěny ve dvou balíčcích, ale ony jsou ve skutečnosti tři. Třetím balíčkem je balíček examples, který obsahuje třídy z balíčku příklady v závěrečném projektu minulého dílu. (Jenom připomenu, že 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 77 z 651

78 78 Java 8 Úvod do objektové architektury pro mírně pokročilé canvasmanager Controller <<singleton>> Multimover Painter <<singleton>> CanvasManager <<interface>> IModular Changeable2Modular <<interface>> IControllable <<interface>> IFlexible Mover Text <<abstract>> APaintable <<interface>> IPaintable <<interface>> IAdaptable Resizer Line Ellipse <<abstract>> AMoveable <<interface>> IMoveable <<interface>> IMultimoveable Rectangle Triangle <<abstract>> AChangeable <<interface>> IChangeable <<interface>> IResizeable Multishape Modular2Changeable Picture <<abstract>> AShape <<interface>> IShape util <<interface>> ICloneable <<interface>> IDirectable <<interface>> ITurnable8 <<interface>> ITurnable4 <<utility>> IO <<interface>> IColorable <<enum>> Direction8 NamedColor <<utility>> MathRUP <<utility>> Utilities Position Size Area Repeater <<utility>> Containers <<utility>> DBG IndentingPrintStream IndentingReporter CallerReporter <<utility>> CollectionsRUP Obrázek 3.1 Diagram tříd knihovny a jejích balíčků canvasmanager a util v něm jsou testy základních tříd knihovny a pomocné třídy pro tyto testy, a proto je umístěn ve stromu složek balíčků testovacích souborů viz obrázek 2.9 na straně 55.) Balíček examples budeme využívat jenom v několika prvních kapitolách při seznamování se s prostředím NetBeans. Protože třídy v tomto balíčku slouží pouze k testování, jsou umístěny ve stromu složek s testovacími soubory, který NetBeans umisťují do jiné kořenové složky než složky se zdrojovými soubory vytvářené aplikace. Testovací soubory bývají pohromadě s klasickými zdrojovými soubory pouze ve školních příkladech. Při profesionálním vývoji aplikací bývají testovací soubory umístěné jinde, aby se při odevzdání mohly přeložit pouze pracovní soubory a testovací soubory v programu nasazovaném u zákazníka nezabíraly místo. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 78 z 651

79 Kapitola 3: Projekty v NetBeans Library 79 Struktura stromu složek s testy přitom bývá kopií struktury stromu složek se zdrojovými soubory. Testovací třídy tak mohou být ve stejném balíčku jako třídy testované. Tím získají přístup ke všem členům testovaných tříd s výjimkou těch soukromých. 5 Předchozí zvyklost využívá toho, že překladač nezajímá, kde je zdrojový soubor uložen, a reaguje pouze na balíček zadaný v jeho příkazu package. Shodnost obou stromů balíčků je tedy pouze záležitostí naší konvence a zvyklostí (a hlavně našich omezených schopností se v tom vyznat). My překladači prozradíme, kde všude má hledat zdrojové soubory a použité knihovny, a on na základě jejich příkazů package vystaví jediný strom balíčků. Jak už jsem naznačoval v pasáži o struktuře projektu, prostředí NetBeans (a s ním i všechna ostatní profesionální prostředí) pracuje se dvěma sadami složek zdrojových souborů: První sada je určena pro zdrojové soubory projektu, přičemž výchozí kořenová složka bývá na kartě projektů pojmenována Source packages a na disku bývá uložena v podsložce src složky daného projektu. Druhá sada je určena pro testovací soubory, přičemž výchozí kořenová složka bývá na kartě projektů pojmenována Test packages a na disku bývá umístěna v podsložce test složky daného projektu. Soubory z této sady složek se sice přeloží, ale do výsledného JAR-souboru se neukládají. Obrázek 3.2 Nabídka způsobu zobrazení balíčků 5 V případě potřeby je možno zajistit i přístup k těm soukromým členům, ale to už patří opravdu do vyšší školy programování. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 79 z 651

80 80 Java 8 Úvod do objektové architektury pro mírně pokročilé 3.4 Balíčky na kartě projektů Na kartě projektů si můžete zobrazit strukturu balíčků třemi způsoby, mezi nimiž můžete kdykoliv během práce přepínat v místní nabídce volné plochy karty projektu. Zkuste si to najeďte myší v kartě projektů na volnou plochu a stiskněte pravé tlačítko. Rozbalí se místní nabídka, jejíž poslední položkou je podnabídka View Java Packages As (viz obrázek 3.2). V ní najdete tři povely: List zobrazí seznam všech neprázdných balíčků projektu, přičemž každý z balíčků v seznamu je uveden svým plným názvem. Nevýhodou tohoto způsobu zobrazení jsou dlouhé názvy balíčků, v nichž se občas špatně orientuje, protože ta nejdůležitější část často vyjede za hranu karty. Nicméně když na příslušný balíček ukážete myší, zobrazí se i zbylá část jeho názvu (viz obrázek 3.3) Tree zobrazí kompletní stromovou strukturu balíčků (viz obrázek 3.4). Výhodou oproti předchozímu zobrazení jsou kratší názvy, nevýhodou je, že při hlubším zanoření balíčku se k němu musíte nejprve proklikat. Reduced Tree se snaží sloučit výhody obou. Dokud je v procházených balíčcích pouze podbalíček, takže se program nemusí rozhodovat, kudy se dále zanořit, vypisuje názvy procházených balíčků obdobně jako v případě seznamu. Jakmile se v balíčku objeví soubor nebo více než jeden podbalíček, zobrazí obsah daného balíčku stylem stromu (viz obrázek 3.5). Obrázek 3.3 Balíčky zobrazované jako seznam Obrázek 3.4 Balíčky zobrazované jako strom V dalším textu budu předpokládat, že máte zadánu poslední možnost, tj. zobrazování redukovaného stromu balíčků. Mně osobně totiž připadá nejšikovnější, a budu je proto ve většině obrázků používat. Obrázek 3.5 Balíčky zobrazované jako redukovaný strom 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 80 z 651

81 Kapitola 3: Projekty v NetBeans Library Práce s balíčky Balíčky můžete v průběhu vývoje vytvářet, rušit, přejmenovávat, přesouvat a kopírovat. Podívejme se na každou z těchto operací: Vytvoření nového balíčku Chcete-li vytvořit jakýkoliv nový objekt, zadáte v místní nabídce balíčku, v němž chcete objekt vytvořit, povel New. Rozbalí se podnabídka, v níž si můžete vybrat, co vlastně chcete vytvořit (viz obrázek 3.6). Chcete-li vytvořit balíček, zadáte povel Java Package. Zkuste zadat tento povel v místní nabídce balíčku examples tak, jak to vidíte na obrázku 3.6. Obrázek 3.6 Vytvoření nového balíčku Otevře se dialogové okno, v němž vám NetBeans nabízejí úplný název vytvářeného balíčku sestávající z názvu aktuálního balíčku (tj. toho, v jehož místní nabídce jste příkaz zadávali) následovaného navrhovaným názvem newpackage. My se rozhodneme, že testy tříd spolupracujících se správcem plátna přemístíme do balíčku se správcem plátna a jeho spolupracovníky, tj. do balíčku s úplným názvem cz.pecinovsky.canvasmanager. Upravte proto nabízený název do požadované podoby a své zadání potvrďte. NetBeans vytvoří požadovaný balíček, a protože se tím změní struktura redukovaného stromu (balíček cz.pecinovsky, který obsahoval pouze jeden podbalíček, nyní obsahuje dva), tak jej samozřejmě překreslí do podoby, kdy pseudokořenem bude balíček cz.pecinovsky, který bude mít dva potomky: původní sekvenci en_cz.uoa2_j8.examples a nově vytvořený balíček canvasmanager. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 81 z 651

82 82 Java 8 Úvod do objektové architektury pro mírně pokročilé Obrázek 3.7 Dialogové okno pro vytvoření nového balíčku Přesun tříd mezi balíčky Máme nový balíček, ale prozatím je prázdný. Připomeňme si, proč jsme jej vytvářeli: aby testovací třídy byly ve stejném balíčku jako třídy testované. Měli bychom proto do něj přesunout třídy IShapeTest, MultishapeTest a Tests, které přímo prověřují funkce tříd z balíčku správce plátna, tj. z balíčku canvasmanager. Jdeme na to. Na počátku této podkapitoly jsem sliboval, že vám ukážu přesouvání a kopírování balíčků. Místo toho se teď chystám ukazovat přesouvání tříd. Operace jsou ale prakticky totožné, takže si ty zbylé jistě domyslíte. Začneme tím, že si přesouvané třídy otevřeme v okně editoru, abychom mohli zkontrolovat, jaký vliv bude mít tento přesun na zdrojový kód. Vyberte proto tyto tři třídy (např. tak, že na ně budete klepat se stisknutým přeřaďovačem CTRL) a zadejte v jejich místní nabídce Open. Všimněte si, že třídy se uspořádaly v tom pořadí, v jakém jste je vybrali. Po otevření zůstaly soubory na kartě projektu nadále označené jako vybrané. Uchopte je a přesuňte na balíček cz.pecinovsky.canvasmanager a prozatím nepouštějte. U kurzoru myši se objeví značka přesouvání souborů (viz obrázek 3.8). Než přesouvané soubory pustíte, vyzkoušejte si, že po stisku přeřaďovače CTRL se u této přesouvací značky objeví znaménko + symbolizující, že se soubory Obrázek 3.8 Přesouvání tříd do jiného balíčku 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 82 z 651

83 Kapitola 3: Projekty v NetBeans Library 83 nebudou přesouvat, ale budou se kopírovat. Když přesunete kurzor kousek stranou (např. nad některý z přesouvaných souborů), změní se podoba kurzoru na značku zákaz stání symbolizující nerealizovatelnou operaci. Kdybyste v tuto chvíli soubory pustili, nestalo by se nic. Vraťme se ale k řádnému přesouvání. Upusťte přesouvané soubory nad cílovým balíčkem. Otevře se dialogové okno z obrázku 3.9, které nabízí několik důležitých informací: Obrázek 3.9 Dialogové okno přesunu tříd do jiného balíčku Rozbalovací seznam Project prozrazuje, do kterého projektu se chystáme zadané soubory přesunout (teď přesouváme pouze zdrojové soubory, ale obecně můžeme mít v balíčku i jiné druhy souborů). Rozbalovací seznam Location říká, do kterého ze stromů balíčků tohoto projektu se chystáme soubory přesunout. Rozbalovací seznam To Package oznamuje, do kterého z balíčků tohoto stromu se chystáme soubory přesunout. Seznam List of Classes vyjmenovává, které soubory se chystáme přesunout. (Tento seznam se objeví v dialogovém okně pouze při přesunu více souborů.) V našem příkladu jsou všechny seznamy neovlivnitelné. Kdybyste ale přesouvané soubory upustili na kartě projektů v prostoru mezi projekty, všechny rozbalovací seznamy by ožily a vy byste si mohli požadovaný cíl vybrat. Pod seznamem je ještě zaškrtávací políčko Move Without Refactoring. Toto políčko zaškrtnete v případě, že chcete soubory opravdu pouze přesunout a nechcete, aby NetBeans analyzovaly, zda se v nich v důsledku tohoto přesunu nemá něco změnit. To ale není v tuto chvíli náš případ. My naopak chceme, aby se zdrojový kód 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 83 z 651

84 84 Java 8 Úvod do objektové architektury pro mírně pokročilé přesouvaných souborů přizpůsobil novému balíčku. Potřebujeme proto nechat automatickou refaktoraci zdrojového kódu zapnutou. Nyní máte dvě možnosti (vynechávám tlačítka Cancel a Help, jejichž význam si jistě odvodíte): Stisknete-li tlačítko Refactor, operace se provede. Stisknete-li tlačítko Preview, NetBeans vám nejprve ukáží, co vše se v rámci automatické refaktorace chystají změnit, abyste mohli každou jednu nabízenou změnu potvrdit či zamítnout. V druhém případě se pod panely editoru a navigátoru objeví další panel s kartou Refactoring (viz obrázek 3.10). Na této kartě budou dva panely: Obrázek 3.10 Panel s kartou plánovaných refaktoračních akcí Levý panel bude obsahovat nabídku refaktoračních akcí. Pravý panel bude obsahovat porovnání výchozího a cílového stavu souboru. Vlevo uvidíte stav před refaktorační akcí, vpravo po ní. Před každou akcí v levém panelu je zaškrtávací políčko ovlivňující, zda se daná akce provede. Ukážete-li vlevo na nějakou akci, objeví se u šipky nápovědný text s úplnou cestou k upravovanému souboru následovanou číslem řádku, který by se měl upravit. Klepnete-li vlevo na nějakou akci, vpravo se zobrazí porovnání obou verzí upravovaného souboru. Zrušíte-li zaškrtnutí akce vlevo, navrhovaná akce se neprovede a na daném místě budou obě verze shodné, protože se při následném potvrzení na tomto místě nic nezmění. Pokud zaškrtnutí vlevo obnovíte, vpravo se opět zobrazí navrhovaná změna. Na obrázku 3.10 je vpravo zobrazován výchozí a cílový stav zdrojového kódu třídy Tests. NetBeans navrhují na čtvrtém řádku změnit příkaz package a potom přidat řádek 13 s nějakým importem. Posunete-li si zobrazovaný výsek (na širší obrazovce dokonce nemusíte nic posouvat), zjistíte, že se má přidat import třídy 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 84 z 651

85 Kapitola 3: Projekty v NetBeans Library 85 Tree. To je ale logické, protože tato třída se po přesunu octne v jiném balíčku, a bude ji proto třeba importovat (anebo oslovovat plným jménem, ale to dělají programátoři jen tehdy, když opravdu musí). Při spodním okraji levého panelu jsou dvě tlačítka. Stiskem tlačítka Cancel celou akci odpískáte, stiskem tlačítka Do Refactoring odsouhlasenou refaktoraci spustíte. Importy z vlastního balíčku Možná některé z vás udivilo, proč NetBeans nenabízejí odstranění importů tříd z cílového balíčku (a že jich je v přesouvaných třídách požehnaně). Nečiní tak proto, že ponecháním importů z vlastního balíčku se pouze porušují dobré zvyky, kdežto jejich odebrání by v některých speciálních případech mohlo narušit funkci dané třídy. Když se ale po provedeném přesunu podíváte na zdrojové kódy přesunutých tříd, naleznete v nich vedle provedených změn i upozornění na nevhodný kód v našem případě na import tříd z vlastního balíčku. Upozornění vypadá jako malá žlutá žárovička doplněná žlutým trojúhelníkem s vykřičníkem a umístěná na problematickém řádku ve sloupci s čísly řádků. Když na dané upozornění najedete, zobrazí se popisek oznamující, že se jedná o import ze stejného balíčku, v němž je daná třída. Klepnete-li na žárovičku, vyskočí místní nabídka se seznamem akcí, kterými NetBeans navrhují daný prohřešek napravit (viz obrázek 3.11). V našem případě NetBeans nabízejí buď odebrat příslušný import, anebo odebrat všechny importy ze stejného balíčku. Zvolíme samozřejmě druhou možnost. Přejmenování balíčku Obrázek 3.11 Nabídka opravných akcí Testovací třídy máme tedy ve stejném balíčku jako třídy testované. V balíčku examples zůstaly pouze třídy Tree a Light spolu se svými testovacími třídami. V minulém dílu jsme tyto třídy vytvářeli a ukazovali si na nich některé postupy. V tuto chvíli jsou to ale pouhé pomocné třídy používané testovacími třídami z balíčku canvasmanager. Když už jsou v balíčku pouze pomocné třídy, měli bychom jej příslušně přejmenovat. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 85 z 651

86 86 Java 8 Úvod do objektové architektury pro mírně pokročilé Klepněte na kartě projektu na balíček examples a buďto na něj ještě jednou klepněte, nebo stiskněte klávesu F2. Na místě názvu, na nějž jste klepali, se objeví vstupní pole s dosavadním názvem balíčku, který můžete změnit. Řekli jsme si, že balíček s dosavadním názvem examples se dostává do role pomocného balíčku. Přejmenujte jej proto na auxiliary (názvy rodičovských balíčků ponechte) a stiskem ENTER svoje zadání potvrďte. Rozlišujte prosím dvojité klepnutí (dvě klepnutí rychle za sebou) a dvě klepnutí (dvě klepnutí s dostatečnou prodlevou mezi nimi). Když dvojitě klepnete na balíček, rozbalí se, resp. sbalí se. Když dvojitě klepnete na soubor, otevře se. Když na balíček či soubor klepnete dvakrát, můžete jej přejmenovat. Objeví se dialogové okno Rename examples (viz obrázek 3.12), v jehož záhlaví je název přejmenovaného balíčku a v neaktivním vstupním poli New Name zadaný cílový název. Pod tímto polem je zaškrtávací políčko Apply Rename on Comments, jehož zaškrtnutím ovlivníte, zda se bude současný název balíčku vyhledávat a měnit i v komentářích. Zaškrtávací políčko Rename Without Refactoring naznačuje, že máte možnost přejmenovat danou složku, aniž by se pak NetBeans snažily jakkoliv upravovat zdrojové kódy v dané složce nebo zdrojové kódy, které se na soubory v dané složce odkazují. Někdy se to hodí, ale tentokrát potřebujeme přejmenování s veškerým komfortem, tj. s funkční refaktorací. Tlačítka při spodním okraji již znáte. Stiskněte tlačítko Preview, abyste se přesvědčili, že NetBeans opravdu změní vše, co je potřeba: jak příkazy package v souborech v přejmenovávaném balíčku, tak příkazy import v souborech, které používají třídy z přejmenovávaného balíčku. Obrázek 3.12 Dialogové okno s žádostí o upřesnění dalšího postupu 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 86 z 651

87 Kapitola 3: Projekty v NetBeans Library Překlad a sestavení projektu Abychom mohli s projektem pracovat, musíme jej nejprve přeložit a sestavit. K tomu slouží příkaz Build, který je na panelu nástrojů zastupován ikonou představující kladívko. Tento nástroj však nemaže některé pozůstatky předchozích pokusů o sestavení programu, takže se může stát, že po jeho použití nebude program fungovat podle předpokladů. Proto na panelu nástrojů naleznete ještě nástroj Clean and Build zastoupený ikonou se smetáčkem a kladívkem. Ten nejprve smaže všechny pozůstatky z minula (proto to košťátko) a pak vše znovu přeloží a sestaví. V průběhu překladu a sestavení projektu by se v panelu, v němž se před chvílí zobrazovala refaktorační karta, měla objevit karta Output zobrazující texty vypisované na standardní výstup a standardní chybový výstup (na rozdíl od BlueJ se v NetBeans posílají oba výstupy do stejného výstupního panelu a neodlišují se ani barvou). Pokud se karta nezobrazí, zadejte příkaz Window Output nebo stiskněte CTRL+4. Na standardní výstup překladač i sestavovací program vypisují zprávy o průběhu své činnosti. Při žádosti o sestavení se v závěru výpisu dozvíte, kde je umístěn výsledný JAR-soubor. Jedná-li se o spustitelný program, dozvíte se současně i to, jak má vypadat příkaz, kterým můžete tento JAR-soubor spustit z příkazového řádku. 3.7 Programátorská dokumentace (API) BlueJ nabízelo tři režimy pro zobrazení programátorské dokumentace: dokumentaci jedné metody na požádání při zápisu kódu, dokumentaci daného typu v okně editoru a dokumentaci celého projektu ve webovém prohlížeči. Podobné režimy nabízejí i NetBeans. Podívejme se na ně. Dokumentace při psaní kódu V pasáži Karta Code Completion na straně 61 jsme probírali nastavení, která mohou ovlivnit, kdy a jak se bude zobrazovat programátorská dokumentace při psaní kódu. Aktivační klávesová zkratka pro získání nápovědy k aktuálně psanému kódu je CTRL+MEZERA. Jak si ale možná pamatujete, nastavení umožňuje zadat automatickou aktivaci nápovědy po zadání tečky či začátku zápisu nějakého identifikátoru. Výše uvedenou klávesovou zkratku tak při psaní kódu nemusíte vůbec použít. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 87 z 651

88 88 Java 8 Úvod do objektové architektury pro mírně pokročilé Možnosti okna dokumentace Automatickou nápovědu můžete použít nejenom při psaní kódu, ale i při jeho analýze. Nemůžete-li si vzpomenout, co dělá některá použitá metoda, najedete na její volání, stisknete CTRL+MEZERA a můžete si tak zobrazit nejenom dokumentaci dané metody, ale i seznam jejích kolegů s jejich dokumentací. Akci můžete samozřejmě použít nejenom pro metody, ale i pro atributy a celé datové typy. V okně rozbaleném v rámci nápovědy můžete vybírat části textu do schránky (např. do vlastních dokumentačních komentářů). Okno je navíc schopné reagovat i na klepnutí na hypertextové odkazy po klepnutí na odkaz se v okně zobrazí odkazovaný prvek. Obrázek 3.13 Vyskakovací okna s nápovědou a dokumentací vybrané položky Nápovědní dokumentační okno má v záhlaví panel nástrojů, jehož ikony začnou při procházení odkazy ožívat (viz obrázek 3.13). Panel nabízí následující nástroje: Go to previous page Vrátí se na předchozí stránku. Vracení funguje pouze v rámci jednoho dotazu nápovědy. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 88 z 651

89 Kapitola 3: Projekty v NetBeans Library 89 Go to next page Přejde vpřed na dříve navštívenou stránku, ze které jsme se vrátili. Show documentation in external web browser Zobrazí dokumentaci v okně vašeho implicitního internetového prohlížeče. Open source in editor Otevře v editoru zdrojový kód odkazovaného prvku. Dokumentaci položky, v níž je právě kurzor, můžete získat i samostatně (tj. bez nápovědy možných pokračování). Stačí zadat příkaz Source Show Documentation nebo stisknout klávesovou zkratku CTRL+SHIFT+ MEZERA. Nezajímá-li vás v danou chvíli dokumentace použité entity (může to být metoda, atribut, třída, ), ale potřebujete-li z nějakého důvodu vidět její kód, stačí na její volání najet myší, stisknout přeřaďovač CTRL (název se podtrhne jako hypertextový odkaz) a klepnout. Editor se pak okamžitě přesune na příslušný zdrojový kód. Samostatná karta dokumentace Výše uvedené okno se zobrazí spolu se seznamem doporučovaných zadání a po zadání příslušného identifikátoru spolu obě okna zase zhasnou. Chcete-li dokumentaci vidět i nadále, můžete si zobrazit kartu dokumentace. Dosáhnete toho zadáním příkazu Window IDE Tools Javadoc. Karta se otevře ve stejném panelu, v němž se otevírá karta refaktorace a standardního výstupu. (Můžete si ji ale samozřejmě přemístit i jinam.) Vytvoření dokumentace projektu Nápovědní okno dokáže získat potřebné údaje jak z vygenerované dokumentace, tak ze zdrojového kódu. V dokumentační kartě se však zobrazí pouze dokumentace, kterou jste před tím vygenerovali (a kterou byste proto mohli zobrazit i v internetovém prohlížeči). Chcete-li proto zkontrolovat dokumentaci vytvářeného projektu, musíte ji nejprve vygenerovat zadáním příkazu Generate Javadoc v místní nabídce projektu na kartě Projects. Druhou možností je zadání téhož příkazu v nabídce Run; pak ale musíte mít otevřený zdrojový soubor z daného projektu nebo musí být projekt aktivovaný jinak. Po zadání tohoto příkazu se na kartě Output začne zobrazovat výstup programu javadoc, který dokumentaci ze zdrojového kódu vytváří. Na počátku bude řádek začínající Created dir:, v němž vám program oznamuje, kam vytvářenou dokumentaci umístí. Pak bude pravděpodobně následovat varování: 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 89 z 651

90 90 Java 8 Úvod do objektové architektury pro mírně pokročilé Warning: Leaving out empty argument '-windowtitle' Tím vám program naznačuje, že jste nezadali název stránky s dokumentací. Za chvíli si ukážeme, jak to napravit. Za tímto varováním následují řádky s jednotlivými načítanými zdrojovými soubory a za nimi řádky s případnými varovnými a chybovými hlášeními vydávanými při zpracování dokumentace. Na konci těchto řádků jsou hypertextové odkazy, na něž můžete klepnout a přesunout se do místa, o němž se dané hlášení zmiňuje. Zprávu ukončuje řádek uvozený textem Browsing, za nímž následuje URL adresa HTML souboru s kořenovou stránkou dokumentace. Zadáte-li tuto adresu do adresního pole vašeho prohlížeče, stránka se zobrazí. Zadávat ji však nemusíte, protože ji po vygenerování dokumentace za vás zadají NetBeans a dokumentace se ihned otevře v implicitním prohlížeči. 3.8 Karta souborů Vytvořili jsme tedy jakýsi výsledek. Pojďme se podívat, kde jej najdeme a jak vypadá. To vše se dozvíte na kartě Files, která je ve stejném panelu jako karta Projects. Karta zobrazuje náš (doposud jediný) projekt. Když jej rozbalíte, zobrazí se pět složek a dva soubory: Složka build, která (mimo jiné) obsahuje podsložku classes, což je kořenová složka přeložených souborů našeho projektu. (Zbytek jsou služební složky a soubory, s nimiž nebudeme pracovat.) Složka dist určená pro soubory, které budete chtít distribuovat jako výsledek svého snažení. Budete-li chtít vytvořený program někam přenést, budete přenášet obsah této složky. Sem sestavovací program umístí vytvořený JAR-soubor spolu s případnými potřebnými knihovnami (ty budou v podsložce lib). Při generování programátorské dokumentace se zde navíc vytvoří složka javadoc, do níž se dokumentace vygeneruje. Složka nbproject, kam NetBeans ukládají nejrůznější údaje týkající se daného projektu. Složky src a test, což jsou kořenové složky zdrojových souborů projektu a jejich testovacích souborů. Do těch vidíme i v projektovém okně. Soubory build.xml a manifest.mf, což jsou konfigurační soubory, jejichž obsahem se v této knize nebudeme zabývat. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 90 z 651

91 Kapitola 3: Projekty v NetBeans Library Vlastnosti projektu Před chvílí jsme si řekli, že při implicitním nastavení nás bude program javadoc varovat, že jsme hlavní stránce dokumentace projektu nezadali žádné jméno. To se spolu s řadou dalších věcí zadává ve vlastnostech projektu. Proběhneme si nyní spolu ty základní. V průběhu dalších kapitol si ještě o některých povíme podrobněji. Dialogové okno s vlastnostmi projektu otevřete např. zadáním příkazu Properties, což je poslední příkaz v místní nabídce projektu. Otevře se okno z obrázku Okno má několik stránek, mezi nimiž přepínáte klepnutím na příslušnou položku ve stromu v levém panelu. Obrázek 3.14 Dialogové okno s vlastnostmi projektu Stránka Sources Stránka Sources umožňuje zadat kořenové složky zdrojových a testovacích souborů. Každá skupina má svůj seznam, přičemž v levém sloupci je adresa dané složky a v pravém je název, pod nímž se zobrazuje na kartě projektu. Nahoře si v poli Project Folder můžete přečíst, kde je na disku umístěna kořenová složka daného projektu. Nejde sice změnit, ale pokud se do ní potřebujete podívat v nějakém správci souborů, můžete tuto adresu vybrat myší, zkopírovat do schránky a následně použít. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 91 z 651

92 92 Java 8 Úvod do objektové architektury pro mírně pokročilé Dole můžete v rozbalovacím seznamu Source/Binary Format zadat verzi Javy, pro niž budete svůj projekt vytvářet. Doprovodné programy této knihy jsou určeny pro Javu 8, ale s nejvyšší pravděpodobností budou chodit i pod příštími verzemi Javy. V seznamu Encoding můžete zadat kódování zdrojových souborů. Doporučuji vám využít implicitně nastaveného kódování UTF-8, které je platformně nezávislé, takže byste neměli mít problém s přenosem zdrojových souborů na jiný počítač. Stránka Libraries Zde se nastavují používané knihovny a frameworky. Protože náš projekt žádné nestandardní knihovny nepoužívá, tak ji zatím přeskočíme a vrátíme se k ní v podkapitole 6.4 Použití frameworku či knihovny na straně 143, až do ní budeme potřebovat něco zadat. Stránka Compiling Stránka slouží k upřesnění parametrů překladu. Nahoře na stránce je zaškrtávací políčko Compile on Save. Když je zaškrtnete, při každém uložení zdrojového souboru se daný soubor okamžitě přeloží. Při spouštění programu pak nemusíte čekat na to, až se všechny soubory upravené od posledního spuštění nejprve přeloží. Někteří programátoři si tuto možnost chválí, jiní ji odmítají. Vyzkoušejte si obě a rozhodněte se dle vlastních preferencí. Já ji mívám většinou zaškrtnutou. Políčko Generate Debugging Info ponechte určitě zaškrtnuté, abyste mohli svoje programy komfortně ladit. Zaškrtnutí je vhodné zrušit až těsně před tím, než začnete připravovat finální, odladěnou verzi programu pro zákazníka. Doporučoval bych vám zaškrtnout i následující políčko Report Uses of Deprecated APIs, protože byste se měli naučit nepoužívat zavržené části knihovny, takže by bylo vhodné, aby vás program na tato klopýtnutí upozornil. Zbylá políčka přeskočíme a doporučím vaší pozornosti až poslední vstupní pole Additional Compiler Options. Sem můžete zadávat direktivy překladači. Doporučil bych vám, abyste do pole zadali direktivu Xlint, která požádá překladač, aby vypisoval všechna varovná hlášení. Varovné hlášení je vždy předzvěstí potenciální chyby. Proto byste si je měli nechat vypisovat a všechna odstranit. Postupně se vám budu snažit vysvětlit, jak upravit program, aby překladač neměl před čím varovat. Stránka Documenting Zde se nastavuje, co vše se bude a nebude generovat při vytváření programátorské dokumentace. Nebudu podrobně rozebírat každou možnost ponechám vám prostor na experimenty (navíc si můžete přečíst nápovědu). Jen bych vás chtěl 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 92 z 651

93 Kapitola 3: Projekty v NetBeans Library 93 upozornit na políčko Browser Window Title, do něhož můžete zadat název stránky s dokumentací projektu. Nic strašného se ale nestane, když je necháte prázdné. Někteří budou využívat i zaškrtávací políčko Preview Generated Javadoc, jehož zaškrtnutím ovlivní, zda se bude po vytvoření programátorské dokumentace automaticky otevírat vytvořená dokumentace v okně vašeho oblíbeného prohlížeče. Někdy se to hodí, jindy to obtěžuje. Zde si můžete nastavit, co vám v daném okamžiku vyhovuje. Stránka Run Na této stránce zadáváte způsob spouštění případné aplikace. Protože náš současný projekt je knihovna, tak tuto stránku nevyužijeme. Vrátíme se k ní v příští kapitole, až vytvoříme první spustitelnou aplikaci Přejmenování projektu Jak už jsem naznačil, projekt, s nímž právě pracujeme, budeme v průběhu výkladu používat jako framework, nad nímž jsou vybudovány doprovodné příklady. Přitom nás už nebude zajímat, v kolikáté kapitole jsme se s daným projektem seznámili. Bylo by proto výhodné jej nazvat podle jeho obsahu. Ukažme si, jak jej přejmenovat na CanvasManager. 1. Klepněte pravým tlačítkem na název projektu na kartě projektů a v jeho místní nabídce zadejte příkaz Rename. (Druhou možností je, že na název dvakrát klepnete, anebo klepnete jen jednou, stisknete F2, zadáte jeho nový název a stisknete ENTER.) Otevře se dialogové okno z obrázku V něm zadejte nový název. Obrázek 3.15 Dialogové okno pro přejmenování projektu 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 93 z 651

94 94 Java 8 Úvod do objektové architektury pro mírně pokročilé 2. Všimněte si zaškrtávacího políčka Also Rename Project Folder, na něž na obrázku ukazuje šipka myši. Zaškrtnutím políčka se vedle interního názvu projektu změní i název složky, v níž je projekt uložen (zkoušejte měnit zaškrtnutí a dívejte se na výsledek v poli Project Folder). 3. Své zadání potvrďte stiskem tlačítka Rename, případně když si to rozmyslíte, tak je odvolejte stiskem tlačítka Cancel. Občas se stane, že máte ve správné složce špatně pojmenovaný projekt. Přejmenováváte-li projekt tak, aby byl pojmenován podle složky, v níž je uložen, musíte nechat políčko nezaškrtnuté, protože jinak vás bude okno upozorňovat, že takto pojmenovaná složka již existuje Definice projektu jako knihovny Před chvílí jsme si říkali, že v dialogovém okně vlastností projektu se na stránce Libraries nastavují používané knihovny. Projekt, s nímž právě pracujeme, je takovou knihovnou. Zatím to ale víme pouze my. Ukažme si, jak o tom přesvědčit také NetBeans. Obrázek 3.16 Dialogové okno správce knihoven 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 94 z 651

95 Kapitola 3: Projekty v NetBeans Library 95 Zadejte příkaz Tools Libraries. Otevře se dialogové okno správce knihoven, které vidíte na obrázku V jeho levém panelu je seznam se všemi instalovanými knihovnami. (Ve spodní třetině zobrazené části seznamu najdete knihovnu JUnit 4.10 jedinou knihovnu, kterou jsme doposud použili.) Pod seznamem je tlačítko Remove, kterým můžeme zadanou knihovnu ze seznamu odstranit (to nebudeme dělat), a tlačítko New Library (na obrázku na něj ukazuje šipka myši), které nám umožní novou knihovnu přidat. Stiskněte je. Otevře se malé dialogové okno, v němž můžeme zadat název a typ přidávané knihovny (viz obrázek 3.17). Zadejte název Canvas Manager. Obrázek 3.17 Dialogové okno pro zadání názvu a typu přidávané knihovny Vzápětí se nově zadaný název objeví v seznamu instalovaných knihoven nastavený jako vybraný. Karty v pravém panelu budou všechny prázdné, čekající na zadání příslušných adres. Na kartu Classpath zadejte umístění knihovny. Optimální je zadat cestu k jejímu JAR-souboru. Stiskněte proto tlačítko Add JAR/Folder a najděte její JAR-soubor (už víte, že je v podsložce dist složky jejího projektu). Od této chvíle můžete začít knihovnu používat, ale neměli byste k dispozici zdrojové soubory, a co hůř, ani její dokumentaci. Ty se zadávají na dalších kartách. Klepněte proto na záložku karty Sources, stiskněte tlačítko Add JAR/Folder a zadejte cestu ke kořenové složce se zdrojovými soubory (v našem případě je to podsložka src složky projektu). Složku s testovacími soubory ignorujte. Zbývá zadat ještě umístění dokumentace. Postupujte opět stejně. Klepněte na záložku karty Javadoc, stiskněte tlačítko Add JAR/Folder a zadejte cestu ke složce s dokumentací (podsložka javadoc složky dist). Od této chvíle je přidaná knihovna plnohodnotnou knihovnou NetBeans. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 95 z 651

96 96 Java 8 Úvod do objektové architektury pro mírně pokročilé Správně bych měl z našeho projektu vytvořit dvě knihovny: knihovnu obsahující třídy z balíčku util a druhou s třídami z balíčku CanvasManager, přičemž ta druhá by měla opět deklarovanou tu první jako svoji knihovnu. Tím by odpadla nutnost přidávat JAR-soubor s třídami z balíčku CanvasManager i do projektů, které správce plátna vůbec nepoužívají. Domníval jsem se ale, že oceníte spíše to, že budete moci pracovat s jedinou knihovnou i za cenu toho, že v ní bude skupina tříd, které v některých projektech nepoužijete. Instance tříd z knihovního projektu budu v běžném textu občas nazývat českými jmény vycházejícími z jejich českých názvů použitých v minulém dílu. Instance třídy CanvasManager bude proto označována jako správce plátna, instance třídy Mover jako přesouvač, instance interfejsu IMovable jako posuvný objekt atd Shrnutí co jsme se naučili Balíček cz.pecinovsky.en_cz.uoa2_j8 je pseudokořenovým balíčkem všech projektů v této knize. V dalším textu budeme intenzivně používat knihovnu CanvasManager, jejímž pseudokořenovým balíčkem je balíček cz.pecinovsky. Tato knihovna obsahuje dva podbalíčky: Balíček canvasmanager obsahuje třídu CanvasManager a všechny třídy a interfejsy, které s ní přímo spolupracují. Balíček util obsahuje třídy, které správce plátna nevyužívají. Profesionální vývojová prostředí ukládají zdrojové kód vyvíjené aplikace a zdrojové kódy testovacích tříd do oddělených stromů balíčků. Testovací třídy bývají umístěny ve stejném balíčku, jako třída testovaná (i když v jiném stromu), takže mají automaticky přístup ke všem jejím nesoukromým členům. NetBeans pracují se dvěma sadami stromů balíčků: sada standardně pojmenovaná Source packages obsahuje zdrojové soubory vyvíjeného programu, sada standardně pojmenovaná Test packages obsahuje zdrojové soubory testovacích tříd. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 96 z 651

97 Kapitola 3: Projekty v NetBeans Library 97 Karta projektů nabízí tři způsoby zobrazení stromu balíčků: List, Tree a Reduced tree. Mezi těmito zobrazeními lze kdykoliv přepnout. Balíčky můžeme vytvářet, rušit, přejmenovávat, přesouvat a kopírovat. Nový balíček i zdrojový soubor se vytvoří zadáním příkazu New v místní nabídce balíčku, v němž chceme daný objekt vytvořit. Soubory můžeme mezi balíčky přesouvat a kopírovat standardními způsoby pomocí myši či klávesnice. Dialogové okno rozbalené při přesouvání a kopírování nám umožňuje nastavit cílový projekt, cílový strom balíčků a cílový balíček. Přesun či kopírování můžeme provádět buď s refaktorací (při ní se příslušně upraví příkaz package, doplní potřebné importy a nastaví další odkazy), anebo bez ní. Při zapnuté refaktoraci můžeme stisknout tlačítko Preview a prostředí nám ukáže, co vše se chystá změnit. My pak můžeme některé z nabízených změn odmítnout. NetBeans umožňují automatickou optimalizaci importů. Abychom mohli s projektem pracovat, musíme jej nejprve přeložit a sestavit. K tomu použijeme příkaz Build, který náš projekt sestaví, anebo silnější příkaz Clean and Build, který nejprve smaže minulý výsledek a pak začne vše budovat od začátku. Průběh sestavování se zobrazuje na kartě Output. Je-li skrytá, zobrazíme ji příkazem Window Output. Při psaní programu se průběžně zobrazuje automatická nápověda s výňatky z dokumentace. Zadáním příkazu Window Other Javadoc zobrazíme okno s programátorskou dokumentací části kódu, kterou používáme. Programátorskou dokumentaci můžeme vygenerovat zadáním příkazu Generate Javadoc v místní nabídce projektu. Přeložené soubory se standardně ukládají ve složce projektu do podsložky build\classes. Výsledný jar a vygenerovaná dokumentace se standardně ukládají ve složce projektu do podsložky dist. Karta projektů zobrazuje pouze složky se zdrojovými soubory. Chceme-li si prohlédnout některý z ostatních souborů, musíme použít kartu File. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 97 z 651

98 98 Java 8 Úvod do objektové architektury pro mírně pokročilé Dialogové okno s vlastnostmi projektu otevřete např. zadáním příkazu Properties. V něm můžeme zadat řadu parametrů. Na stránce Sources zadáváme kořenové složky zdrojových a testovacích souborů. Na stránce Libraries nastavujeme používané frameworky a knihovny. Na stránce Compiling zadáváme parametry překladu a to, zda se bude při ukládání souboru tento soubor automaticky překládat. Na stránce Documenting zadáváme, co vše se bude generovat při vytváření programátorské dokumentace. Na stránce Run zadáváme parametry spuštění aplikace. Zadáním příkazu Rename v místní nabídce projektu otevřeme dialogové okno, v němž můžeme projekt přejmenovat. Zaškrtnutím políčka Also Rename Project Folder zadáme, zda se podle nového názvu projektu přejmenuje i složka s jeho soubory. Chceme-li projekt definovat jako knihovnu, zadáme v nabídce Tools povel Libraries. Následně otevřené dialogové okno nám umožní zadat vše potřebné. Instance tříd z knihovního projektu budu občas nazývat českými jmény vycházejícími z jejich českých názvů použitých v minulém dílu. Upravenou podobu knihovního projektu, k níž jsme se propracovali na konci této lekce, najdete v projektu CanvasManager. Výsledný projekt se od původního liší pouze v rozdělení obsahu testovacího stromu do balíčků. To ale nemá na funkci knihovny vliv (testovací soubory v JARu nejsou), takže je jedno, kterou verzi jste zařadili jako knihovnu. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 98 z 651

99 00 Kapitola 4: Vytváříme nový projekt AHA Vytváříme nový projekt AHA Kapitola 4 Vytváříme nový projekt AHA Co se v kapitole naučíte V předchozí kapitole jste pracovali s předpřipraveným projektem, v této kapitole začnete vytvářet nový projekt zcela od nuly. Bude to ale jenom velice jednoduchý AHA-projekt, jenž bude sloužit pouze k představení dalších funkcí vývojového prostředí, které vám pomohou při vaší práci. V této kapitole nebudeme otevírat žádný existující projekt, ale vytvoříme si sami nový, vlastní projekt, který nazveme N204a_AHA a v závěru kapitoly jej zase smažeme. Těm, kteří nečetli první díl, bych jenom připomněl, že termín AHA-příklad (AHA-projekt) označuje příklad (projekt), jehož jediným cílem je vysvětlit čtenáři funkci popisované konstrukce, tj. aby si čtenář po jeho prostudování řekl: Aha, takto to funguje!. 4.1 Vytvoření nového projektu Vytvoření nového projektu spustíte buď na panelu nástrojů aktivací nástroje New Project (standardně druhý zleva), nebo stiskem klávesové zkratky CTRL+SHIFT+N, anebo zadáním příkazu File New Project. Tím otevřete dialogové okno s několika panely (viz obrázek 4.1). Levý je nadepsaný Steps a je v něm načatý seznam kroků, který se doplní v okamžiku, kdy si vyberete typ vytvářeného projektu. Pravý panel nadepsaný Choose Project má tři komponenty: 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 99 z 651

100 100 Java 8 Úvod do objektové architektury pro mírně pokročilé Komponenta Categories obsahuje strom s oblastmi zájmu podporovanými instalovanou konfigurací. My budeme v průběhu této knihy zůstávat u programů pro Javu. Komponenta Projects obsahuje seznam druhů projektů, které je možno pro danou oblast zájmu vytvořit. Za chvíli si o jednotlivých možnostech povíme podrobněji. Komponenta Description obsahuje velice stručnou charakteristiku typu projektu vybraného v seznamu Projects. Obrázek 4.1 Dialogové okno pro otevření nového projektu Podívejme se nyní podrobněji na nabídku typů projektů pro Javu: Java Application vytvoří prázdný projekt s tím, že ve složce projektu vytvoří podsložku src určenou pro uložení zdrojových souborů a přednastaví vytvoření podsložky test pro testovací soubory. Podsložka test se ale vytvoří až po vytvoření první testovací třídy (pokud ji samozřejmě předtím nevytvoříte sami ručně). Při vytváření nového aplikačního projektu vám dialogové okno New Java Application (viz obrázek 4.2) nabídne vytvoření kostry hlavní třídy s metodou main(string[]). Přijmete-li tuto nabídku, případně zadáte-li třídu s vlastním názvem a balíčkem, NetBeans v této třídě vytvoří prázdnou metodu main(string[]) a přednastaví v konfiguraci projektu tuto třídu jako spouštěcí. Toto nastavení ale budete moci v budoucnu kdykoliv změnit. Důležitou vlastností tohoto druhu projektu je, že při sestavování výsledného programu budou NetBeans vytvářet spustitelný soubor JAR (musí ovšem vědět, která třída bude ta hlavní za chvíli si ukážeme, jak jim to vysvětlit). 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 100 z 651

101 Kapitola 4: Vytváříme nový projekt AHA 101 Java Class Library udělá totéž, jenom vám nenabídne vytvoření kostru hlavní třídy a při sestavování nebude výsledný soubor JAR vytvářen jako spustitelný. Bude to pouze knihovna, kterou mohou jiné programy využívat. Nicméně i ten můžete později přesvědčit o změně svého původního úmyslu a nechat jej vytvářet spustitelné aplikace. Java Project with Existing Sources vytvoří nový projekt s tím, že ve složce projektu nepřipraví prázdnou podsložku src pro zdrojové soubory ani nepřednastaví podsložku test pro testovací soubory, ale umožní vám zadat vlastní složky se zdrojovými a testovacími soubory. Toho můžete využít tehdy, rozhodnete-li se vytvořit projekt používající zdrojové soubory z jiného projektu vytvořeného např. v BlueJ. Připravte se ale na to, že NetBeans ověřují, že žádné dva projekty nepoužívají společnou kořenovou složku zdrojových souborů. Budete-li něco takového potřebovat, definujte tuto složku jako součást samostatného projektu, který oba zájemci (projekty) importují (ukážeme si to v podkapitole 6.4 Použití frameworku či knihovny na straně 143). Java Free-Form Project vytvoří nový projekt, kterému vedle umístění zdrojových a testovacích souborů zadáte také umístění konfiguračních souborů. Tento typ projektů nebudeme v knize používat. My si tentokrát vybereme první z možností. Ponechte proto vybranou kategorii Java a projekt Java Application a stiskněte Next>. Pravý panel se změní do podoby z obrázku 4.2. Pojďme si projít jeho vstupní pole: Obrázek 4.2 Dialogové okno pro zadání údajů o vytvářené aplikaci 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 101 z 651

102 102 Java 8 Úvod do objektové architektury pro mírně pokročilé Do pole Project Name se zadává název projektu, který musí být platným názvem souboru. Vytvoříme zpočátku pouze cvičný projekt, na němž si některé věci vyzkoušíme. Protože jediným cílem tohoto projektu je ukázat vám, jak některé věci fungují (vyvolat AHA-efekt), nazveme jej N204a_AHA. Do pole Project Location se zadává cesta ke složce s vašimi projekty. Nemusíte mít všechny projekty ve stejné složce, ale bývá zvykem umisťovat spolu související projekty společně. Po instalaci nabízejí NetBeans složku nazvanou NetBeansProjects a umístěnou ve vaší uživatelské složce. Je na vás, jestli tuto nabídku přijmete, nebo se rozhodnete vytvořit složku vlastní. Já jsem se rozhodl, že si pro projekty k této učebnici definuji zvláštní složku, kterou následně na počítači substituuji jako disk J: 6 (o substituci disků jsem hovořil v minulém dílu). Pak mi může být jedno, že v různých firmách mám při výkladu tuto složku umístěnou podle zvyklostí dané firmy, a tedy pokaždé trochu jinde. Disk J: nebývá prakticky nikdy blokovaný, takže pro mne je pak prostředí téměř pokaždé stejné. Pokud střídáte počítače, zkuste si i vy nastavit prostředí tak, abyste byli subjektivně pokaždé tamtéž. Pole Project Folder zobrazuje složku, do níž bude projekt umístěn. Jak se můžete přesvědčit, cesta k této složce vznikne složením obsahů obou výše jmenovaných polí. Zaškrtávacího políčka Use Dedicated Folder for Storing Libraries si nebudeme všímat. Uplatní se v případě, kdy potřebuje několik projektů nestandardně sdílet stejnou sadu knihoven, což nám prozatím nehrozí. Zaškrtnutím políčka Create Main Class žádáte NetBeans, aby vám vytvořily hlavní třídu vaší budoucí aplikace. V následujícím vstupním poli pak zadáte úplný název této třídy (tj. název třídy včetně názvu balíčku). NetBeans vám nabídnou název třídy i jejího balíčku odvozený z vytvářeného projektu. Pokud jste zadali to, co jsem vám doporučoval, mělo by zde být n204a_aha.n204a_aha. V našich nejbližších projektech hlavní třídu potřebovat nebudeme, protože nebudeme vyvíjet samostatně spustitelné aplikace. Nějakou dobu budeme vše, co vyvineme, prověřovat pouze prostřednictvím testů. Nicméně tento projekt je zkušební, určený ke smazání, takže políčko necháme zaškrtnuté, ať víte, jak bude výsledný projekt vypadat. Abyste si vyzkoušeli, že můžete pro hlavní třídu zvolit 6 Prosím milovníky Linuxu a počítačů Apple, aby mi nespílali za volbu operačního systému. 85 % studentů a dalších účastníků mých kurzů používá Windows, takže pro mne je volba operačního systému jasná používám ten, co převážná většina mých zákazníků. Předpokládám, že stejné zastoupení budou mít i mezi čtenáři této knihy, a proto se jim snažím vyjít vstříc. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 102 z 651

103 Kapitola 4: Vytváříme nový projekt AHA 103 složitější balíček, který navíc není přímo odvozen z názvu projektu, zkuste zadat např. cz.project.aha.aha. Až budete mít vše nastavené, stiskněte tlačítko Finish a nechte projekt vytvořit. Vytvořený projekt se objeví na kartě projektů a zároveň se otevře zdrojový kód právě vytvořené testovací třídy v editoru. 4.2 Spuštění aplikace Začneme tím, že vyzkoušíme, zda můžeme vytvořit spustitelný projekt. 1. Nemažte komentář v metodě main (za chvíli o něm budeme mluvit), ale odřádkujte a zadejte za něj nějaký příkaz stačí obyčejný tisk. Napište např. sout a stiskněte tabulátor. NetBeans nahradí spouštěcí slovo příkazem System.out.println(""); a umístí kurzor mezi uvozovky. 2. Napište mezi uvozovky např. text Standardní výstup. 3. Stiskem CTRL+S zdrojový kód uložte. (Obecně ale není ukládání před překladem či spuštěním nutné, protože NetBeans před spuštěním stejně všechno nejprve uloží.) Vyzkoušíme si přímé spuštění dané aplikace z NetBeans. Všimněte si, že třída má na kartě projektu na spodku pravého okraje své ikony zelenou šipku doprava. Ta označuje, že se jedná o hlavní třídu aplikace, kterou je možno spustit. Hlavní třída se spustí buď zadáním povelu Run z její místní nabídky, anebo aktivací dané třídy (pracujete-li zrovna v editoru s jejím zdrojovým kódem, je aktivní) a stiskem klávesové zkratky SHIFT+F6. Po spuštění třídy by se měla otevřít karta výstupu a na ní by měl být (vedle dalších řádků) vytištěn zadaný text. 4.3 Vytvoření kopie třídy Chtěl bych vám ukázat, že mezi hlavními třídami aplikace je možno přepínat. Vytvoříme si proto kopii naší třídy. Postup je skoro stejný, jako když jsme přesouvali interfejs: 1. V panelu projektů uchopte danou třídu. 2. Přeneste ji nad její balíček. 3. Stiskněte přeřaďovač CTRL. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 103 z 651

104 104 Java 8 Úvod do objektové architektury pro mírně pokročilé 4. Podle ikony u kurzoru myši zkontrolujte, že NetBeans opravdu vědí, že chcete třídu kopírovat (u kurzoru musí být čtvereček se znakem +). 5. Třídu upusťte. Druhou možností, jak třídu zkopírovat, je klepnout na ni na kartě projektu, zkopírovat ji do schránky (CTRL+C nebo příkaz Copy v její místní nabídce), klepnout na balíček a vložit ji ze schránky (CTRL+V nebo příkaz Paste Refactor Copy v její místní nabídce). V obou případech se otevře dialogové okno Copy Class z obrázku 4.3. Při použití některého z výše uvedených způsobů budou políčka Project, Location a To Package, která zobrazují cílový projekt, sadu zdrojových složek a cílový balíček, neaktivní. Kdybyste kopírovanou třídu upustili do prostoru mezi projekty, byla by tato políčka aktivní a umožnila by vám zadat jak cílový projekt, tak požadovaný strom balíčků. Obrázek 4.3 Dialogové okno otevřené při kopírování třídy Tak jako při přesouvání tříd mezi balíčky, máme i zde možnost vybrat si, zda se má uplatnit refaktorace (tj. zda se má např. přizpůsobit název třídy názvu cílového souboru, zda se mají upravit typy návratových hodnot konstruktorů atd.). Doporučuji určitě zaškrtnout. (Přece se s tím nebudete dělat ručně.) Nabízený název v poli New Name změníme nabízenou jedničku nahradíme písmenem W, protože třída bude mít co dělat s okny. Zdrojový kód třídy se po zkopírování ihned otevře v panelu editoru, takže ji můžete začít rovnou upravovat. 4.4 Nápověda při psaní kódu Upravíme tělo metody main, aby dělalo něco jiného než v předchozím případě např. aby vytisklo text do okna. Postupujte následovně: 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 104 z 651

105 Kapitola 4: Vytváříme nový projekt AHA Smažte v těle metody main(string[]) příkaz tisku na standardní výstup. 2. Napište J. Pokud jste při nastavování vlastností zadali, že má editor začít napovídat, jakmile začnete psát identifikátor, nabídne vám seznam identifikátorů java, javafx, javax a jdk. 3. Pokračujte napsáním Op. Seznam se změní na delší, přičemž jako první zobrazovaná položka by měl být název třídy JOptionPane. 4. Stiskem ENTER nabídku potvrďte. Editor doplní identifikátor a nahoru do oblasti importů přidá import právě použité třídy. 5. Pokračujte v psaní napište tečku. Objeví se seznam s řadou identifikátorů, které nás prozatím nebudou zajímat. 6. Napište malé s. Seznam zestruční a bude nabízet pouze identifikátory začínající s nebo S. 7. Napište velké M. Seznam opět zestruční a zůstanou v něm jenom tři přetížené verze metody showmessagedialog. 8. Stiskem ENTER zvolte první z nich. Editor doplní příkaz a jako hodnotu prvního parametru vám nabídne null. 9. Stiskem ENTER potvrďte nabídku. Editor zvýrazní druhý parametr, v němž nabízí args. 10. To se nám nehodí, takže místo něj napište např. "Okenní výstup" (nezapomeňte na uvozovky) a stiskem ENTER zadání potvrďte. 11. Jakmile začnete pracovat s okny, musíte se postarat o korektní ukončení běhu programu, protože jinak program stále čeká, až po něm budete něco chtít. Nejjednodušší bývá vložit do místa, kde má program skončit, příkaz: System.exit(0) Přidejte jej proto na konec těla vytvářené metody. Tentokrát můžete vyzkoušet, že program je možno spustit i bez explicitního ukládání. Stiskněte SHIFT+F6 nebo jiným z výše uvedených způsobů spusťte program. Objeví se dialogové okno oznamující, že se jedná o okenní výstup. 4.5 Zadání spouštěcí třídy projektu Zatím jsme využívali toho, že třídu s metodou main(string[]) jde přímo spustit. Když se ale rozhodneme sestavit projekt do souboru JAR, musíme také sdělit, která z hlavních tříd je ta pravá. Toho dosáhneme v okně vlastností projektu na stránce Run. Otevřete ji její podobu vidíte na obrázku 4.4. Ve vstupním poli Main Class je úplný název hlavní třídy, kterou jste si nechali vytvořit při vytváření projektu. Můžete jej ale změnit stačí stisknout tlačítko Browse a vybrat si z následně otevřeného seznamu hlavních tříd daného projektu. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 105 z 651

106 106 Java 8 Úvod do objektové architektury pro mírně pokročilé Obrázek 4.4 Nastavování vlastností pro spuštění aplikace 4.6 Spouštěcí konfigurace NetBeans umožňují definovat několik spouštěcích konfigurací, mezi nimiž je pak možno přepínat. Každá z nich bude mít svoje jméno, abyste se v nich snáze vyznali. Budete-li chtít zadat další konfiguraci, stiskněte nahoře tlačítko New. Otevře se dialogové okno žádající o zadání názvu dané konfigurace. Zadejte např. System a své zadání potvrďte. Zadaný název se objeví v poli Configuration. Nyní zkontrolujte, že v poli Main Class je zadán plný název třídy tisknoucí na standardní výstup u mne je to třída cz.project.aha.aha. Tím jste hotovi. Poslední akci zopakujeme. Stiskněte opět tlačítko New a v následně otevřeném dialogovém okně zadejte Windows a své zadání potvrďte. Jako hlavní třídu aplikace pak zadejte třídu cz.project.aha.ahaw nejlépe vybráním ze seznamu. Když nyní klepnete na rozbalovací tlačítko pole Configuration, uvidíte seznam se třemi konfiguracemi: implicitní konfigurací označenou <default config> a dvěma konfiguracemi, které jste právě zadali. Vyzkoušíme, jak fungují. Potvrďte své zadání stiskem OK a vraťte se do IDE. V rozbalovacím seznamu na panelu nástrojů se objevila poslední zadaná konfigurace v našem případě Windows (viz obrázek 4.5). Stisknete-li nástroj pro spouštění projektů (na obrázku na něj ukazuje kurzor myši viz následující poznámku), spustí se aktuální konfigurace. Když v rozbalovacím seznamu spouštěcích konfigurací vyberete jinou konfiguraci, spustí se ta. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 106 z 651

107 Kapitola 4: Vytváříme nový projekt AHA 107 Poslední položkou tohoto seznamu je Customize. Jejím zadáním otevřete okno vlastností projektu z obrázku 4.4. V tomto okně můžete upravit či zrušit stávající zadání nebo přidat zadání nová. Obrázek 4.5 Spuštění projektu podle nastavené konfigurace Některé z vás asi zaskočí, že na obrázku je panel nástrojů orientovaný svisle. To je proto, že jsem šířku okna omezil na 750 bodů, aby pro vás byly texty na obrázcích čitelné. Pak se ale zákonitě panel nástrojů na vodorovnou lištu celý nevešel. NetBeans proto zobrazí, kolik mohou, a za poslední zobrazený nástroj přidají tlačítko, po jehož stisku se rozbalí pokračování panelu nástrojů, které se do původně vyhrazeného prostoru nevešlo. Na obrázku 4.5 se rozbalilo směrem dolů, a tam jsem také potřebný nástroj našel a ukázal na něj myší. Předpokládám ale, že na vašich počítačích budete mít okno NetBeans dostatečně široké, takže nástroj spuštění projektu bude zobrazen na vodorovné listě. 4.7 Vytvoření a spuštění aplikace Když jsme v minulém dílu vytvářeli hru UFO, učili jsme se, jak vytvořit aplikaci, kterou bude možno spustit kdekoliv, kde je instalováno běhové prostředí Javy označované zkratkou JRE. Ukažme si totéž s NetBeans. V podkapitole 3.6 Překlad a sestavení projektu na straně 87 jsme si vysvětlovali, jak NetBeans požádat o sestavení projektu a vytvoření souboru JAR. Při sestavování se přitom použije aktuálně nastavená konfigurace. Vyzkoušejte si to. Sestavte výsledný program při nastavení Windows a vytvořený JAR poklepáním spusťte. Mělo by se otevřít dialogové okno. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 107 z 651

108 108 Java 8 Úvod do objektové architektury pro mírně pokročilé Nyní se vraťte do NetBeans, přepněte seznam na konfiguraci System a znovu spusťte sestavení souboru JAR. Nyní by měl vypisovat výsledky do standardního výstupu. Pracujete-li ale pod operačním systémem Windows, zřejmě nic neuvidíte. Musíte nejprve otevřít okno příkazového řádku a zadat příkaz java jar xxx.jar kde xxx zastupuje absolutní nebo relativní cestu k souboru. Ve Windows se totiž místo programu java.exe spouští implicitně program javaw.exe, který předpokládá, že veškerá komunikace probíhá prostřednictvím oken a okno se standardním konzolovým vstupem a výstupem vůbec neotevírá. 4.8 Paralelní spuštění více aplikací Než se s naším AHA-projektem rozloučíme, chtěl bych vám ještě ukázat, že v NetBeans můžeme spustit několik aplikací současně, a to i několik instancí téhož projektu. Většinou to není naším úmyslem, ale občas se opravdu stává, že spustíme další instanci vyvíjené aplikace, aniž bychom předchozí instanci ukončili. S každou další instancí aplikace se musí spustit nová instance virtuálního stroje. Zažil jsem situaci, kdy se student rozčiloval nad slabým výkonem svého počítače a paměťovou nenasytností vývojového prostředí, a přitom si vůbec nevšiml, že má paralelně spuštěno třicet instancí svého programu (a s nimi zákonitě třicet instancí virtuálního stroje). Pojďme si tedy ukázat, jak to zjistíme a jak můžeme dříve spuštěné instance jednoduše ukončit. Budeme to zkoušet na okenní verzi našeho programu, protože program zapisující na standardní výstup se ukončí dřív, než bychom stihli ten druhý spustit. Spusťte proto okenní verzi naší aplikace, nechte otevřené dialogové okno bez povšimnutí a spusťte ji ještě podruhé a potřetí. Po prvním spuštění se ve spodním okraji aplikačního okna NetBeans objevila lišta symbolizující, že jste spustili aplikaci. Po její levé straně bude vypsán název projektu následován závorkami s textem run-single, po pravé straně ukončovací ikona. Při spuštění další instance aplikace se v závorkách po levé straně objeví samotné run a za závorkami znak # následovaný pořadovým číslem právě spuštěné aplikace. S každou další spuštěnou aplikací toto číslo roste. Ukážete-li na název projektu či na lištu, vyskočí výzva tasks running. Click for details. kde znak zastupuje počet aktuálně běžících programů. Poslechnete-li výzvu a klepnete-li na text či na lištu, rozbalí se okno s výpisem běžících programů. Na obrázku 4.6 jsem na ni klepl v okamžiku, kdy byly zrovna paralelně spuštěny tři 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 108 z 651

109 Kapitola 4: Vytváříme nový projekt AHA 109 instance okenní verze našeho programu. Text (run) přitom naznačuje, že jsem danou instanci spustil jako projekt, kdežto text (run-single) prozrazuje, že jsem ji spustil prostřednictvím přímého spuštění třídy s metodou main(string[]). Obrázek 4.6 Aplikační okno oznamující, že jsou právě paralelně spuštěny tři instance programu Tentokrát umíme aplikace ukončit stačí stisknout tlačítko OK v otevřeném dialogovém okně nebo toto okno zavřít. Občas se ale stává, že se aplikace dostane do stavu, kdy ji neumíme řádně ukončit. V BlueJ jsme takovéto situace řešili žádostí o restart virtuálního stroje. Tady stačí klepnout na ukončovací tlačítko. Prostředí se vás pak pro jistotu zeptá, jestli opravdu chcete aplikaci ukončit, a pokud svůj záměr potvrdíte, tak aplikaci ukončí. Vyzkoušejte si to s našimi paralelně spuštěnými aplikacemi. 4.9 Shrnutí co jsme se naučili Při vytváření nového projektu v Javě si můžeme vybrat mezi tím, zda budeme vytvářet aplikaci nebo knihovnu. Při vytváření aplikace se zadanou hlavní třídou se NetBeans postarají, aby se při sestavování vytvořil spustitelný soubor JAR. V dialogovém okně pro přípravu vytvářeného projektu se zadává zvlášť název vytvářeného projektu a složka, v níž bude projekt umístěn. Spolu související projekty bývá zvykem umisťovat do společné rodičovské složky. Spuštění třídy se zadá příkazem Run v její místní nabídce v panelu projektů či editoru. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 109 z 651

110 110 Java 8 Úvod do objektové architektury pro mírně pokročilé Zdrojový kód třídy je možno kopírovat za pomoci klávesnice či myši. Při kopírování do stejného balíčku musíme název třídy změnit. Refaktorační modul se postará o promítnutí potřebných změn do zdrojového kódu. Máme-li v konfiguraci aktivované napovídání, budou NetBeans napovídat již v průběhu našeho psaní. Pokud tak neučiní, můžeme je vybídnout stiskem klávesové zkratky CTRL+MEZERA. NetBeans se snaží zařadit do nápovědy pouze ty názvy, o nichž se domnívají, že je budeme chtít použít. Není-li mezi nabídnutými názvy hledaný, můžeme dalším stiskem zkratky CTRL+MEZERA požádat o kompletaci nabídky. Nabídnutou verzi akceptujeme zadáním ENTER nebo nějakého oddělovače např. tečky. Nechceme-li akceptovat nabídnuté zadání, můžeme je odvolat např. stiskem klávesy ESC. Po zadání verze metody, jejíž volání chceme do programu zapsat, nám NetBeans začnou napovídat při zadávání jejích parametrů. Spouštěcí třídu projektu zadáváme v okně vlastností projektu. NetBeans umožňují zadat několik různých verzí spouštění projektu. Jednotlivé verze musíme pojmenovat. Aktuálně platná konfigurace se zobrazuje v rozbalovacím seznamu na panelu nástrojů. Zadáním jiné hodnoty v tomto seznamu ji můžeme změnit. Zadáním hodnoty Customize otevřeme okno vlastností daného projektu, v němž můžeme upravit či zrušit stávající konfigurace nebo přidat nové. Při sestavení programu překladač ve výstupním okně uvádí, kde leží vytvořený JAR-soubor. Jedná-li se o spustitelný program, dozvíte se na konci i to, jak má vypadat spouštěcí příkaz pro případ, že budete program spouštět z příkazového řádku. NetBeans umožňují spustit několik instancí téhož programu současně. Ve stavovém řádku je indikační panel, jehož rozklepnutím se dozvíme, které aplikace máme právě spuštěny. Neumíme-li aplikaci ukončit přímo, můžeme ji ukončit klepnutím na zavírací tlačítko dané aplikace v tomto panelu. Protože jsme projekt smazali, tak nám z něj nic nezbylo. Kdo by se ale chtěl podívat, jak měl vypadat náš AHA-projekt před smazáním, nalezne jej v projektu N204a_AHA. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 110 z 651

111 00 Kapitola 5: Práce na připraveném projektu Elevator Práce na připraveném projektu Elevator Kapitola 5 Práce na připraveném projektu Elevator Co se v kapitole naučíte Prozatím jsme stále něco prohlíželi a nastavovali a moc jste si nezaprogramovali. Nyní bychom to měli alespoň trochu napravit. V této kapitole vám ukážu, jak se pracuje na předpřipraveném projektu, a při té příležitosti vás seznámím s některými vlastnostmi NetBeans, které vám mohou pomoci při vaší práci. V této kapitole otevřeme předpřipravený projekt N205a_Elevators, který bude obsahovat poloprázdnou třídu pro vaše řešení a vzorové verze možných řešení zadaného problému. 5.1 Poloprázdná třída a metoda Než se pustíme do vlastního výkladu, měli bychom si nejprve připomenout trochu terminologie. Těm, kteří nečetli minulý díl, bych měl prozradit, že za poloprázdnou označuji třídu, která má sice definovány všechny potřebné metody (konstruktor je také metoda), avšak tyto metody jsou prázdné či poloprázdné. Metodu označuji za poloprázdnou tehdy, pokud její tělo obsahuje pouze příkaz, který způsobí běhovou chybu oznamující, že metoda není korektně definována. Dokud tedy nedefinujete správné tělo metody, půjde třída přeložit, ale poloprázdné metody nepůjdou spustit. 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 111 z 651

112 112 Java 8 Úvod do objektové architektury pro mírně pokročilé Těla poloprázdných metod generovaných prostředím NetBeans obsahují komentář //TODO upozorňující na to, že jejich definice není plnohodnotná (o těchto komentářích jsem hovořil v pasáži Karta Action Items na straně 67), následovaný příkazem throw new UnsupportedOperationException("Not supported yet."); který vyhodí výjimku oznamující, že daná metoda ještě není definovaná (oznamovací text zadávaný v parametru se samozřejmě může lišit). O výjimkách vám pro tuto chvíli povím pouze to, že to jsou objekty upozorňující na chybu programu a že se jim budeme podrobněji věnovat v kapitole 9 Program ve výjimečné situaci na straně 202. Jako prázdné pak označujeme metody, které mají prázdné tělo. Prázdné tedy mohou být jen konstruktory a metody s návratovým typem void, protože těla těch ostatních musejí obsahovat příkaz return. Používat prázdné metody místo poloprázdných není vhodné, protože když někdo takovou nehotovou metodu zavolá, nedá se poznat, jestli je tato metoda prázdná záměrně (občas takové metody potřebujeme), anebo jenom čeká na svoje definitivní tělo. Snadno tak na jejich dokončení zapomeneme. 5.2 Zadání Jak jsem v preambuli kapitoly řekl, nejprve si ukážeme práci na předpřipraveném projektu, který má simulovat provoz výtahů. Úkolem je definovat třídu Elevator, jejíž instance budou simulovat výtahy: Budou schopny jezdit nahoru a dolů v zadaném sloupci plátna. Na požádání budou umět přijet do zadaného patra, případně do patra, kde čeká zadaný pasažér, naložit tohoto pasažéra (grafický obrazec), odvézt jej do požadovaného patra a tam jej vyložit zadaným směrem do sousedního sloupce. Prozatím se omezte na výtah pro jediného pasažéra. Zadání jsem se pokusil navrhnout jako rozumný kompromis mezi obecným (např. simulujte provoz výtahu ) a konkrétním, popisujícím detailně jednotlivé požadavky. Dopředu říkám, že nebudeme simulovat provoz skutečných výtahů. Budeme se pouze snažit vytvořit animaci, která takovýto provoz simuluje. Zkuste si nejprve promyslet, jaké by měla mít konstruovaná třída vlastnosti a jaké by měla mít metody (tj. na jaké zprávy by měla umět reagovat), a teprve pak čtěte dál a porovnejte si svůj přístup s tím, který se vám tu budu snažit vnucovat já. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 112 z 651

113 Kapitola 5: Práce na připraveném projektu Elevator 113 Chcete-li mít před analýzou problému trochu jasnější představu o tom, co se po vás požaduje, otevřete na kartě projektů složku s testovacími třídami projektu N205a_Elevators (složka Test Packages) a v místní nabídce třídy ThreeElevatorsTest zadejte příkaz Run. Obrázek 5.1 Aplikační okno simulace výtahů 5.3 Analýza problému Před tím, než začneme programovat, bychom se měli zamyslet nad tím, co po třídě a jejích instancích budeme chtít. Na jaké zprávy mají umět reagovat a které metody by proto měly poskytovat. Sjednocení různých řešení V simulaci jste si určitě všimli, že každý z výtahů se chová trochu jinak. Liší se barvou a rychlostí, ale hlavně se liší tím, jak realizují vlastní přesun: Jeden se tváří, že do něj pasažér nastupuje z boku a v cílovém patře zase z boku vyleze. Druhý se chová tak trochu jako páternoster 7 pasažér do něj nastoupí a my na něj celou cestu vidíme. 7 Byl jsem upozorněn, že se tento druh výtahů jmenuje správně česky oběžný výtah. Těžko mu ale říkat výtah, když podle právních předpisů to není žádný výtah, ale pouhé zdvihací zařízení. Pokud jste se s ním ještě nepotkali, tak je to řada otevřených kabinek obíhajících stále Pokračování na další straně: 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 113 z 651

114 114 Java 8 Úvod do objektové architektury pro mírně pokročilé Třetí je klasický výtah s dveřmi, do něhož pasažér nastoupí, výtah za ním zavře zasunovací dveře, odveze jej do požadovaného cílového patra, tam otevře dveře a pasažér opět vystoupí. Určitě byste přišli i na další způsoby, jak svůj výtah odlišit. Na druhou stranu je ale zřejmé, že všechny výtahy mají mnoho společného, takže bychom je všechny mohli považovat za speciální případy nějakého společného rodiče. 8 Definujeme proto interfejs IElevator, jenž bude deklarovat společné vlastnosti všech výtahů. Uvedeme v něm všechny metody, které v průběhu následné analýzy navrhneme, a do kontraktu přidáme i požadavky na konstruktory. Implementované interfejsy Pojďme tedy k návrhu našeho řešení. Nejprve bychom se měli zamyslet nad základní charakteristikou třídy. Víme, že třída má na animačním plátně simulovat výtah. Musí jej tedy umět zobrazit a k tomu nutně potřebuje implementovat interfejs IPaintable. Interfejs IElevator proto musí být jeho potomek. Výtah by se měl pohybovat, a to pokud možno plynule. K tomu bychom mohli využít přesouvače. Abychom mohli využít přesouvače, musí třída implementovat interfejs IMovable. Opět z toho plyne, že interfejs IElevator musí být jeho potomek. Interfejs IMovable je potomkem interfejsu IPaintable. Stačí tedy, když náš sjednocující interfejs IElevator bude potomkem IMovable. Tím bude automaticky zajištěno, že instance všech tříd, které budou implementovat interfejs IElevator, se budou schopny zaregistrovat u správce plátna (instance třídy CanvasManager), na požádání se nakreslit na plátno dodaným kreslítkem (instance třídy Painter) a nechat se plynule přesouvat přesouvačem (instance třídy Mover). Okolí Pojďme nyní abstrahovat zadání a podívat se, jak bychom je mohli realizovat s prostředky, které máme k dispozici. Náš výtah se bude pohybovat na plátně a ze zadání víme, že se bude pohybovat v jednom ze sloupců. Ten budeme považovat za výtahovou šachtu. Asi by bylo rozumné považovat za patra budovy jednotlivé řady políček. kolem dokola. Nastupuje se a vystupuje za chodu. Kdo zapomene včas vystoupit, může projet spodní či horní obrátkou a vystoupit cestou opačným směrem. Škoda, že se tyto výtahy (pardon: zdvihací zařízení) nesmějí do nových budov instalovat. 8 Prozatím umíme definovat jako společného rodiče pouze interfejs, ve třetí části této učebnice se naučíte definovat společného rodiče i jako třídu. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 114 z 651

115 Kapitola 5: Práce na připraveném projektu Elevator 115 Dohodněme se, že patra budeme počítat odspodu plátna tak, že spodní řádek bude představovat přízemí, tj. 0. (nulté) patro. Sloupce pak budeme počítat zleva doprava, přičemž levý sloupec bude mít pořadí 0 (nula). Aby byl výtah výtahem, musí být schopen něco vozit. Náš výtah bude vozit pasažéry, což budou grafické objekty. Protože se budou pasažéři výtahem přesouvat (a tušíme, že je budeme přesouvat přesouvačem), měly by implementovat interfejs IMovable. Kdykoliv budeme proto někde potřebovat deklarovat pasažéra (většinou to bude parametr), budeme deklarovat objekt typu IMovable (tj. instanci třídy implementující tento interfejs). Pro zjednodušení budeme skrytě předpokládat, že pasažér je definován tak, aby se právě vešel do jednoho políčka plátna, a že jeho cílové souřadnice budeme moci nastavit jako souřadnice levého horního rohu políčka, do kterého jej budeme chtít přesunout. Teoreticky bychom pasažéra mohli definovat jako instanci třídy implementující interfejs pojmenovaný např. IPassenger. Tím bychom ale nic nezískali, snad s výjimkou toho, že bychom měli zaručeno, že pasažér se vejde právě do jednoho políčka plátna. Naším úkolem je ale definovat třídu výtahu a definice třídy pasažéra by nás pouze odváděla od hlavního úkolu. Zůstaneme proto u původního požadavku na objekt implementující IMovable, kterému někdo z venku definuje tu správnou velikost. Konstruktory Třídu jsme tedy zasadili do jejího budoucího okolí. Podívejme se nyní na to, jak bychom měli vytvářet její instance. Navrhněme, jaké budeme potřebovat konstruktory, co vše jim musíme říci, aby pro nás vytvořily potřebný výtah, a jaké základní vlastnosti by měl čerstvě zkonstruovaný výtah mít. Začnu od konce. Čerstvě zkonstruovaný výtah by se měl zobrazit jako čtverec zabírající právě jedno políčko plátna a měl by být na počátku umístěn v přízemí, tj. ve spodním políčku svého sloupce. Zkusíme definovat dva konstruktory: první bude nejjednodušší možný, druhý umožní nastavit některé další vlastnosti vytvářeného výtahu. Pokud jste si přehráli výše zmíněnou testovací animaci, mohli bychom se asi shodnout na tom, že i nejjednoduššímu konstruktoru bychom měli zadat alespoň sloupec, v němž bude výtah jezdit. Tento konstruktor by tak měl mít ve třídě Elevator hlavičku (signaturu): public Elevator(int column) 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 115 z 651

116 116 Java 8 Úvod do objektové architektury pro mírně pokročilé Dva přístupy k řešení problému Při řešení složitějších problémů bývá výhodné je dekomponovat na problémy jednodušší a ty, pokud ještě nejsou triviální, dále dělit. Tato operace bývá označována jako dekompozice problému. Když začnete dekomponovaný problém řešit, můžete obecně postupovat dvěma způsoby: Při přístupu shora dolů (anglicky top-down design) se nejprve pokusíte navrhnout celkové řešení, přičemž doposud nevyřešené části nahradíte nějakými záslepkami, které sice budou mít příslušnou signaturu, ale řešení jejich kontraktu je v prvou chvíli v nedohlednu. Výhodou tohoto přístupu je to, že od začátku máte představu o celkovém řešení, nevýhodou je to, že si je nemůžete vyzkoušet, protože musíte počkat, až budou naprogramovány metody v té nejnižší vrstvě. Při přístupu zdola nahoru (anglicky bottom up) se naopak odpichujete ode dna a začnete řešit části projektu, které můžete ihned rozchodit. Až je budete mít hotové, přejdete k řešení problémů, které ke svému naprogramování nepotřebují nic jiného, než ty části, které jste naprogramovali v minulém kroku. Výhodou tohoto řešení je, že vám od počátku něco chodí, jeho nevýhodou na druhou stranu je, že po příchodu k vyšším hladinám můžete odhalit, že jste měli něco navrhnout jinak, mnohem častěji, než při přístupu shora dolů. Existuje ještě třetí způsob, který je kombinací těch dvou. Při něm se většinou navrhne část projektu postupem zdola nahoru, abychom měli v ruce něco, co bude doopravdy chodit. Když si ujasníme řešení tohoto přízemí, navrhneme zbytek projektu metodou shora dolů. Tento způsob se sice snaží eliminovat nevýhody předchozích dvou, a mít od samého začátku k dispozici kód, který je funkční a mohu jej např. vkládat do nejrůznějších záslepek, ale na druhou stranu se při něm občas stává, že se ty dvě cesty vzájemně nepotkají. Pokusme se nyní odvodit, o co bychom měli doplnit rafinovanější konstruktor. Při zhlédnutí animace vás jistě napadne, že by měl umožňovat nastavit barvu výtahu. Druhá věc, které jste si možná všimli, je, že každý z výtahů jezdil jinou rychlostí. Měli bychom proto lepší konstruktor doplnit i možností nastavit rychlost výtahu. Raději si už dál nebudeme vymýšlet a dohodneme se, že jeho hlavička (signatura) ve třídě Elevator bude: public Elevator(int column, int speed, NamedColor color) Požadavky na konstruktory ale nemůžeme zadat v signatuře klasicky koncipovaného interfejsu, nemůžeme deklarovat, jaké má mít třída konstruktory. Takovéto 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 116 z 651

117 Kapitola 5: Práce na připraveném projektu Elevator 117 požadavky můžeme pouze začlenit do kontraktu, tj. uvést je v dokumentačním komentáři daného interfejsu. S pomocí malé knihovny je možno v interfejsu vznášet i takovéto nestandardní požadavky, ale tyto možnosti už jdou za rámec této učebnice. Až budu mít chvilku času, přidám na svůj web kapitolu, v níž vám tyto možnosti ukážu a vysvětlím. Potřebné metody Položme si nyní otázku: Co musí výtah umět? a odvoďme z ní, na jaké zprávy by měl reagovat a jaké metody bychom proto měli definovat. Když chcete někam jet výtahem, musíte jej napřed přivolat. Aby k vám ale mohl dojet, musí vědět, ve kterém patře jste. Jednou z možností je, předat ve zprávě budoucího pasažéra jako parametr, podle kterého výtah pozná, ve kterém patře se nachází. Ke splnění tohoto požadavku definujeme metodu: public void cometo(imovable passenger) Když výtah přijede, musí pasažér nastoupit. Předpokládáme-li, že v budoucnu budou existovat různé typy pasažérů, tak rozšiřovat třídu pasažéra o schopnost nástupu do výtahu není optimální, protože bychom to museli učit všechny třídy. Lepší bude, když pouze specifikujeme, že jakýkoliv pasažér musí implementovat interfejs IMovable a naučíme výtah nabrat jako nového pasažéra libovolný objekt tohoto typu. Definujeme proto metodu: public void enter(imovable passenger) Pasažér je tedy ve výtahu. Nyní bychom potřebovali, aby výtah uměl s pasažérem přijet do požadovaného patra. Definujeme proto metodu: public void goto(int floor) Všimněte si, že této metodě již nepředáváme pasažéra jako parametr. Pasažér již nastoupil. Výtah jej již nabral, a měl by proto vědět, koho veze. V tuto chvíli možná některé z vás napadne, že výše zmíněnou metodu cometo(imovable) by bylo možno implementovat tak, že zjistíme patro pasažéra, a do tohoto patra pošleme výtah metodou goto(int). Poznamenejte si to, ať si na to vzpomenete, až budete programovat. V cílové stanici by měl výtah svého pasažéra vysadit. Není ale jasné, na kterou stranu jej bude vysazovat. Na tu, ze které nastoupil? Můžeme jej ale také nechat vybrat. Uděláme to šalamounsky tak, že třídu doplníme dvěma metodami jednou pro výstup vpravo a druhou pro výstup vlevo: public void exitright() public void exitleft() 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 117 z 651

118 118 Java 8 Úvod do objektové architektury pro mírně pokročilé Když jsme pěkně krok za krokem prošli celý postup převozu pasažéra z výchozí do cílové pozice, tak by asi bylo příjemné, kdybychom mohli celý proces realizovat jediným příkazem, po němž by výtah přijel pro pasažéra, naložil jej a odvezl do požadovaného patra, kde by jej také vyložil. K tomu mu stačí vědět, kdo jej žádá o převoz a kam touží dojet, tj. ve kterém patře bude vystupovat a na kterou stranu. Aby bylo možno vystupovat v cíli na obě strany, definujeme opět dvě metody: void transportright(imovable passenger, int floor) void transportleft (IMovable passenger, int floor) Pro ladění by se nám ještě hodilo, aby se výtahy uměly podepsat, tj. aby třída definovala vlastní verzi metody tostring(), která vrátí textový podpis se stručnou charakteristikou daného výtahu. 5.4 Interfejs IElevator Z předchozích úvah vyplývá, co by měly mít naše výtahy společné. Na základě těchto úvah bychom mohli definovat interfejs IElevator, který budou muset všechny výtahy implementovat. Možnou definici tohoto interfejsu si můžete prohlédnout ve výpisu 5.1. (Pro připomenutí šablony jsem tentokrát nechal ve výpisu všechny řádkové navigační komentáře. V příštích definicích interfejsů zůstanou jen ty, jejichž sekce není prázdná.) Výpis 5.1: Interfejs IElevator deklarující metody společné všem výtahům 1 /******************************************************************************* 2 * Instance interfejsu {@code IElevator} představují výtahy vozící pasažéry. 3 * <p> 4 * Třídy implementující tento interfejs by měly vedle implementace metod 5 * deklarovaných interfejsem definovat i dva konstruktory: 6 * <ul> 7 * <li>konstruktor s jedním číselným parametrem definujícím sloupec, 8 * v němž se bude daný výtah nacházet (a jezdit).</li> 9 * <li>konstruktor se třemi parametry: 10 * <ul> 11 * <li>celočíselným definujícím sloupec výtahu.</li> 12 * <li>celočíselným definujícím rychlost výtahu.</li> 13 * <li>typu {@link NamedColor} definujícím barvu výtahu.</li> 14 * </ul> 15 * </li> 16 * <ul> 17 */ 18 public interface IElevator extends IMovable 19 { 20 //== ABSTRACT GETTERS AND SETTERS ============================================== 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 118 z 651

119 Kapitola 5: Práce na připraveném projektu Elevator /*************************************************************************** 23 * Přijede s výtahem do zadaného patra; 24 * je-li nastoupený pasažér, odjede i s ním. 25 * 26 floor Pořadové číslo cílového patra (přízemí má 0). 27 */ public void goto(int floor); /*************************************************************************** 33 * Přijede do patra, ve kterém se nachází zadaný pasažér. 34 * 35 passenger Pasažér, pro nějž je třeba přijet. 36 */ public void cometo(imovable passenger); /*************************************************************************** 42 * Přesune zadaného pasažéra z jeho aktuální pozice do výtahu. 43 * V zájmu reálnosti grafické simulace by se měl pasažér vejít do 44 * jednoho políčka aktivního plátna. 45 * 46 passenger Posuvný objekt symbolizující pasažéra. 47 */ public void enter(imovable passenger); /*************************************************************************** 53 * Přesune pasažéra z výtahu na sousední políčko vlevo vedle výtahu. 54 */ public void exitleft(); /*************************************************************************** 60 * Přesune pasažéra z výtahu na sousední políčko vpravo vedle výtahu. 61 */ public void exitright(); /*************************************************************************** 67 * Přivolá do pasažérova patra výtah, nechá pasažéra nastoupit, 68 * odveze jej do požadovaného patra a tam jej nechá vystoupit doprava. 69 * 70 passenger Posuvný objekt symbolizující pasažéra. 71 floor Pořadové číslo cílového patra (přízemí má 0). 72 */ 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 119 z 651

120 120 Java 8 Úvod do objektové architektury pro mírně pokročilé public void transportright(imovable passenger, int floor); /*************************************************************************** 78 * Přivolá do pasažérova patra výtah, nechá pasažéra nastoupit, 79 * odveze jej do požadovaného patra a tam jej nechá vystoupit doleva. 80 * 81 passenger Posuvný objekt symbolizující pasažéra. 82 floor Pořadové číslo cílového patra (přízemí má 0). 83 */ public void transportleft(imovable passenger, int floor); //== OTHER ABSTRACT METHODS ==================================================== /*************************************************************************** 92 * Za pomoci dodaného kreslítka vykreslí obraz své instance 93 * na animační plátno. 94 * 95 painter Kreslítko, kterým se instance nakreslí na plátno. 96 */ 98 public void paint(painter painter); /*************************************************************************** 102 * Převede instanci na řetězec představující její podpis; 103 * řetězec bude obsahovat pořadové číslo výtahu, 104 * sloupec, v němž jezdí, a patro, v němž se právě nachází. 105 * 106 Řetězcová reprezentace (podpis) dané instance. 107 */ 109 public String tostring(); } 5.5 Vzorový projekt Hrubou analýzu máme za sebou, takže máme základní představu o tom, co a jak by měla naše třída a její instance dělat. To ale neznamená, že přesně takový celý projekt na konci bude. V průběhu implementace se může ukázat, že některá naše rozhodnutí ve fázi analýzy nebyla optimální, protože jsme si neuvědomili některé skutečnosti, které nám dojdou až při implementaci. Musíte být proto připraveni na to, že všechno se může změnit. Takže vzhůru na implementaci! 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 120 z 651

121 Kapitola 5: Práce na připraveném projektu Elevator 121 Abych vám ušetřil práci, připravil jsem v projektu N205a_Elevators (jeho z větší části rozbalenou podobu v NetBeans si můžete prohlédnout na obrázku 5.2) poloprázdnou třídu Elevator, která obsahuje předdefinované poloprázdné verze konstruktorů a výše popsaných metod, a třídu ElevatorTest, s jejíž pomocí budete moci vše otestovat. Metody jsem seřadil tak, jak byste je podle analýzy (na tu teprve dojde) měli postupně implementovat. Kromě zmíněné poloprázdné třídy jsou zde definovány tři vzorové definice, které se drobně liší svým chováním. Najdete je ve třídách Obrázek 5.2 ElevatorX, ElevatorP a ElevatorD. (V demonstrační Soubory projektu N205a_Elevators animaci vystupují všechny tři.) Octnete-li se náhodou ve stadiu zoufalství, kdy si nebudete vě- zobrazené v NetBeans dět rady, můžete se podívat na vzorové řešení ve třídě ElevatorX. Netrpělivým bych ale znovu poradil: chcete-li se opravdu něco naučit, zkuste podle následujícího textu nejprve definovat třídu sami, a teprve pak nahlédněte do definic ve výpisech, abyste si zkontrolovali, nakolik se váš program liší od vzorového. Vzorové řešení použijte pouze v případě, když vám něco nebude chodit a nebudete si vědět rady. Jak jsem řekl, v projektu je pro vás připravena poloprázdná třída Elevator. Abyste si také mohli vyzkoušet několik různých řešení, neupravujte přímo ji, ale vytvořte si nejprve její kopii. 5.6 Testovací třída V minulém dílu jsem vás seznámil s metodikou TDD (Test Driven Development), která doporučuje definovat nejprve testy, a teprve pak začít psát program, který projde těmito testy. K témuž se vás budu snažit vést i v tomto dílu. V některých případech (např. v tomto příkladu) pro vás připravím testy já, jindy vás budu nabádat, abyste si je definovali sami. Pojďme se tedy podívat na připravené testy. Přizpůsobující se společná testovací třída Jak jsme si řekli, všechny výtahy budou instancemi společného předka interfejs IElevator. To si ale přímo koleduje o to, abychom pro všechny definovali i společnou testovací třídu. Využijeme proto zkušeností z minulého dílu, v němž jsme si 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 121 z 651

122 122 Java 8 Úvod do objektové architektury pro mírně pokročilé ukazovali, jak je možno definovat test několika tříd majících společného předka. Podobnou techniku využijeme i tentokrát. Pro ty, kteří nečetli první díl, prozradím, že součástí knihovny je třída nazvaná z nedostatku lepších nápadů CLASS. Té nejprve prozradíme, kterou třídu budeme tentokrát testovat, a pak ji používáme jako prostředníka mezi testovací a testovanou třídou při získávání instancí testované třídy. Později vám vysvětlím, jak tuto třídu využít při definici vlastní sady společných testů. Prozatím ale zůstaneme u toho, že jsem testovací třídu připravil za vás. Díky třídě CLASS se může testovací třída přizpůsobovat našim aktuálním požadavkům a pokaždé testovat tu třídu, kterou k testování označíme. Inicializace a finalizace bloku testů v dané třídě Práce s testovacími třídami se v BlueJ a v NetBeans liší. V BlueJ jste mohli navrhovat testy v interaktivním režimu, což možná bude v NetBeans některým chybět. Na druhou stranu zde najdete řadu dalších vymožeností, které vám tuto ztrátu dozajista vynahradí. Když jsme v BlueJ spouštěli testy, které získávaly odkazy na testované instance prostřednictvím třídy CLASS, museli jsme nejprve třídě CLASS prozradit, kterou třídu se chystáme testovat. To budeme potřebovat i nyní. Přímé oslovení třídy CLASS a spuštění její statické metody před spuštěním sady testů budeme muset obejít. K tomu nám pomohou dvě anotace, o nichž jsme si v prvním dílu nevyprávěli. Knihovna JUnit totiž vedle metod označených a spouštěných před každým testem umožňuje také definici metod označených které se spustí před tím, než se začnou pouštět jednotlivé testy v dané třídě. Tyto metody se sice mohou jmenovat libovolně, ale podle konvence jsou pojmenovávány setupclass. Jak jistě odhadnete, inicializační metody mají své partnery označené které se spouštějí po provedení posledního testu dané třídy. Tyto metody bývají dle konvence pojmenovávány teardownclass. Nahlédnete-li do zdrojového kódu třídy ElevatorTest, najdete v ní metodu setupclass() označenou Tato metoda zavolá před spuštěním sady testů metodu setcurrentclass() třídy CLASS. Ta proběhne aktuální projekt, najde všechny třídy implementující interfejs IElevator a otevře dialogové okno s rozbalovacím seznamem, v němž je vyjmenuje. Vy si z něj vyberete tu, kterou budete chtít testovat (nejspíš tu vaši). Třída CLASS si ji zapamatuje a až ji budou testovací metody žádat o instanci, bude vracet instance vámi zadané třídy. 44G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 122 z 651

123 Kapitola 5: Práce na připraveném projektu Elevator 123 Třídy jako objekty class-objekt třídy Na počátku prvního dílu jsem vám říkal, že v objektovém programování je všechno objekt. Řekli jsme si, že Java patří mezi jazyky, v nichž třídy (a obecně datové typy) nejsou obyčejné objekty, na něž bychom mohli získat odkaz. Abychom s nimi však mohli pracovat, zastupují je v programu speciální objekty, které jsou instancemi třídy Class a které označujeme jako class-objekty svých datových typů. Pro jistotu připomenu, že class-objektem třídy tedy není míněna instance dané třídy, ale objekt představující přímo danou třídu. Chcete-li získat odkaz na instanci objektu představujícího nějaký datový typ, tj. class-objekt daného datového typu, máte několik možností: Svůj class-objekt má každý datový typ včetně interfejsů a primitivních datových typů. Získáte jej jako hodnotu výrazu DatovýTyp.class (např. int.class, java.lang.object.class, cz.pecinovsky.util.icolorable.class), který je možno považovat za literál definující daný class-objekt. U objektových datových typů můžeme výraz chápat jako žádost o hodnotu veřejného konstantního statického atributu nazvaného class. U objektových datových typů máme ještě druhou možnost: zavolat metodu instance getclass(). Tuto metodu dědí všechny třídy od třídy Object, takže na ni musí každá instance umět reagovat. Třetí možností je použití metody forname(string), která je statickou metodou třídy Class a očekává jako parametr úplné jméno objektového datového typu (tj. včetně balíčku), po jehož class-objektu se ptáte. Class-objekt můžete využít k mnoha velice zajímavým věcem. My se zde omezíme pouze na to, jak získat název dané třídy. K tomu slouží tři metody: Metoda getsimplename() vrátí pouze prostý název třídy bez případného názvu balíčku. Metoda getname() vrátí plný název třídy včetně úplného názvu jejího balíčku. Pro knihovní třídu IO důvěrně známou z minulého dílu by tedy vrátila cz.pecinovsky.util.io. Metoda tostring() vrátí řetězec obsahující název typu objektu (class, enum nebo interface) následovaný mezerou a úplným názvem třídy. Zafixování testované třídy Budete-li chtít testovat pokaždé stejnou třídu, asi by vás neustálé dotazy na to, kterou třídu chcete testovat, obtěžovaly. Můžete proto příkaz v těle metody setupclass upravit. Vložíte-li do prázdných závorek odkaz na class-objekt své 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 123 z 651

124 124 Java 8 Úvod do objektové architektury pro mírně pokročilé třídy (viz podšeděný blok Třídy jako objekty class-objekt třídy), zavolá se přetížená verze metody, která se už na nic neptá a rovnou nastaví zadanou třídu jako testovanou. Kdybych proto chtěl, aby se pokaždé testovala moje třída nazvaná Elevator1, upravím definici metody setupclass podle výpisu 5.2. Výpis 5.2: Upravená definice metody inicializující sadu testů ve třídě ElevatorTest 2 public static void setupclass() 3 { 4 CLASS.setCurrentClass(Elevator1.class); 5 } Vynechání konkrétního testu Když se podíváte na jednotlivé metody deklarované v interfejsu IElevator, jistě vás napadne, že jsou seřazeny tak, že následující metoda nemůže chodit, dokud nebude odladěna metoda předchozí. Z toho ale vyplývá, že jakmile proběhne test dokonalejší metody, můžeme test jednodušší metody vypustit, aby nás nezdržoval. V praxi se sice takovéto vypuštění testovacích metod nedoporučuje, jenomže při našich testech probíhají animace, které trvají nezanedbatelnou dobu, takže je pochopitelné, že budete chtít provádění již prověřených testů vynechat. Knihovna JUnit nabízí dvě možnosti, jak to vyřešit 9 : Zakomentujete takže následující metoda již nebude považována za test a nebude se spouštět. Přidáte před metodu kterou oznamujete, že následující metoda je sice testovací (je označena ale vy ji z nějakého důvodu nechcete spouštět (nezapomeňte doplnit příkaz import org.junit.ignore;). Oba způsoby jsou téměř ekvivalentní. Jediný rozdíl je v tom, že v závěrečném souhrnu testovací program uvádí i to, kolik testů ignoroval, protože u nich byla nastavena Navíc je touto anotací možno označit i celou testovací třídu. To ocení profesionální testeři při testech velkých projektů, ale my to při našich začátečnických pokusech nevyužijeme. Dal bych proto přednost první variantě, protože je jednodušší. Abych vám ale umožnil jednoduše vyzkoušet i druhou možnost, je v testovací třídě před každou testovací metodou připravena zakomentovaná 9 Možností je ve skutečnosti více. S dalšími vás seznámím v podkapitole Spuštění testů na straně G_UOA2_J8_ZLOM.doc verze , uloženo: pá :35 Strana 124 z 651

125 Kapitola 5: Práce na připraveném projektu Elevator 125 Můžete si proto vybrat, zda budete při postupně procházejících testech zakomentovávat nebo odkomentovávat Spuštění a vyhodnocení testů Testy máme připraveny, vaši kopii poloprázdné třídy doufám také, můžeme začít testovat. Testy můžete spustit několika způsoby: Zadejte v místní nabídce třídy ElevatorTest příkaz Run File. Protože se testovací třída jmenuje ElevatorTest a ve zdrojové složce máme třídu Elevator, můžeme v místní nabídce této třídy zadat příkaz Test File. NetBeans reagují pouze na názvy obou tříd a nebudou zjišťovat, zda daná testovací třída opravdu testuje tu, z jejíž místní nabídky jsme test spustili. Pokud jste ve třídě ElevatorTest upravili definici metody setupclass() tak, aby testovala vaši třídu, musíte ale kvůli stávajícím názvům tříd žádat o spuštění testů (tj. zadat příkaz Test File) v místní nabídce třídy Elevator (nebo třídy ElevatorTest). V místní nabídce vaší třídy totiž bude tento příkaz neaktivní, protože podle NetBeans nemá vaše třída sdruženou testovací třídu. (Můžete jej aktivovat vhodným přejmenováním testovací třídy nebo vytvořením její vhodně pojmenované kopie.). Předpokládám ale, že vás takováto drobnost nezaskočí. Testy se sice spustí, ale žádný z nich neprojde, protože vaše třída zůstává poloprázdná. NetBeans po provedení testů otevřou ve spodním panelu kartu Test Results, v níž vás s výsledky testů seznámí (viz obrázek 5.3). Na kartě bude seznam spuštěných testovacích tříd a pod každou třídou seznam jejích testů. Neprošedší Obrázek 5.3 Karta Test Results s výsledky testů 44G_UOA2_J8_ZLOM.doc, verze , uloženo: pá :35 Strana 125 z 651

úvod do objektové architektury pro mírně pokročilé Rudolf Pecinovský 2014

úvod do objektové architektury pro mírně pokročilé Rudolf Pecinovský 2014 44G UOA2 J8 ZLOM.doc verze 3.01.5173, Ukázka uloženo: knihy pá 23.1.15 z internetového 10:35 knihkupectví www.kosmas.cz Strana 2 z 651 Java 8 úvod do objektové architektury pro mírně pokročilé Rudolf Pecinovský

Více

44G UOA2 J8 ZLOM.doc verze , uloženo: pá :35 Strana 2 z 651

44G UOA2 J8 ZLOM.doc verze , uloženo: pá :35 Strana 2 z 651 44G UOA2 J8 ZLOM.doc verze 3.01.5173, uloženo: pá 23.1.15 10:35 Strana 2 z 651 Java 8 úvod do objektové architektury pro mírně pokročilé Rudolf Pecinovský 2014 44G_UOA2_J8_ZLOM.doc verze 3.01.5173, uloženo:

Více

44G UOA2 J8 ZLOM.doc verze , uloženo: pá :35 Strana 2 z 651

44G UOA2 J8 ZLOM.doc verze , uloženo: pá :35 Strana 2 z 651 44G UOA2 J8 ZLOM.doc verze 3.01.5173, uloženo: pá 23.1.15 10:35 Strana 2 z 651 Java 8 úvod do objektové architektury pro mírně pokročilé Rudolf Pecinovský 2014 44G_UOA2_J8_ZLOM.doc verze 3.01.5173, uloženo:

Více

44G UOA2 J8 ZLOM.doc verze , uloženo: pá :35 Strana 2 z 651

44G UOA2 J8 ZLOM.doc verze , uloženo: pá :35 Strana 2 z 651 44G UOA2 J8 ZLOM.doc verze 3.01.5173, uloženo: pá 23.1.15 10:35 Strana 2 z 651 Java 8 úvod do objektové architektury pro mírně pokročilé Rudolf Pecinovský 2014 44G_UOA2_J8_ZLOM.doc verze 3.01.5173, uloženo:

Více

knihovna programátora

knihovna programátora knihovna programátora Učebnice pro ty, kteří nechtějí zůstat obyčejnými kodéry, ale chtějí se stát špičkovými architekty Postupuje podle metodiky Architecture First Soustředí se na návrh programů a osvojení

Více

knihovna programátora

knihovna programátora knihovna programátora Učebnice pro ty, kteří nechtějí zůstat obyčejnými kodéry, ale chtějí se stát špičkovými architekty Postupuje podle metodiky Architecture First Soustředí se na návrh programů a osvojení

Více

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

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 Ú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 KAPITOLA 1 Na úvod o Javě 15 Počítačový program 15 Vysokoúrovňový programovací

Více

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

14.4.2010. Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod. Základy programování (IZAPR) Přednáška 7 Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 229, Náměstí Čs. legií Michael.Bazant@upce.cz Obsah přednášky 7 Parametry metod, předávání

Více

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ 1) PROGRAM, ZDROJOVÝ KÓD, PŘEKLAD PROGRAMU 3 2) HISTORIE TVORBY PROGRAMŮ 3 3) SYNTAXE A SÉMANTIKA 3 4) SPECIFIKACE

Více

OBJEKTOVÉ PROGRAMOVÁNÍ V C++ V PŘÍKLADECH 8 Proudová knihovna 8.1 Hierarchie proudů... 8-1 8.2 Standardně zavedené proudy... 8-1 8.

OBJEKTOVÉ PROGRAMOVÁNÍ V C++ V PŘÍKLADECH 8 Proudová knihovna 8.1 Hierarchie proudů... 8-1 8.2 Standardně zavedené proudy... 8-1 8. David MATOUŠEK OBJEKTOVÉ PROGRAMOVÁNÍ V C++ V PØÍKLADECH Praha 2011 David Matoušek Objektové programování v C++ v pøíkladech Lektoroval Ing. Bohumil Brtník, Ph.D. Bez pøedchozího písemného svolení nakladatelství

Více

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

ČÁST 1. Zahřívací kolo. Co je a k čemu je návrhový vzor 33 Stručný obsah Část 1: Zahřívací kolo Kapitola 1 Co je a k čemu je návrhový vzor 33 Kapitola 2 Zásady objektově orientovaného programování 39 Kapitola 3 Co konstruktor neumí (Jednoduchá tovární metoda Simple

Více

1. Programování proti rozhraní

1. Programování proti rozhraní 1. Programování proti rozhraní Cíl látky Cílem tohoto bloku je seznámení se s jednou z nejdůležitější programátorskou technikou v objektově orientovaném programování. Tou technikou je využívaní rozhraní

Více

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

10 Balíčky, grafické znázornění tříd, základy zapozdření 10 Balíčky, grafické znázornění tříd, základy zapozdření Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost příkazům balíčkům, grafickému

Více

Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz

Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz Upozornění pro čtenáře a uživatele této knihy Všechna práva vyhrazena. Žádná část této tištěné či elektronické knihy nesmí být reprodukována a šířena

Více

Ukázka knihy z internetového knihkupectví www.kosmas.cz

Ukázka knihy z internetového knihkupectví www.kosmas.cz Ukázka knihy z internetového knihkupectví www.kosmas.cz U k á z k a k n i h y z i n t e r n e t o v é h o k n i h k u p e c t v í w w w. k o s m a s. c z, U I D : K O S 1 8 0 5 8 4 U k á z k a k n i h

Více

1. Dědičnost a polymorfismus

1. Dědičnost a polymorfismus 1. Dědičnost a polymorfismus Cíl látky Cílem této kapitoly je představit klíčové pojmy dědičnosti a polymorfismu. Předtím však je nutné se seznámit se základními pojmy zobecnění neboli generalizace. Komentář

Více

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15 Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15 KAPITOLA 1 Úvod do programo vání v jazyce C++ 17 Základní pojmy 17 Proměnné a konstanty 18 Typy příkazů 18 IDE integrované vývojové

Více

Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz

Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz O autorovi Rudolf Pecinovský patří ke špičkovým odborníkům na výuku programování. Publikoval již 39 učebnic, které byly přeloženy do pěti jazyků,

Více

Vyřešené teoretické otázky do OOP ( )

Vyřešené teoretické otázky do OOP ( ) Vyřešené teoretické otázky do OOP (16. 1. 2013) 1) Vyjmenujte v historickém pořadí hlavní programovací paradigmata a stručně charakterizujte každé paradigma. a) Naivní chaotičnost, špatná syntaxe a sémantika

Více

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda 1. Lze vždy z tzv. instanční třídy vytvořit objekt? 2. Co je nejčastější příčinou vzniku chyb? A. Specifikace B. Testování C. Návrh D. Analýza E. Kódování 3. Je defenzivní programování technikou skrývání

Více

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

11 Diagram tříd, asociace, dědičnost, abstraktní třídy 11 Diagram tříd, asociace, dědičnost, abstraktní třídy Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost diagramům tříd, asociaci,

Více

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20 Obsah 5 Obsah Předmluva k aktuálnímu vydání 15 1 Úvod k prvnímu vydání z roku 2000 16 Typografické a syntaktické konvence................ 20 2 Základní pojmy 21 2.1 Trocha historie nikoho nezabije................

Více

Vaše jistota na trhu IT. Balíčky. Rudolf Pecinovský rudolf@pecinovsky.cz

Vaše jistota na trhu IT. Balíčky. Rudolf Pecinovský rudolf@pecinovsky.cz Vaše jistota na trhu IT Balíčky Rudolf Pecinovský rudolf@pecinovsky.cz Problémy velkých aplikací Rozsáhlé aplikace používají velké množství názvů objektů a jejich zpráv, které různé části programu sdílí

Více

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Maturitní otázky z předmětu PROGRAMOVÁNÍ Wichterlovo gymnázium, Ostrava-Poruba, příspěvková organizace Maturitní otázky z předmětu PROGRAMOVÁNÍ 1. Algoritmus a jeho vlastnosti algoritmus a jeho vlastnosti, formy zápisu algoritmu ověřování správnosti

Více

Obsah. Začínáme programovat v Ruby on Rails 9. Úvod 11. 1. Vítejte v Ruby 15. O autorovi 9 Poděkování 9

Obsah. Začínáme programovat v Ruby on Rails 9. Úvod 11. 1. Vítejte v Ruby 15. O autorovi 9 Poděkování 9 Začínáme programovat v Ruby on Rails 9 O autorovi 9 Poděkování 9 Úvod 11 Komu je kniha určena 11 Jak je kniha uspořádána 11 Co ke knize potřebujete 12 Konvence 12 Zdrojový kód 13 Poznámka redakce českého

Více

Základy objektové orientace I. Únor 2010

Základy objektové orientace I. Únor 2010 Seminář Java Základy objektové orientace I Radek Kočí Fakulta informačních technologií VUT Únor 2010 Radek Kočí Seminář Java Základy OO (1) 1/ 20 Téma přednášky Charakteristika objektově orientovaných

Více

Generátor kódu. a jeho uplatnění ve výuce programování. Rudolf PECINOVSKÝ rudolf@pecinovsky.cz

Generátor kódu. a jeho uplatnění ve výuce programování. Rudolf PECINOVSKÝ rudolf@pecinovsky.cz Generátor kódu a jeho uplatnění ve výuce programování Rudolf PECINOVSKÝ rudolf@pecinovsky.cz Trendy poslední doby Další a další státy si uvědomují nutnost zařazení výuky programování do učiva základních

Více

Kurzy, Podrobnější informace najdete na www.amaio.cz Dotazy a přihlášky můžete posílat na kurzy@amaio.cz

Kurzy, Podrobnější informace najdete na www.amaio.cz Dotazy a přihlášky můžete posílat na kurzy@amaio.cz O autorovi Rudolf Pecinovský patří ke špičkovým odborníkům na výuku programování. Publikoval již 39 učebnic, které byly přeloženy do pěti jazyků, a nepřeberné množství článků a příspěvků na odborných konferencích.

Více

Ukázka knihy z internetového knihkupectví

Ukázka knihy z internetového knihkupectví Ukázka knihy z internetového knihkupectví www.kosmas.cz Věnováno mé rodině ACCESS 2007 PODROBNÝ PRŮVODCE 5 Úvod... 13 Komu je tato kniha určena...13 Co v této knize naleznete...14 Použité konvence a struktura

Více

ZŠ ÚnO, Bratří Čapků 1332

ZŠ ÚnO, Bratří Čapků 1332 MS Excel 2002 Grada - po spuštění je třeba kliknout do středu obrazovky - v dalším dialogovém okně (Přihlášení) vybrat uživatele, zřídit Nového uživatele nebo zvolit variantu Bez přihlášení (pro anonymní

Více

Vzdělávací oblast: Informatika a informační a komunikační technologie Vzdělávací obor: Programování. Předmět: Programování

Vzdělávací oblast: Informatika a informační a komunikační technologie Vzdělávací obor: Programování. Předmět: Programování Vzdělávací oblast: Informatika a informační a komunikační technologie Vzdělávací obor: Programování Vzdělávací oblast Informatika a informační a komunikační technologie pro vzdělávací obor Programování

Více

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

PB161 Programování v jazyce C++ Přednáška 7 PB161 Programování v jazyce C++ Přednáška 7 Statické položky tříd Základy OOP Nikola Beneš 6. listopadu 2018 PB161 přednáška 7: static, základy OOP 6. listopadu 2018 1 / 21 Klíčové slovo static Znáte z

Více

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

11.5.2012. 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 Obsah přednášky 9 Základy programování (IZAPR, IZKPR) Přednáška 9 Základy dědičnosti, přístupová práva Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 03 022, Náměstí Čs. legií

Více

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

PB161 Programování v jazyce C++ Přednáška 7 PB161 Programování v jazyce C++ Přednáška 7 Statické položky tříd Základy OOP Nikola Beneš 6. listopadu 2018 PB161 přednáška 7: static, základy OOP 6. listopadu 2018 1 / 21 Klíčové slovo static Znáte z

Více

Předměty. Algoritmizace a programování Seminář z programování. Verze pro akademický rok 2012/2013. Verze pro akademický rok 2012/2013

Předměty. Algoritmizace a programování Seminář z programování. Verze pro akademický rok 2012/2013. Verze pro akademický rok 2012/2013 Předměty Algoritmizace a programování Seminář z programování Verze pro akademický rok 2012/2013 Verze pro akademický rok 2012/2013 1 Přednášky Jiřina Královcová MTI, přízemí budovy A Tel: 48 53 53 521

Více

Objektové programování

Objektové programování Objektové programování - přináší nové možnosti a styl programování - vytváří nový datový typ, který umí vše co standardní datové typy + to co ho naučíme - překladač se k tomuto typu chová stejně jako k

Více

Platforma.NET 11.NET Framework 11 Visual Basic.NET Základní principy a syntaxe 13

Platforma.NET 11.NET Framework 11 Visual Basic.NET Základní principy a syntaxe 13 Obsah Úvod 11 Platforma.NET 11.NET Framework 11 Visual Basic.NET 12 1 Základní principy a syntaxe 13 Typový systém 13 Hodnotové typy 13 Struktury 15 Výčtové typy 15 Referenční typy 15 Konstanty 16 Deklarace

Více

Microsoft Access tvorba databáze jednoduše

Microsoft Access tvorba databáze jednoduše Microsoft Access tvorba databáze jednoduše Časový rozsah: 2 dny (9:00-16:00) Cena: 3300 Kč + DPH Úvod do relačních databází. Funkce databázových objektů Microsoft Access. Návrh tabulek, definice základních

Více

Obsah. Úvod Začínáme s PowerPointem Operace se snímky Pro koho je kniha určena...10 Použité konvence...11

Obsah. Úvod Začínáme s PowerPointem Operace se snímky Pro koho je kniha určena...10 Použité konvence...11 Obsah Úvod... 9 Pro koho je kniha určena...10 Použité konvence...11 Začínáme s PowerPointem... 13 1.1 Základní pojmy...14 1.2 Podokno úloh...16 1.3 Zobrazení dokumentu...17 1.4 Uložení prezentace...21

Více

ČÁST 1. Základy 32bitového programování ve Windows

ČÁST 1. Základy 32bitového programování ve Windows Obsah Úvod 13 ČÁST 1 Základy 32bitového programování ve Windows Kapitola 1 Nástroje pro programování ve Windows 19 První program v Assembleru a jeho kompilace 19 Objektové soubory 23 Direktiva INVOKE 25

Více

OOP. Verze : 365 NS, odstavců, slov, znaků, bajtů. a Java 8

OOP. Verze : 365 NS, odstavců, slov, znaků, bajtů. a Java 8 Verze 15.57.5745 2015-10-24: 365 NS, 8 253 odstavců, 89 019 slov, 657 239 znaků, 2 963 968 bajtů OOP a Java 8 Návrh a vývoj složitějšího projektu vyhovujícího zadanému rámci Rudolf Pecinovský 49R_Adventura_TXT_ZLOM.doc

Více

Microsoft Word základní

Microsoft Word základní Časový rozsah: 2 dny (8:30-14:00) Cena: 2400 Kč + DPH Microsoft Word základní Tvorba kratších dokumentů se zaměřením na korespondenci. Základy tvorby a formátování písma a odstavců. Vkládání tabulek a

Více

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

IB111 Programování a algoritmizace. Objektově orientované programování (OOP) IB111 Programování a algoritmizace Objektově orientované programování (OOP) OP a OOP Objekt Kombinuje data a funkce a poskytuje určité rozhraní. OP = objektové programování Vše musí být objekty Např. Smalltalk,

Více

Programování II. Třídy a objekty (objektová orientovanost) 2018/19

Programování II. Třídy a objekty (objektová orientovanost) 2018/19 Programování II Třídy a objekty (objektová orientovanost) 2018/19 Osnova přednášky Objektový přístup (proč potřebujeme objekty). Třídy, objekty,... Příklad. Proč potřebujeme objekty? Udržovatelnost softwaru

Více

ALGORITMIZACE A PROGRAMOVÁNÍ

ALGORITMIZACE A PROGRAMOVÁNÍ Metodický list č. 1 Algoritmus a jeho implementace počítačovým programem Základním cílem tohoto tematického celku je vysvětlení pojmů algoritmus a programová implementace algoritmu. Dále je cílem seznámení

Více

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

8 Třídy, objekty, metody, předávání argumentů metod 8 Třídy, objekty, metody, předávání argumentů metod Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost třídám a objektům, instančním

Více

Metodika. Architecture First. Rudolf Pecinovský rudolf@pecinovsky.cz

Metodika. Architecture First. Rudolf Pecinovský rudolf@pecinovsky.cz Copyright Rudolf Pecinovský, Soubor: 2014_Comm_PrW_Architecture First Methodology.doc, verze 1.00.2413, uloženo po 9.6.2014 14:43 1 z 39 Metodika Architecture First Rudolf Pecinovský rudolf@pecinovsky.cz

Více

Maturitní témata Školní rok: 2015/2016

Maturitní témata Školní rok: 2015/2016 Maturitní témata Školní rok: 2015/2016 Ředitel školy: Předmětová komise: Předseda předmětové komise: Předmět: PhDr. Karel Goš Informatika a výpočetní technika Mgr. Ivan Studnička Informatika a výpočetní

Více

OPERAČNÍ SYSTÉM. Informační a komunikační technologie

OPERAČNÍ SYSTÉM. Informační a komunikační technologie OPERAČNÍ SYSTÉM Informační a komunikační technologie Operační systém počítače Definice - charakteristika Je soubor programů, které zajišťují základní činnosti počítače (vstup a výstup dat, zpracování uživatelského

Více

1 Webový server, instalace PHP a MySQL 13

1 Webový server, instalace PHP a MySQL 13 Úvod 11 1 Webový server, instalace PHP a MySQL 13 Princip funkce webové aplikace 13 PHP 14 Principy tvorby a správy webového serveru a vývojářského počítače 14 Co je nezbytné k instalaci místního vývojářského

Více

Štěpán Svačina, Miroslav Souček, Alena Šmahelová, Richard Češka METABOLICKÝ SYNDROM. Nové postupy

Štěpán Svačina, Miroslav Souček, Alena Šmahelová, Richard Češka METABOLICKÝ SYNDROM. Nové postupy Štěpán Svačina, Miroslav Souček, Alena Šmahelová, Richard Češka METABOLICKÝ SYNDROM Nové postupy Štěpán Svačina, Miroslav Souček, Alena Šmahelová, Richard Češka METABOLICKÝ SYNDROM Nové postupy Grada

Více

Quo vadis programování? Automatizace vyhodnocování studentských úloh

Quo vadis programování? Automatizace vyhodnocování studentských úloh Vaše jistota na trhu IT Quo vadis programování? Automatizace vyhodnocování studentských úloh Rudolf PECINOVSKÝ rudolf@pecinovsky.cz Vladimír Oraný vladimir.orany@gmail.com Vaše jistota na trhu IT Obsah

Více

Obsah. Úvodem 9 Zpětná vazba od čtenářů 10 Zdrojové kódy ke knize 10 Errata 10

Obsah. Úvodem 9 Zpětná vazba od čtenářů 10 Zdrojové kódy ke knize 10 Errata 10 Obsah Úvodem 9 Zpětná vazba od čtenářů 10 Zdrojové kódy ke knize 10 Errata 10 KAPITOLA 1 Co budeme potřebovat 11 Co knihovna jquery nabízí 11 Editor zdrojového kódu 12 Webový server 12 Software pro ladění

Více

Výčtový typ strana 67

Výčtový typ strana 67 Výčtový typ strana 67 8. Výčtový typ V této kapitole si ukážeme, jak implementovat v Javě statické seznamy konstant (hodnot). Příkladem mohou být dny v týdnu, měsíce v roce, planety obíhající kolem slunce

Více

typová konverze typová inference

typová konverze typová inference Seminář Java Programování v Javě II Radek Kočí Fakulta informačních technologií VUT Únor 2008 Radek Kočí Seminář Java Programování v Javě (2) 1/ 36 Téma přednášky Rozhraní: použití, dědičnost Hierarchie

Více

Programové konvence, dokumentace a ladění. Programování II 2. přednáška Alena Buchalcevová

Programové konvence, dokumentace a ladění. Programování II 2. přednáška Alena Buchalcevová Programové konvence, dokumentace a ladění 2. přednáška Alena Buchalcevová Proč dodržovat programové konvence? velkou část životního cyklu softwaru tvoří údržba údržbu provádí většinou někdo jiný než autor

Více

Stručný obsah. Úvod 15. KAPITOLA 1 První kroky v systému Windows 8 19. KAPITOLA 2 Hlavní panel a jeho možnosti 41. KAPITOLA 3 Soubory a složky 51

Stručný obsah. Úvod 15. KAPITOLA 1 První kroky v systému Windows 8 19. KAPITOLA 2 Hlavní panel a jeho možnosti 41. KAPITOLA 3 Soubory a složky 51 Stručný obsah Úvod 15 KAPITOLA 1 První kroky v systému Windows 8 19 KAPITOLA 2 Hlavní panel a jeho možnosti 41 KAPITOLA 3 Soubory a složky 51 KAPITOLA 4 Práce se schránkou 85 KAPITOLA 5 Osobní přizpůsobení

Více

Úvodem 9. Zpětná vazba od čtenářů 10 Zdrojové kódy ke knize 10 Errata 10. Než začneme 11

Úvodem 9. Zpětná vazba od čtenářů 10 Zdrojové kódy ke knize 10 Errata 10. Než začneme 11 Obsah Úvodem 9 Zpětná vazba od čtenářů 10 Zdrojové kódy ke knize 10 Errata 10 Kapitola 1 Než začneme 11 Dynamické vs. statické stránky 11 Co je a k čemu slouží PHP 12 Instalace potřebného softwarového

Více

Java/QE Akademie - Osnova

Java/QE Akademie - Osnova Java/QE Akademie - Osnova Lekce 1 1. Co je to Java? 1.1. Struktura Java kódu 2. Potřebné nástroje pro vývoj 2.1. JVM 2.2. JRE 2.3. JDK 3. Co je to proměnná a její zápis v Javě 3.1. Klasické proměnné 3.2.

Více

Dědění, polymorfismus

Dědění, polymorfismus Programování v jazyce C/C++ Ladislav Vagner úprava Pavel Strnad Dědění. Polymorfismus. Dnešní přednáška Statická a dynamická vazba. Vnitřní reprezentace. VMT tabulka virtuálních metod. Časté chyby. Minulá

Více

PROGRAMOVÁNÍ V JAZYCE C V PŘÍKLADECH 11 Dynamické datové struktury 11.1 Spojové struktury... 11-1 11.2 Příklad PROG_11-01... 11-2 11.

PROGRAMOVÁNÍ V JAZYCE C V PŘÍKLADECH 11 Dynamické datové struktury 11.1 Spojové struktury... 11-1 11.2 Příklad PROG_11-01... 11-2 11. David Matoušek Programování v jazyce C v pøíkladech Praha 2011 David Matoušek Programování v jazyce C v pøíkladech Bez pøedchozího písemného svolení nakladatelství nesmí být kterákoli èást kopírována nebo

Více

Obsahy kurzů MS Office

Obsahy kurzů MS Office Obsahy kurzů MS Office V současné době probíhají kurzy MS Office 2010 s následující osnovou: 1. Základy práce na PC, MS Office - praktické užití Kurz je určen pro všechny, kteří mají s prací na PC minimální

Více

Obsah KAPITOLA 1 Několik slov o Wordu 2007 9

Obsah KAPITOLA 1 Několik slov o Wordu 2007 9 KAPITOLA 1 Několik slov o Wordu 2007 9 Pás karet 10 Další možnosti ovládání Wordu 12 Nastavení Wordu 13 Ovládání Wordu 2007 klávesnicí 14 KAPITOLA 2 Základní operace 17 Základní nastavení 17 Rozdělení

Více

Střední průmyslová škola elektrotechnická Praha 10, V Úžlabině 320 M A T U R I T N Í T É M A T A P Ř E D M Ě T U

Střední průmyslová škola elektrotechnická Praha 10, V Úžlabině 320 M A T U R I T N Í T É M A T A P Ř E D M Ě T U Střední průmyslová škola elektrotechnická Praha 10, V Úžlabině 320 M A T U R I T N Í T É M A T A P Ř E D M Ě T U P R O G R A M O V É V Y B A V E N Í Studijní obor: 18-20-M/01 Informační technologie Školní

Více

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

Bridge. Známý jako. Účel. Použitelnost. Handle/Body Bridge Bridge Známý jako Handle/Body Účel odděluje abstrakci (rozhraní a jeho sémantiku) od její konkrétní implementace předchází zbytečnému nárůstu počtu tříd při přidávání implementací používá se v době

Více

Stručný obsah. Část I. Část II. Část III. Úvod do vývoje v prostředí Visual Studio 25. Návrh uživatelského rozhraní 127

Stručný obsah. Část I. Část II. Část III. Úvod do vývoje v prostředí Visual Studio 25. Návrh uživatelského rozhraní 127 Stručný obsah Část I Úvod do vývoje v prostředí Visual Studio 25 1. Možnosti vývoje v jazyce Visual Basic a Windows Store 27 2. Integrované vývojové prostředí Visual Studio 41 3. Vytvoření první aplikace

Více

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.

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. 13 Rozhraní, výjimky Studijní cíl 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. Doba nutná k nastudování 2 2,5 hodiny

Více

Úvod do programovacích jazyků (Java)

Úvod do programovacích jazyků (Java) Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2007/2008 c 2006 2008 Michal Krátký Úvod do programovacích

Více

TÉMATICKÝ OKRUH Softwarové inženýrství

TÉMATICKÝ OKRUH Softwarové inženýrství TÉMATICKÝ OKRUH Softwarové inženýrství Číslo otázky : 24. Otázka : Implementační fáze. Postupy při specifikaci organizace softwarových komponent pomocí UML. Mapování modelů na struktury programovacího

Více

2. Modelovací jazyk UML 2.1 Struktura UML 2.1.1 Diagram tříd 2.1.1.1 Asociace 2.1.2 OCL. 3. Smalltalk 3.1 Jazyk 3.1.1 Pojmenování

2. Modelovací jazyk UML 2.1 Struktura UML 2.1.1 Diagram tříd 2.1.1.1 Asociace 2.1.2 OCL. 3. Smalltalk 3.1 Jazyk 3.1.1 Pojmenování 1. Teoretické základy modelování na počítačích 1.1 Lambda-kalkul 1.1.1 Formální zápis, beta-redukce, alfa-konverze 1.1.2 Lambda-výraz jako data 1.1.3 Příklad alfa-konverze 1.1.4 Eta-redukce 1.2 Základy

Více

Osnova kurzu OBSLUHA PC ZÁKLADNÍ ZNALOSTI. pilotního projektu v rámci I. Etapy realizace SIPVZ

Osnova kurzu OBSLUHA PC ZÁKLADNÍ ZNALOSTI. pilotního projektu v rámci I. Etapy realizace SIPVZ Střední průmyslová škola a Střední odborné učiliště, Trutnov, Školní 101, tel.: +420 499 813 071, fax: +420 499 814 729, e-mail: skola@spssoutu.cz, URL: http://www.spssoutu.cz Osnova kurzu OBSLUHA PC ZÁKLADNÍ

Více

INOVACE PŘEDMĚTŮ ICT. MODUL 11: PROGRAMOVÁNÍ WEBOVÝCH APLIKLACÍ Metodika

INOVACE PŘEDMĚTŮ ICT. MODUL 11: PROGRAMOVÁNÍ WEBOVÝCH APLIKLACÍ Metodika Vyšší odborná škola ekonomická a zdravotnická a Střední škola, Boskovice INOVACE PŘEDMĚTŮ ICT MODUL 11: PROGRAMOVÁNÍ WEBOVÝCH APLIKLACÍ Metodika Zpracoval: Jaroslav Kotlán srpen 2009s Úvod Modul Programování

Více

Ukázka knihy z internetového knihkupectví

Ukázka knihy z internetového knihkupectví Ukázka knihy z internetového knihkupectví www.kosmas.cz Josef Pecinovský Jak na Windows Vista v rekordním čase Josef Pecinovský Vydala Grada Publishing, a.s. U Průhonu 22, Praha 7 jako svou 3053. publikaci

Více

Kurzy, Podrobnější informace najdete na Dotazy a přihlášky můžete posílat na

Kurzy, Podrobnější informace najdete na  Dotazy a přihlášky můžete posílat na O autorovi Rudolf Pecinovský patří ke špičkovým odborníkům na výuku programování. Publikoval již 39 učebnic, které byly přeloženy do pěti jazyků, a nepřeberné množství článků a příspěvků na odborných konferencích.

Více

Úvodem... 9 Kapitola 1 Karetních

Úvodem... 9 Kapitola 1 Karetních Úvodem... 9 Základní znalosti o programovacích jazycích...10 Jazyk C# a platforma.net...10 Visual C# 2010 Express...11 Instalace platformy.net 4.0 a Visual C# 2010 Express...11 Zdrojový kód aplikací...12

Více

24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1 24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE AUTOR DOKUMENTU: MGR. MARTINA SUKOVÁ DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 UČIVO: STUDIJNÍ OBOR: PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) INFORMAČNÍ TECHNOLOGIE

Více

Střední průmyslová škola elektrotechnická Praha 10, V Úžlabině 320

Střední průmyslová škola elektrotechnická Praha 10, V Úžlabině 320 Střední průmyslová škola elektrotechnická Praha 10, V Úžlabině 320 M A T U R I T N Í T É M A T A P Ř E D M Ě T U P R O G R A M O V É V Y B A V E N Í Studijní obor: 18-20-M/01 Informační technologie Školní

Více

Programování v jazyce C a C++

Programování v jazyce C a C++ Programování v jazyce C a C++ Příklad na tvorbu třídy Richter 1 4. prosince 2017 1 Ing. Richter Miloslav, Ph.D., UAMT FEKT VUT Brno Dvourozměrné pole pomocí tříd Zadání Navrhněte a napište třídu pro realizace

Více

Jak využít kancelářské aplikace ve výuce MS Office 2007. Gymnázium a SOŠ Orlová 14. 11. 2007 Ing. Marta Slawinská

Jak využít kancelářské aplikace ve výuce MS Office 2007. Gymnázium a SOŠ Orlová 14. 11. 2007 Ing. Marta Slawinská Jak využít kancelářské aplikace ve výuce MS Office 2007 Gymnázium a SOŠ Orlová 14. 11. 2007 Ing. Marta Slawinská Cíle školení Seznámit se s novým uživatelským rozhraním MS Office 2007 a jeho specifikacemi

Více

Informace k e-learningu

Informace k e-learningu Informace k e-learningu Příprava na testy bude probíhat samostatně formou e-learningových školení přístupných způsobem popsaným níže. Zkušební testy, pomocí kterých se budete připravovat na závěrečný test,

Více

Nástroje na vývoj aplikací pro ios Trocha motivace na úvod Co budete potřebovat Co když nemáte k dispozici počítač s macos? Vývojové prostředí Xcode

Nástroje na vývoj aplikací pro ios Trocha motivace na úvod Co budete potřebovat Co když nemáte k dispozici počítač s macos? Vývojové prostředí Xcode KAPITOLA 1 Nástroje na vývoj aplikací pro ios 11 Trocha motivace na úvod 11 Co budete potřebovat 11 Co když nemáte k dispozici počítač s macos? 12 Vývojové prostředí Xcode 14 Průběžná aktualizace 16 První

Více

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e); TŘÍDY POKRAČOVÁNÍ Události pokračování public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e); class Bod private int x; private int y; public event ZmenaSouradnicEventHandler ZmenaSouradnic;

Více

Vývojové nástroje jazyka Java

Vývojové nástroje jazyka Java Vývojové nástroje jazyka Java Tato kapitola informuje čtenáře, jaké nástroje je zapotřebí nainstalovat pro spouštění a vývoj programů v jazyce Java, hlavním cílem kapitoly je seznámit čtenáře s aplikacemi,

Více

Metodika Architecture First a její podpora v prostředí BlueJ++

Metodika Architecture First a její podpora v prostředí BlueJ++ Metodika Architecture First a její podpora v prostředí BlueJ++ Rudolf PECINOVSKÝ rudolf@pecinovsky.cz DidInfo 2015 1 Proč prosazuji metodiku Architecture First Technologická signatura Je třeba předvídat

Více

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu VÝUKOVÝ MATERIÁL Identifikační údaje školy Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632

Více

Úvod 1 ČÁST 1 HTML 1 Základy HTML a kaskádových stylů 5

Úvod 1 ČÁST 1 HTML 1 Základy HTML a kaskádových stylů 5 Úvod 1 ČÁST 1 HTML 1 Základy HTML a kaskádových stylů 5 Struktura dokumentu HTML obsah a forma 5 Prvky dokumentu 7 Jméno prvku 7 Atributy prvku 8 Obsah prvku, hierarchie prvků 9 Zastupující jednotky (entity)

Více

Obsah. Kapitola 1. Kapitola 2

Obsah. Kapitola 1. Kapitola 2 Stručný obsah Předmluva...17 Úvod...19 Začínáme...25 Koncepce objektově orientovaného programování...51 Základy jazyka...59 Třídy a objekty...91 Rozhraní a dědičnost... 133 Genericita... 155 Balíčky...

Více

2.2 Acronis True Image 19

2.2 Acronis True Image 19 Obsah Kniha první Acronis True Image 9.0 1. Úvod 15 1.1 Co je Acronis True Image? 15 1.2 Co je nového v aplikaci Acronis True Image 9.0? 15 1.3 Jaký je rozdíl mezi zálohami a diskovými obrazy disků/diskových

Více

Předmluva 11 Typografická konvence použitá v knize 12. 1 Úvod do Excelu 2003 13

Předmluva 11 Typografická konvence použitá v knize 12. 1 Úvod do Excelu 2003 13 Předmluva 11 Typografická konvence použitá v knize 12 1 Úvod do Excelu 2003 13 Spuštění a ukončení Excelu 14 Spuštění Excelu 14 Ukončení práce s Excelem 15 Přepínání mezi otevřenými sešity 16 Oprava aplikace

Více

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

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007 Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků

Více

TÉMATICKÝ OKRUH Softwarové inženýrství

TÉMATICKÝ OKRUH Softwarové inženýrství TÉMATICKÝ OKRUH Softwarové inženýrství Číslo otázky : 25. Otázka : Komponentní technologie - základní pojmy a principy, metody specifikace komponent. Obsah : 1. Základní pojmy 1.1 Komponenta Komponenta

Více

Vstupní požadavky, doporučení a metodické pokyny

Vstupní požadavky, doporučení a metodické pokyny Název modulu: Základy PHP Označení: C9 Stručná charakteristika modulu Modul je orientován na tvorbu dynamických stánek aktualizovaných podle kontextu volání. Jazyk PHP umožňuje velmi jednoduchým způsobem

Více

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu VÝUKOVÝ MATERIÁL Identifikační údaje školy Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632

Více

Josef Pecinovský PowerPoint 2007

Josef Pecinovský PowerPoint 2007 Josef Pecinovský PowerPoint 2007 Jak na PowerPoint 2007 v rekordním čase Josef Pecinovský Vydala Grada Publishing, a.s. U Průhonu 22, Praha 7 jako svou 3054. publikaci Odpovědný redaktor Karel Samohýl

Více

Generické programování

Generické programování Generické programování Od C# verze 2.0 = vytváření kódu s obecným datovým typem Příklad generická metoda, zamění dva parametry: static void Swap(ref T p1, ref T p2) T temp; temp = p1; p1 = p2; p2 =

Více

6 Příkazy řízení toku

6 Příkazy řízení toku 6 Příkazy řízení toku Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost příkazům pro řízení toku programu. Pro všechny tyto základní

Více

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března Polymorfismus Cíle lekce Cílem lekce je vysvětlit význam pojmu polymorfismus jako základní vlastnosti objektově orientovaného programování. Lekce objasňuje vztah časné a pozdní vazby a jejich využití.

Více

Ukázka knihy z internetového knihkupectví www.kosmas.cz

Ukázka knihy z internetového knihkupectví www.kosmas.cz Ukázka knihy z internetového knihkupectví www.kosmas.cz U k á z k a k n i h y z i n t e r n e t o v é h o k n i h k u p e c t v í w w w. k o s m a s. c z, U I D : K O S 1 8 1 5 4 6 U k á z k a k n i h

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Struktura programu Vytvoření nové aplikace Struktura programu Základní syntaktické elementy První aplikace Verze pro akademický rok 2012/2013 1 Nová aplikace NetBeans Ve vývojovém

Více

OBSAH. Kontrola aktualizací... 18

OBSAH. Kontrola aktualizací... 18 2013 Albatros Media a. s. Toto CD je součástí knihy Adobe InDesign CS6, Oficiální výukový kurz a je samostatně neprodejné. Všechna práva vyhrazena. Nelegální kopie tohoto disku jsou zakázány. K2059_potisk.indd

Více