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 ani šíř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 7

učebnice objektové architektury pro začátečníky

(ukážka)

TIRÁŽ TIŠTĚNÉ PUBLIKACE:

Vydala Grada Publishing, a.s.

U Průhonu 22, 170 00 Praha 7

tel.: +420 234 264 401, fax: +420 234 264 400

www.grada.cz

jako svou 4971. publikaci

Odborní lektoři:

doc ing. Alena Buchalcevová, Ph.D., doc. ing. Pavel Herout, Ph.D.,

doc. MUDr. Jiří Kofránek, CSc., doc. ing. Vojtěch Merunka,

Ph.D., prof. RNDr. PhDr. Antonín Slabý, CSc., doc ing. Miroslav Virius, CSc.

Odpovědný redaktor: Martin Vondráček

Návrh vnitřního layoutu: Rudolf Pecinovský

Zlom: Rudolf Pecinovský

Počet stran 496

Vydání 1., 2012

Vytiskla Tiskárna PROTISK, s.r.o., České Budějovice

© Grada Publishing, a.s., 2012

Cover Photo © allphoto.cz

ISBN 978-80-247-3665-5

ELEKTRONICKÉ PUBLIKACE:

ISBN 978-80-247-8325-3 ve formátu PDF

ISBN 978-80-247-8326-0 ve formátu EPUB

O autorovi

Rudolf Pecinovský patří ke špičkovým odborníkům na výuku programování. Publikoval již 43 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. Je autorem metodiky výuky programování Karel, navazující metodiky Baltík a moderní metodiky výuky objektově orientovaného programování známé pod anglickým názvem Architecture First. Učí programování na VŠE a FIT ČVUT. Současně pracuje jako Senior EDU Expert ve firmě ICZ a.s., kde má na starosti doškolování profesionálních programátorů a organizaci kurzů, které si objednávají jiné firmy.

O knize

Tato kniha je třetím vydáním populární učebnice programování, která je na našem trhu zcela ojedinělá. Na rozdíl od ostatních učebnic, které se soustředí na výuku syntaxe jazyka a práce s knihovnami, se tato kniha soustředí především na výklad architektonických konstrukcí. Neučí čtenáře kódovat, ale snaží se jej naučit, jak programy navrhovat. Učí jej, jak má při programování myslet. Reaguje tak na známou skutečnost, že kodérů je hodně, ale dobrých softwarových architektů je proklatě málo (proto také mají několikanásobně vyšší platy).

Kniha je sice primárně určena začátečníkům, ale ohlasy na předchozí vydání ukázaly, že v ní najdou poučení i zkušení programátoři. Většina učebnic a kurzů programování totiž vyvolává falešnou představu, že objektově programovat znamená používat třídy a dědění. Tato kniha je první, která ukazuje, že objektově orientované programování přináší především jiný způsob myšlení. Jak výstižně napsal jeden čtenář: „Myslel jsem si, že nejsem žádné programátorské ucho. Když jsem ale přečetl vaši učebnici, otevřel jsem oči a hubu. Konečně jsem pochopil věci, které mi ostatní učebnice nedokázaly vysvětlit.“

Kniha vznikla na základě dlouholetých autorových zkušeností se školením profesionálních programátorů, výukou programování na univerzitě i vedením žákovských programátorských kroužků. Autor v ní uvádí čtenáře krok za krokem do tajů objektově orientovaného programování a ukazuje mu, jak možnosti této moderní technologie co nejlépe využít a kde si dát naopak pozor na její úskalí.

Výklad je postaven na příkladech, které autor spolu s čtenářem postupně řeší a přitom čtenáře učí nejenom základním programátorským návykům a dovednostem, ale předvede mu i nejrůznější užitečné triky, z nichž mnohé nikde jinde vysvětlené nenajdete. Současně upozorňuje na nejčastější začátečnické chyby, které před svými čtenáři ostatní učebnice většinou tají. Navíc probírá i řadu témat (např. návrhové vzory), která jsou většinou probírána až v pokročilých, nebo dokonce nadstavbových kurzech, přestože patří do základní výbavy objektového programátora.

Mé ženě Jarušce a dětem

Štěpánce, Pavlínce, Ivance a Michalovi

Skrytí spoluautoři

Knihu bych nemohl dokončit v předepsaném čase, kdyby mi s ní nepomohli moji studenti, kteří se podíleli především na přípravě doprovodných programů a dalšího podpůrného programového vybavení a přispěli i řadou připomínek k obsahu a stylu výkladu. Dovolte mi proto abecedně uvést alespoň ty nejzasloužilejší.

Daniel Bartoň se podílel na odladění některých knihovních programů, převodu knihoven do angličtiny pro druhý díl učebnice a úpravách speciální třídy umožňující definici jediné testovací třídy pro celou skupinu tříd se společným rodičem.

Sergej Bobuskyy měl hlavní podíl na vývoji pluginu BJ2NB, který doplňuje možnosti prostředí NetBeans, v němž budeme pracovat v druhém dílu, o schopnost průběžného zobrazování diagramu tříd a jeho provázání se zdrojovým kódem, na které si zvyknete u prostředí BlueJ, jež se používá v dílu prvním.

Martin Fiala vyvinul pro plugin BJ2NB editor kopenogramů.

David Král pomáhal s přípravou podkladů pro generátor projektů a s úpravami tohoto generátoru v rámci jeho průběžného zdokonalování.

Filip Malý doplnil a upravil sadu maker, která automatizují některé činnosti spojené s přípravou rukopisu a jeho následného převodu do finální podoby. Podílel se i na vývoji knihovny pro automatizované testování vyvinutých programů.

Vladimír Oraný v rámci své diplomové práce vyvinul (a před vydáním knihy na poslední chvíli ještě upravil) speciální knihovnu umožňující výrazně rozšířit možnosti deklarace požadavků, kterým musejí vyhovovat testované programy. Setkáte se s ní v druhém dílu.

Jarmila Pavlíčková a Luboš Pavlíček nejsou mí studenti, ale kolegové na VŠE. Mnohé z formulací použitých ve výkladu se vytříbily na základě našich četných (a mnohdy i vášnivých) debat o výuce programování. Jarmile bych chtěl navíc poděkovat za to, že mne osvobozuje od řady administrativních úkonů, které jsou pro mne téměř nezvládnutelnou překážkou.

Martin Vondráček podrobně pročetl celý rukopis a přispěl řadou poznámek k zvýšení jeho čitelnosti, srozumitelnosti a odborné přesnosti.

Na závěr pak musím vyjádřit svůj velký dík firmě ICZ a veškerému osazenstvu oddělení Realizace. Bez jejich podpory by kniha nevznikla.

Předmluva k prvnímu vydání

Rudu Pecinovského jsem poprvé potkal v době, kdy jsme oba studovali na Jaderné fakultě ČVUT v Praze. Doopravdy jsme se ale poznali až mnohem později, když jsme na počátku devadesátých let spolupracovali na překladu manuálů k jistému dodnes populárnímu programovému prostředí. Brzy jsme zjistili, že máme jeden společný zájem – učit lidi, jak kvalitně psát programy.

V současné době dominuje při tvorbě aplikací objektově orientované programování. Moderní vývojové nástroje, které jsou na trhu k dispozici, jeho znalost předpokládají, aplikační knihovny z něj vycházejí, softwarové firmy ho vyžadují, nově vznikající programovací jazyky jsou čistě objektové. A když už jsme u těch jazyků: Java je dnes asi nejpoužívanější jazyk pro vývoj nových aplikací a zcela určitě to je jazyk, který se nejdynamičtěji rozvíjí. Přesto téměř všechny učebnice Javy, které na trhu najdete, začínají procedurálním programováním a k objektově orientovanému programování se dostanou až ke konci. Objekty pak často vypadají jako nepříliš pohodlná nadstavba nad procedurálním programováním.

Řekl jsem, že tak vypadají téměř všechny knihy. Kniha Rudy Pecinovského je totiž velmi příjemnou výjimkou. Je to učebnice, která objekty opravdu začíná a prvních několik kapitol se ani ničím jiným nezabývá. Teprve poté, co zvládnete základní pojmy a dovednosti objektově orientovaného programování, se začne zabývat konstrukcemi, jako je cyklus nebo podmínka. Tento postup, který si autor vyzkoušel na začínajících programátorech v programátorských kroužcích a který používá při výuce profesionálů, vás naučí od počátku myslet objektově. Ukazuje objekty jako něco opravdu přirozeného, jako něco, co výrazně usnadňuje přemýšlení o řešené úloze.

Při čtení Rudovy knihy jsem občas litoval, že už umím programovat, a tak jen doufám, že slibované další díly budou stejně dobré.

M. Virius

Úvod

Otevíráte třetí vydání knížky, 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ů.

Co je nového ve 3. vydání

Oproti předchozímu vydání je kniha od základů přepracovaná. Kniha je nyní rozdělena do dvou dílů. První díl se soustředí především na výklad základních architektonických principů, které by si měl čtenář osvojit předtím, než se pustí do kódování složitějších projektů. Jeho cílem je, aby čtenáři přešly tyto principy do krve dřív, než se začne soustředit na kód.

Druhý díl pak získané návyky prohloubí a seznámí čtenáře s řadou dalších programátorských technik. Vysvětlí hlubší souvislosti, na něž v běžných učebnicích již nezbývá místo, a doplní čtenářovy znalosti syntaxe jazyka. Současně učí práci s profesionálním vývojovým nástrojem a seznámí čtenáře s jeho základními vlastnostmi.

Druhý díl je možno použít jako samostatnou učebnici pro ty, kteří již zvládli základní architektonické principy návrhu objektových aplikací z jiných učebnic.

Komu je kniha určena

Tato knížka je určena těm, kteří to se svojí touhou naučit se moderně programovat myslí vážně a chtějí se naučit programovat dobře. Zaměřuje se na ty, kteří nechtějí zůstat obyčejnými kodéry, jejichž práci postupně přebírají nejrůznější nástroje, ale chtějí se propracovat mezi špičkové architekty, kteří umějí navrhnout optimální řešení splňující požadavky zákazníka (a jsou podle toho také ohodnoceni).

Knížka je sice primárně určena těm, kteří ještě nikdy neprogramovali, ale ukázalo se, že se z ní dozvědí hodně nového i poměrně zkušení programátoři. První vydání jsem psal na základě zkušeností z mnoha kurzů. Při vedení těchto kurzů jsem si uvědomil, že to, co děti (a částečně i dospělí, kteří s programováním teprve začínají) pochopí poměrně snadno, zvládají programátoři s předchozími zkušenostmi z neobjektového programování obtížně. Spoustu úsilí totiž musí věnovat tomu, aby se nejprve odnaučili mnohé z toho, co si před tím pracně osvojili. Teprve pak začnou pomalu vstřebávat jiný způsob programátorského myšlení, jejž objektově orientované programování vyžaduje. {1}

Od čtenářů předchozích vydání jsem dostal řadu mailů, v nichž mi psali, že jsou sice zkušenými programátory, ale teprve zde pochopili některé věci, které jim ostatní učebnice a kurzy nedokázaly vysvětlit. Uvědomil jsem si přitom, že knihu mohou s výhodou použít i ti, kteří již nějakou dobu programují a potřebují se přeškolit z klasického, strukturovaného programování na programování objektově orientované (80 % účastníků mých kurzů).

Tady bych ale chtěl případné zkušenější čtenáře upozornit na jedno úskalí: dospělý člověk již, na rozdíl od dětí, nedokáže přijmout nové informace, aniž by je okamžitě nespojoval se svými dosavadními znalostmi a zkušenostmi. Dozví-li se proto informaci, která neodpovídá zcela jeho dosavadním zkušenostem, tak ji podvědomě „ohne“, aby se s nimi dostala do souladu. To je nejčastějším zdrojem problémů zkušenějších programátorů při přechodu na nové paradigma, protože to, co si zapamatují, bývá v důsledku výše zmíněného „ohnutí“ něco trochu jiného, než co se jim snažil přednášející sdělit.

Co se naučíte

Musím vás upozornit na to, že kniha, kterou držíte v ruce, se od běžných učebnic poněkud liší. Ostatní učebnice jsou totiž většinou především učebnicemi nějakého programovacího jazyka. Jejich autoři se proto ve svém výkladu soustředí hlavně na výklad vlastností popisovaného jazyka a jeho knihoven. Bohužel se v nich ale nedozvíte skoro nic o tom, jak při návrhu programů přemýšlet, aby vás nezaskočily náhlé změny zadání, kterými je současné programování pověstné. Takovéto učebnice proto nevychovávají návrháře, kteří by uměli program navrhnout, ale pouze kodéry, kteří umějí zanalyzované zadání zakódovat.

Vypadá to, jako když autoři předpokládají, že se při čtení jejich knihy naučíte programovat nějak sami od sebe obdobně, jako se to museli naučit oni. Zkušenosti s programátory, kteří navštěvují moje kurzy ve firmě či na univerzitě, však ukazují, že tohoto výsledku bývá dosaženo jen zřídka. Většina účastníků mých kurzů zná poměrně dobře konstrukce nějakého objektově orientovaného programovacího jazyka. Bohužel, skoro nikdo z nich v něm neumí objektově programovat{2} , neumí přepnout na objektový způsob uvažování.

Tady si neodpustím vzpomínku na jednoho studenta, který mi na konci semestru vysvětloval, že už profesionálně programuje, takže si myslel, že předmět udělá hravě. Když na začátku semestru viděl, že učím jiné programování, než to, které jej učili na střední škole, řekl si, že to je pouhé hraní a že si počká, až začneme programovat tak, jak je zvyklý, a pak chybějící body hravě dožene. V průběhu semestru však zjistil, že se mu stále vzdalujeme, a když se rozhodl, že se nás pokusí dohnat, odhalil, že řadu konstrukcí, které běžně používáme, vůbec nechápe. Nezbylo mi, než mu zopakovat, že k programování, které bylo hlavním proudem v sedmdesátých letech (a které se na řadě středních škol stále učí), se nevrátím a že většina účastníků přichází do mých kurzů právě proto, aby se tento jiný způsob programátorského myšlení naučila.

Znovu proto opakuji: toto není učebnice programovacího jazyka, toto je učebnice objektového programování. Většina učebnic vás učí, jak to či ono zakódovat v daném programovacím jazyku. My se primárně nebudeme učit, jak program zapsat, ale jak jej navrhnout. Mým cílem není vychovat z čtenářů kodéry v Javě, ale připravit je na to, aby z nich mohli vyrůst schopní architekti. Nebudu vás proto učit specialitám použitého programovacího jazyka, ale pokusím se vás naučit efektivně navrhovat a vytvářet spolehlivé a snadno udržovatelné programy. Jinými slovy: chci vás naučit dovednostem, které budete používat, ať už budete programovat v jakémkoliv objektově orientovaném jazyku. Jazyky přicházejí a odcházejí. Základní programátorské techniky a způsob myšlení však žijí daleko déle než jazyky, se kterými byly zavedeny.

Díky tomu, že se místo na programovací jazyk soustředím spíše na vlastní programování, vznikl v knize prostor pro výklad řady programátorských zásad a technik, o nichž se klasické učebnice vůbec nezmiňují, a to dokonce ani učebnice pro zkušené programátory. Tyto zásady a techniky se většinou přednášejí až v nadstavbových kurzech, které učí vytvářet programy tak, aby s vámi mohly růst a aby vás nezaskočily rychle se měnící požadavky zákazníků (a připravte se na to, že tyto měnící se požadavky vás potkají i v případě, kdy vaším zákazníkem jste vy sami). Přitom vůbec nejde o techniky složité, které by začátečník nezvládl pochopit. Ostatní učebnice je pomíjejí pouze proto, že nesouvisejí přímo se syntaxí programovacího jazyka, ale týkají se obecného programování.

Tato učebnice je naopak vysvětluje od samého počátku výkladu, protože vím, že byste si je měli v co největší míře osvojit ještě před tím, než se seznámíte s kódem. Ti, kteří se nejprve učí kódovat, a teprve následně se dozvídají, jak lze návrh programu zefektivnit, bývají příliš v zajetí svých zkušeností s kódováním a při návrhu programů se pak zbytečně silně soustředí na některé nepodstatné detaily.

Styl výuky

Tuto knihu sice najdete mezi doporučenou literaturou na řadě univerzit, ale není to odborným stylem psaná vysokoškolská učebnice. Naopak. Snažil jsem se ji psát tak, aby se dobře četla i středně bystrému středoškolákovi či středoškolačce a aby, jak s oblibou říkám, vykládaná látka „dobře tekla do hlavy“.

Už podle tloušťky knihy jste nejspíše odhadli, že není určena těm, kteří hledají dvousetstránkovou rychloučebnici, s jejíž pomocí se naučí programovat za víkend. Jestli jste tuto knihu otevřeli, tak asi patříte k těm, kteří vědí, že taková učebnice neexistuje. Dvousetstránková knížka bude možná levná, ale může věci pouze naznačovat, takže se její čtenář dostane ke skutečnému poznání až po následném dlouhém a usilovném samostudiu. Předpokládám proto, že už víte, že tenké učebnice patří ve skutečnosti k těm nejdražším, protože to, co ušetříte při jejich koupi, mnohonásobně ztratíte při následném zdlouhavém osvojování si stručně a náznakově probrané látky.

Tato kniha se od ostatních učebnic a kurzů programování liší ještě v jedné věci: její výklad je koncipován podle metodiky Architecture First, která doporučuje vštípit studentům základní principy návrhu architektury před tím, než začnou psát vlastní programy. Má-li se vám dostat objektově orientované myšlení pod kůži, musíme s jeho výkladem začít hned a nezatěžovat vás napřed klasickými konstrukcemi, které by vaše myšlení směřovaly trochu jinam, takže byste se museli po chvíli zase přeorientovávat.

Zpočátku proto budeme nějakou dobu pracovat v interaktivním režimu, v němž počítači pouze vysvětlujeme, co má udělat, a počítač za nás příslušný program vytvoří. Nebudete se proto muset rozptylovat syntaktickými pravidly použitého programovacího jazyka, ale budete se moci soustředit na architekturu daného programu a vlastnosti jeho součástí. Na klasické konstrukce samozřejmě nezapomeneme, ale dojde na ně řada až v době, kdy již budete mít za sebou několik objektově orientovaných programů, které budete moci pomocí těchto konstrukcí dále vylepšovat.

Většina učebnic demonstruje vykládanou látku na jednoduchých úlohách, jejichž hlavním účelem je demonstrovat vysvětlovanou vlastnost jazyka. Takovéto programy bývají často označovány jako AHA-příklady, protože jejich hlavním účelem je, aby si student po jejich pročtení řekl: „AHA, takhle to funguje!“ Bohužel, z AHA-příkladů ne vždy také pochopí, jak se daná konstrukce v praxi používá.

I když se AHA-příkladům nebudu vyhýbat, budu se vám snažit předkládat i úlohy složitější, a to i za cenu toho, že část úlohy, která bude používat doposud nevysvětlené konstrukce, za vás budu muset předem vyřešit sám. Takovéto úlohy daleko lépe odpovídají těm, s nimiž se budete v praxi setkávat. Typickou úlohou programátora totiž není navrhnout kompletní řešení nějakého jednoduchého problému, ale naopak doplnit stávající, většinou velmi složitý a někým jiným napsaný program o nějakou novou funkci. Při práci na takovýchto příkladech si navíc vyzkoušíte další potřebnou dovednost, kterou je schopnost orientovat se v programu, který je mnohem složitější, než byste sami dokázali v daném okamžiku naprogramovat.

Programovací jazyk

Sliboval jsem, že se nebudu soustředit na výuku jazyka, ale na výuku programování. Výuce programovacího jazyka se však nevyhneme. Budete-li si chtít vyzkoušet to, co jste se naučili, nezbyde vám, než program v nějakém programovacím jazyku vytvořit. Pro demonstraci látky vysvětlované v této učebnici budu používat programovací jazyk Java. Zvolil jsem jej z několika důvodů:

V současné době je to nejrozšířenější programovací jazyk, a to jak z hlediska obliby, tak především z hlediska jeho použití (studie firmy Evans Data uvádí, že v roce 2011 používalo Javu 68 % programátorů).

Je to moderní programovací jazyk, na němž lze demonstrovat použití všech důležitých postupů.

Oproti jiným jazykům je doopravdy jednoduchý, takže se jej snadno naučíte (jak s oblibou říkám: je to jediný univerzální mainstreamový jazyk, který se dá zcela naučit za semestr).

Překladač i ostatní vývojové nástroje je možné získat zdarma. Java je v současné době jediná platforma, pro niž existují profesionální, a přitom volně dostupné nástroje pro vývoj programů všech velikostí, od malých programů pro čipové karty až po rozsáhlé systémy běžící na několika vzájemně komunikujících počítačích rozmístěných po celém světě.

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. Znám programátorské týmy pracující na společném projektu, jejichž členové pracují na různých systémech (Windows – Linux – MacOS) a na všech musí vyvíjený program chodit. Java je v současnosti navíc jediná platforma, jejíž programy můžete spustit prakticky na všech telefonech.

Je to jediný jazyk, k němuž existuje několik zdarma dostupných profesionálních vývojových nástrojů a spolu s nimi i několik nástrojů specializovaných pro výuku (některé z nich dokonce lokalizované do češtiny a slovenštiny).

Jak jsem již řekl, v této učebnici se chci soustředit spíše na to, jak programovat, a programovací jazyk používám pouze jako prostředek k tomu, abychom si mohli vysvětlené věci hned také vyzkoušet. Zkoušet ale budeme hodně, takže se v průběhu výuky naučíte nejenom programovat, ale zároveň získáte jistou praxi při řešení nejrůznějších úloh v programovacím jazyku Java.

Uspořádání

Jak jsem již naznačil, kniha vychází ve dvou dílech. První díl vás má naučit základům objektově orientovaného architektonického myšlení, druhý se pak bude soustředit spíše na techniky a technologie, s jejichž pomocí budete své geniální architektonické nápady realizovat. Přitom prohloubíme i architektonické poznatky z prvního dílu.

První díl je rozdělen do tří částí. V první části využijeme schopnosti použitého vývojového prostředí umožňujícího práci v interaktivním režimu, v němž uživatel představuje jeden z objektů aktuálního projektu, který posílá ostatním objektům různé zprávy. Využijeme toho, že v tomto režimu můžeme vytvářet programy, aniž bychom napsali jediný řádek kódu. Jenom se budeme snažit si osvojit základní principy práce objektově orientovaného programu. Použitému vývojovému prostředí vždy pouze vysvětlíme, co má program dělat, a vývojové prostředí vytvoří daný program za nás. Budeme se proto moci soustředit na klíčové vlastnosti objektového programu, aniž bychom se rozptylovali pravidly psaní kódu.

Nejprve se seznámíme s objekty a třídami objektů. Naučíme se objektům posílat zprávy a analyzovat jejich reakce. Ukážeme si, jak definovat program, aniž bychom museli zapsat nějaký kód. Podíváme se do nitra objektů a představíme si první návrhové vzory. Pak se seznámíme s rozhraním, které je základní konstrukcí moderního programování. Vysvětlíme si, kdy je vhodné je zavést a jaké výhody nám může jeho zavedení přinést. První část ukončí hovory o dědičnosti, jejích možných podobách a vlastnostech včetně představení abstraktních tříd a metod.

V druhé části budeme postupně opakovat vše, co jsme se v první části naučili. Přitom si budeme průběžně ukazovat, jak se jednotlivé konstrukce probrané v první části zapisují v kódu. Vynecháme pouze dědičnost implementace, která s sebou nese tolik záludností, že její výklad odložím až do druhého dílu. V prvním dílu ale probereme řadu jiných základních programátorských technik, které budeme potřebovat pro efektivní definice našich programů. V závěru druhé části si pak budete moci naprogramovat první samostatnou aplikaci – hru, ve které budete ve virtuálním vesmíru přistávat s UFO na předem připravené přistávací rampy.

Třetí část prohloubí některé vaše znalosti a dovednosti. Seznámíme se s pachy v kódu, předvedeme si techniky refaktorace a ukážeme si, jak co nejbezpečněji upravovat hotový kód. Na závěr se naučíte rozdělovat program do balíčků.

Většina úloh, na jejichž řešení vykládanou látku demonstruji, jsou grafické simulace, protože na nich můžete nejlépe pochopit podstatu vysvětlovaných konstrukcí. Říkal jsem si, že pro vás budou zajímavější než obsluha bankovních účtů a další praktické úlohy, s nimiž se v učebnicích často setkáváme.

Úlohy v prvním dílu budou, pravda, celkem triviální, protože toho ještě nebudete moc umět, i když i tady si zkusíte naprogramovat část jednoduché hry. Druhý díl už přinese zajímavější úlohy.

Žádná z úloh zadaných v této knize není pouze zadána. Všechny zadané úlohy jsou vyřešeny, abyste si mohli porovnat své řešení se vzorovým a abyste se v případě, kdy se dostanete do těžkostí a nebudete si vědět rady, měli kam obrátit pro inspiraci. Budete-li se však chtít opravdu naučit programovat, doporučuji vám vyřešit všechny tyto doplňkové úlohy vlastní hlavou.

Jazyk programů

Někteří čtenáři mne občas napadají za to, že ve svých textech používám důsledně českou terminologii a české identifikátory v programech. Za dlouhou dobu své učitelské praxe jsem si však vyzkoušel, že používání původních anglických termínů v začátečnických kurzech není dobré řešení. Začátečníci mívají problémy s pochopením vlastní látky a přidání termínů, kterým nerozumějí (znalost angličtiny u nás stále není na takové úrovni, jakou bychom rádi viděli), jim situaci pouze ztěžuje.

Praxe pak ukazuje, že mnozí „anglicky hovořící“ programátoři schovávají za anglické termíny to, že problému sami nerozumějí a při používání slangu působí na neznalé okolí jako odborníci. Když na začátečníka vybafnu např. název singleton, málokterý bude vědět, co to slovo znamená, a nezbyde mu, než si je zapamatovat jako nějaký nový, cizí termín. Když se pak po pár týdnech výuky zeptám, jaké vlastnosti má návrhový vzor singleton, začnou žáci nejprve tápat, který z probraných vzorů to je, a v řadě případů jej zamění s nějakým jiným.

Když naproti tomu použiji pro daný návrhový vzor termín jedináček, všichni si jej ihned pevně spojí se svojí představou jedináčka. Nejenom že jej pak i po týdnech správně vyloží, ale navíc i lépe pochopí jeho podstatu.

Prosím proto čtenáře, kteří jsou hrdí na svoji znalost angličtiny, aby se smířili s tím, že budu vycházet vstříc většině, která konstrukce označené českými termíny lépe pochopí a daleko lépe si je zapamatuje. Ti, kteří můj počeštěný výklad nepotřebují, se jistě již dávno poučili z některé anglicky psané učebnice.

Odmítám přistoupit na psaní programů s „ceskymi“ termíny bez diakritiky. To je zoufalá berlička těch, kteří neumějí anglicky a schovávají to za pomlouvání identifikátorů s diakritikou. Programovacímu jazyku je opravdu jedno, jestli píšete s diakritikou nebo bez ní, tak proč bychom se měli nechávat znásilňovat počítačem a nutit se programovat tak, jak se programovalo v minulém století, kdy znalost národních abeced nebyla v programovacích jazycích běžná.

Všichni však víme, že programátorský svět je veskrze anglický. Jak s oblibou říkám: „Pracujete-li jako softwaroví vývojáři, máte jen dvě možnosti: buď se naučíte anglicky, nebo změníte zaměstnání.“ V druhém dílu již nebudete naprostí začátečníci, a proto vyměníme používanou knihovnu za její mutaci s anglickými identifikátory (vysvětlující komentáře zůstanou české) a spolu s knihovnou začneme používat anglické identifikátory i v programech v učebnici a v úlohách, které budete řešit, abyste se o svých geniálních programech mohli bavit s kýmkoliv na světě.

Potřebné vybavení

Pro úspěšné studium prvního dílu budete potřebovat čtyři věci:

dostatečně výkonný počítač,

základní vývojovou sadu Javy,

vývojové prostředí BlueJ,

programy používané v příkladech,

internetový prohlížeč, který je schopen přehrát flashové animace použité pro část výkladu.

Sada JDK (Java Development Kit)

K vývoji programů budete potřebovat vývojovou sadu JDK, kterou můžete zdarma stáhnout na adrese http://www.oracle.com/technetwork/java/javase/downloads. Potřebujete ale sadu JDK 7 nebo mladší. Na starších verzích Javy naše programy pracovat nebudou. Počítejte s tím, že instalační soubory zabírají téměř 100 MB a po instalaci bude zabírat okolo 400 MB.

K vývojové sadě si nezapomeňte stáhnout a nainstalovat i dokumentaci. Najdete ji na stejné webové adrese, jenom je na stránce skoro až na konci. Je přibližně stejně rozsáhlá jako samotná vývojová sada (nebojte se, nemusíte ji číst celou), ale při jakémkoliv programování za hranicemi příkladů z učebnice se bez ní neobejdete. Musíte se však smířit s tím, že dokumentaci seženete pouze anglicky. ZIP soubor s dokumentací zabírá asi 60 MB a po rozbalení bude zabírat necelých 300 MB.

Vývojové prostředí

S JDK při vývoji programů teoreticky vystačíte (některé učebnice ani nic jiného nepoužívají), nutí vás však starat se o řadu konfiguračních detailů, které odvádějí vaši pozornost od vlastního programování. Převážná většina programátorů proto používá vývojové prostředí, které tyto detaily vyřeší za ně, a navíc jim pomůže i v řadě dalších oblastí.

Já budu při výkladu používat v prvním dílu vývojové prostředí BlueJ, které můžete (rovněž zdarma) stáhnout na adrese http://bluej.org/download/download.html. Ve srovnání s vlastní Javou je toto prostředí nenáročné. Instalační soubory mají necelých 7 MB a po instalaci zaberou zhruba 10 MB. V druhém dílu pak přejdeme k používání profesionálního vývojového prostředí.

Standardní instalace však nevyužívá všechny výhody, které prostředí BlueJ nabízí, a na druhou stranu se občas stane, že poslední publikovaná verze obsahuje chyby, které vám brání v provedení některých akcí, o nichž v učebnici píšu. Doporučuji vám proto stáhnout verzi tohoto prostředí, kterou najdete na mojí webové stránce http://vyuka.pecinovsky.cz/bluej_config/. Na této stránce najdete vedle anglické verze i verze lokalizované do češtiny a slovenštiny. Oproti původní konfiguraci budou naše programy navíc i trochu barevnější, což vám umožní se v nich lépe orientovat. Současně v nich najdete připravené šablony souborů, které budeme v učebnici vytvářet. Poslední výhodou takto zkonfigurovaných souborů je, že přepnou celé prostředí do kódování UTF-8, takže přestanete mít problémy s přenášením souborů mezi jednotlivými platformami a uživatelé používající Windows si budou moci vesele vyměňovat své programy s uživateli systémů Linux či Macintosh, a to nezávisle na tom, používají-li diakritiku.

Proč právě BlueJ

Na webových programátorských konferencích někteří programátoři kritizovali, že v učebnici nepoužívám některé profesionální vývojové prostředí. Přiznávám, že BlueJ se od těchto prostředí opravdu odlišuje – můžete se je naučit používat tak za 20 minut, kdežto naučit se dokonale některé profesionální vývojové prostředí vám dá víc práce, než se naučit Javu.

Hlavní výhodou prostředí BlueJ však není jeho jednoduchost (i když je nesmírně důležitá), ale to, že je optimalizované pro výuku ve vstupních kurzech programování. Jak jsem již řekl, tato kniha se vás nebude snažit naučit kódovat, ale bude se vás snažit naučit „myslet objektově“. K tomu je důležité, aby vám prostředí umožňovalo přemýšlet na úrovni architektury programů, a nepohybovat se pouze kdesi v suterénu na úrovni kódu.

BlueJ je v době psaní knihy jediné zdarma dostupné vývojové prostředí, které vaše zásahy do architektury okamžitě promítá do kódu, a naopak vaše zásahy do kódu okamžitě promítne do zobrazení architektury, a které současně umožňuje práci v interaktivním režimu, v němž pouze ukazujete, co má program umět, a BlueJ vše naprogramuje za vás. To jiná prostředí neumožňují. Toho budeme využívat v první části, kdy se budeme soustředit na objektové vlastnosti programů, aniž bychom se museli rozptylovat nějakými pravidly pro zápis kódu.

Doprovodné programy

Na stránce knihy na adrese http://knihy.pecinovsky.cz/mojj najdete také soubor s generátorem projektů použitých v knize. Abych vyšel vstříc těm, kteří mají odpor k používání diakritiky, je pro ně na webu připraven program Konverze, který zkopíruje soubory do zadané složky a při tom změní jejich kódování. Při převodu do kódování ASCII zbaví jejich názvy i obsah veškeré diakritiky. Tento program je napsaný v Javě, takže by měl chodit na všech počítačích.

Doprovodné animace

Sami jistě ze zkušenosti víte, že dobrý příklad je v řadě situací lepší než řada slov. Na stránce http://vyuka.pecinovsky.cz/animace je proto připravena celá řada animovaných ukázek, v nichž krok za krokem demonstruji některé vysvětlované postupy. Tyto animace využijete hlavně při čtení první části knihy, protože demonstrují především práci v interaktivním režimu a tvorbu základních konstrukcí. Ukazují, jak tyto konstrukce použít, a předvádějí chování programů, v nichž jsou vysvětlené konstrukce použity.

Animace však nejsou navázány na konkrétní text kapitol této knihy. Vznikly jako doprovod k mým přednáškám a k jiným knihám. Vedle českých animací najdete na zmíněné stránce i řadu anglických, které zase slouží jako doprovod k mému kurzu programování, jenž běží na stránkách NetBeans.

Použité konvence

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 První výskyt nějakého termínu a další texty, které chci zvýraznit, vysazuji tučně.

Názvy Názvy firem a jejich produktů vysazuji kurzivou. Kurzivou vysazuji také názvy kapitol, podkapitol a oddílů, na které se v textu odkazuji.

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

Adresy Názvy souborů a internetové adresy vysazuji obyčejným bezpatkovým písmem.

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

Obrázek knihy označuje poznámku týkající se používané terminologie. Většinou upozorňuje na další používané termíny 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, 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“, ve kterých 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, avšak které nejsou k pochopení látky nezbytné.

Symbol znamení raka označuje poznámku popisující doprovodnou animaci (animovaný výklad), která se vás bude snažit naučit nějakou dovednost, která se špatně popisuje slovy.

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.

Vaše poznámky a připomínky

Kniha vznikala pomalu a dlouho. Přes veškeré úsilí, které jsme jí já i moji spolupracovníci věnovali, nemohu vyloučit, že v textu či doprovodných příkladech zůstaly skryté nějaké chyby. Předem se za ně omlouvám a prosím vás, abyste mi o nich napsali na adresu rudolf@pecinovsky.cz. Já bych je opravil a opravu vystavil na webové stránce této knihy http://knihy.pecinovsky.cz/mojj.

Budete-li mít jakékoliv dotazy k vysvětlovanému textu nebo budete-li mít s něčím problémy, využijte konference na adrese http://www.pandora.cz/list/vyuka_oop. Budete-li do ní chtít poslat příspěvek, musíte se na serveru nejprve zaregistrovat. Číst cizí příspěvky však můžete i bez registrace.

Table of Contents

Obálka

Tiráž

O autorovi

O knize

Skrytí spoluautoři

Předmluva k prvnímu vydání

Úvod

Co je nového ve 3. vydání

Co se naučíte

Styl výuky

Uspořádání

Jazyk programů

Sada JDK (Java Development Kit)

Vývojové prostředí

Doprovodné programy

Doprovodné animace

Vaše poznámky a připomínky

Kapitola 1 Seznamujeme se s nástroji

1.1 Trocha historie

1.2 Objektově orientované programování – OOP

1.3 Překladače, interprety, platformy

1.4 Java a její zvláštnosti

1.6 Projekty a BlueJ

1.7 Diagram tříd

Kapitola 2 Objekty a třídy

2.1 Nejprve trocha teorie

2.2 Výchozí projekt

2.3 Třídy a jejich instance

2.6 Úvod do návrhových vzorů

Kapitola 3 Testovací třída

3.3 Struktura testovací třídy

3.5 Definujeme testovací metody

Kapitola 4 Práce s daty

4.1 Zprávy žádající o hodnotu

4.2 Parametry metod

Kapitola 5 Výlet do nitra objektů

5.1 Atributy (datové členy)

Kapitola 6 Programátorská dokumentace

Kapitola 7 Rozhraní × interface

7.1 Teoretický úvod

7.2 Použití v programu

7.3 Implementace rozhraní třídou

7.6 Přidání mnohotvaru

Kapitola 8 Pokročilá práce s rozhraním

8.3 Kompresor a jím využívaná rozhraní

8.5 Dědění rozhraní

8.6 Návrhový vzor Prototyp (Prototype)

8.8 Nová koncepce projektu

8.9 Nový projekt

Kapitola ‎9 Dědění tříd

9.1 Tři druhy dědění

9.2 Základy dědění tříd

9.3 Pokusy s děděním

9.5 Abstraktní třídy a jejich role v dědické hierarchii

Kapitola ‎10 Vytváříme vlastní třídu

10.2 Zdrojový kód třídy

10.7 Ladění

Kapitola ‎11 Přidáváme parametry

11.4 Testování

Kapitola ‎12 Přidáváme atributy a metody

12.1 Deklarace atributů

12.2 Definujeme vlastní metodu

12.3 Definice metod vracejících hodnotu

12.4 Přístupové metody

12.5 Kvalifikace a klíčové slovo this

Kapitola 13 Pokročilejší práce s daty

13.1 Atributy a metody třídy (statické atributy a metody)

13.4 Konstanty a literály

13.6 Překrývání metod

13.7 Metoda toString() –podpis objektu

Kapitola ‎14 Komentáře a dokumentace

14.1 Zapouzdření a skrývání implementace

14.2 Komentáře a dokumentace

Kapitola ‎15 Operace a operátory

15.1 Jednoduché okenní vstupy a výstupy

15.2 Podrobnosti o operátorech

15.5 Inkrementační a dekrementační operátory

15.6 Standardní výstup

Kapitola ‎16 Definice testovací třídy

16.3 Přípravek

Kapitola ‎17 Ladění programů

17.2 Okno debuggeru

Kapitola ‎18 Implementace rozhraní

18.1 Syntaxe interfejsu

18.3 Přizpůsobení tříd novému projektu

Kapitola 19 Samostatná aplikace – UFO

19.2 Závěrečný příklad – UFO

19.3 BlueJ a editace větších souborů

19.4 Vytvoření samostatné aplikace

Kapitola ‎20 Refaktorace

20.7 Refaktorace třídy ČernáDíra

Kapitola 21 Hodnotové a odkazové objektové typy

21.4 Hodnotové a odkazové objektové typy

21.5 Operátory vracející logickou hodnotu

21.9 Projekt Zlomky

Kapitola ‎22 Složitější rozšíření funkčnosti

22.2 Implementace rozhraní ITvar

Kapitola ‎23 Budete si to přát zabalit?

23.2 Balíčky

23.3 Balíčky a BlueJ

23.6 Balíčky a příkaz import