Rudolf Pecinovský: Seriál Učíme objektově orientované programování (1)

Thursday, November 28, 2002 ·

Tento článek je úvodním dílem seriálu, ve kterém se pokusím ukázat, jak lze učit děti objektově orientovanému programování (OOP). Ve svých dosavadních článcích jsem se prozatím snažil vysvětlit, proč musíme naše svěřence učit OOP, a zároveň se pokoušel naznačit i některé základní atributy této výuky (doporučený jazyk, doporučené vývojové prostředí, systém vyhotovování a distribuování domácích úkolů, …).

Úvod

Tento článek je úvodním dílem seriálu, ve kterém se pokusím ukázat, jak lze učit objektově orientované programování (OOP). Ve svých dosavadních článcích jsem se prozatím snažil vysvětlit, proč musíme naše svěřence učit OOP, a zároveň se pokoušel naznačit i některé základní atributy této výuky (doporučený jazyk, doporučené vývojové prostředí, systém vyhotovování a distribuování domácích úkolů, …).

Tento seriál se již nebude zabývat otázkou, proč učit OOP, ale soustředím se plně na otázku jak. Budu vás průběžně seznamovat s lekcemi, které jsem připravil pro své svěřence v kroužku pokročilého programování na ZŠ Pod Marjánkou. V tomto kroužku mám děti, které navštěvují 3. až 7. třídu a které již zvládly programování v Baltíkovi na úrovni učebnice, kterou jsem pro firmu SGP před pár lety napsal. O dalších požadavcích, které na ně mám, jste se mohli dočíst v  přihlášce , která byla publikována i zde na České škole.

Máte-li chuť, vydejte se s námi do nového programátorského světa. Od čtenářů nebudu předpokládat žádné speciální znalosti - bude stačit, když budou mít zvládnutého Baltíka na úrovni knížky Baltík - učebnice programování nejen pro děti. Abych umožnil získat vhled do OOP i těm, kteří dávají přednost jinému programovacímu jazyku než Javě, kterou jsem zvolil já, budu se snažit psát tak, abych (pokud to půjde) minimalizoval závislost popisované látky na použitém programovacím jazyce.

Dopředu bych se chtěl omluvit, že tento text nebude dokonalou učebnicí s vychytanými neduhy, protože bude vznikat za chodu. Může se proto stát, že si při výkladu nějaké pozdější partie uvědomím, že jsem vám měl v některé z minulých kapitol něco vyložit, takže budu muset výklad občas přetrhnout drobnými návraty k dříve vyložené látce. Stejně tak není vyloučeno, že v průběhu výkladu budu muset lehce upravovat dříve publikované demonstrační programy. Nekamenujte mne za to, prosím; je to cena za to, že dostanete text do ruky co nejdříve. Vyjde-li kurz někdy knižně, mělo by to tam být již všechno opraveno.

Objevíte-li v kurzu či jeho doprovodných materiálech jakékoliv nesrovnalosti, neostýchejte se ozvat na adresu rudolf@pecinovsky.cz.

1. Třídy a objekty

Všechny programy, které vytváříme, jsou simulací našeho okolního světa. Okolní svět je světem objektů. Budeme-li chtít, aby naše programy modelovaly tento svět co nejvěrněji, měly by být schopny modelovat obecné objekty spolu s jejich specifickými vlastnostmi a schopnostmi.

Kvalita programu a rychlost jeho tvorby je velice úzce svázána s hladinou abstrakce, kterou při jejich tvorbě používáme. Budeme-li např. programovat ovládání robota, bude pro nás výhodnější jazyk, v němž můžeme zadat příkazy typu "zvedni pravou ruku", než jazyk, v němž musíme vše vyjadřovat pomocí strojových instrukcí. Máme-li proto být schopni rychle vytvářet kvalitní programy, měli bychom mít k dispozici jazyk, jehož jazykové konstrukce nám umožní co nejvyšší míru abstrakce, při níž se můžeme vyjadřovat tak, abychom mohli přirozeně popsat modelovanou skutečnost.

Všechny moderní programovací jazyky se honosí přídomkem „objektově orientované“. Tím se nám snaží naznačit, že nabízejí konstrukce, které umožňují rozumně modelovat náš okolní, objekty tvořený svět.

1.1 Nejprve trocha teorie

Než se vrhneme na vlastní programování, povíme si nejprve trochu o nejdůležitějších termínech, s nimiž se budeme v dalším výkladu setkávat. Abych vás tou teorií příliš neunavoval, tak tyto termíny opravdu jen zavedu a nebudu je nijak rozpitvávat. Postupně je pak podrobněji vysvětlím na příkladech v dalším textu. Důležité je nyní pouze to, abyste získali základní, rámcovou představu, co daný termín znamená.

Třídy a jejich instance

Objekty, s nimiž se ve svém okolí setkáváme, můžeme rozdělit do kategorií, které v programování označujeme jako třídy. Vlastní objekty pak označujeme jako instance jejich třídy - např. židle, na které sedíte, je instancí třídy židlí. Mohli bychom tedy říct, že instance (objekt) je nějakou konkrétní realizací své třídy (židle, na které sedím, je konkrétní realizací obecné židle).

Třídy popisují společné vlastnosti svých instancí. Zdá-li se nám, že uvnitř třídy existuje skupina objektů, které mají nějaké zvláštní vlastnosti, můžeme pro ně definovat nějakou speciální třídu, která bude podtřídou obecnější třídy, tzv. nadtřídy. (Když jsem se již zmínil o židlích, můžeme mezi nimi vyčlenit např. třídu kolečkových židlí, která bude podtřídou třídy židlí.) Podtřída bývá často označována jako dceřiná třída nebo odvozená třída a její nadtřída pak jako rodičovská třída. (V našem příkladu je třída kolečkových židlí dceřinou třídou třídy židlí a naopak třída židlí je rodičovskou třídou třídy kolečkových židlí.)

Třída může mít většinou několik instancí (třídy s jedinou povolenou instancí - jedináčkem - jsou spíše výjimkou). Na druhou stranu každý objekt je vlastní instancí právě jedné třídy - té, která jej „porodila“. Současně jej lze považovat za instanci kteréhokoli z jejích rodičů (prarodiče se v OOP počítají mezi rodiče).

Židle, na které sedím, je tedy podle předchozího výkladu vlastní instancí třídy kolečkových židlí, ale v případě potřeby ji mohu považovat i za instanci obecné třídy židlí, a kdybych šel dál, i třídy nábytku (rodičovská třída třídy židlí) a obecných objektů (rodičovská třída nábytku).

Odbočka pro šťouraly:
Tady se nám programování zdánlivě trošku odchyluje od toho, co známe z okolního světa. Mnohé z vás asi napadlo, že vedle kolečkových židlí bychom mohli mít i např. židle kovové nebo čalouněné, a že vaši židli byste rádi jednou považovali za instanci třídy kolečkových židlí, podruhé za instanci třídy židlí kovových a potřetí za instanci židlí čalouněných. O tom, jak tento problém řešit, si povíme později. Prozatím se na to dívejte tak, že objekt mohla "porodit" pouze jediná třída - ta, jejíž je daný objekt vlastní instancí.

Pro znázornění hierarchie tříd (tj. kdo je čím rodičem a potomkem) se používá grafický jazyk UML (Unified Modeling Language - můžete se s ním seznámit např. v publikaci J. Schmuller: Myslíme v jazyku UML.Grada, 2001.) V něm se třídy znázorňují vodorovně rozdělenými obdélníky, v jejichž horní části je uvedené jméno třídy. Rodičovskou posloupnost pak znázorňujeme šipkami zakončenými nevyplněným trojúhelníkem, které vedou od dceřiných tříd k jejich rodičům. Náš předchozí příklad s židlemi bychom v jazyku UML znázornili následovně:

Obrázek 1.1:  Hierarchie rodičů a prarodičů kolečkové židle zapsaná v UML.

Poznámka:
Protože programové prostředí BlueJ, které budu při svém výkladu používat, se s češtinou, bohužel, příliš nekamarádí, budu v textech programů používat názvy bez háčků a čárek. Jestli tuto chybičku autoři prostředí v příští verzi napraví, začnu nabodeníčka používat.

Zprávy

Objekty si mohou navzájem posílat zprávy, ve kterých se žádají o různé služby, přičemž onou službou může být často jen informace. (Můžeme se např. židle zeptat, je-li čalouněná. V praxi bychom to realizovali nejspíše tak, že bychom k ní poslali upřený pohled, v programu k ní vyšleme zprávu.)

Objektový program je pak množinou objektů, které si navzájem posílají zprávy. V objektovém programování proto neplatí občas slýchaná definice, že program je posloupnost příkazů. Chcete-li se naučit programovat objektově, musíte nejprve  tuto definici zapomenout.

Historická odbočka:
Definice, že program je zapsaná posloupnost příkazů, platila pro první tři zkonstruované počítače: Babageův Analytical Engine z poloviny devatenáctého století (to není překlep, ten počítač byl opravdu konstruován okolo roku 1850), Zuseovy počítače z konce třicátých let minulého století a Aikenův Mark 1 z počátku let čtyřicátých.

Avšak programy pro známý ENIAC z poloviny čtyřicátých let minulého století by bylo lze označit za posloupnost příkazů jen s velkým sebezapřením, protože obsahoval řadu paralelně pracujících jednotek, které si navzájem předávaly informace. Jeho programování však bylo natolik časově náročné, že jej později převedli na von Neumannovu koncepci, takže v druhé polovině jeho života již pro něj definice programu jako posloupnosti příkazů platila.

V průběhu padesátých let došlo k obrovskému rozmachu nejen počítačů, ale také teorie programování a programátorských technik. Na počátku šedesátých let se tak začalo hromadně používat paralelní, událostmi řízené programování, a takovéto programy bychom za posloupnost příkazů považovat neměli.

Posloupností příkazů nebyly ani programy psané v objektově orientovaných jazycích let sedmdesátých (např. Smalltalk) a už vůbec ne v logických programovacích jazycích let osmdesátých (např. Prolog).

Je samozřejmé, že většina programů se nakonec transformuje na posloupnost příkazů ve strojovém kódu, jenže my bychom měli při návrhu a realizaci svých programů zůstávat na optimální hladině abstrakce a tam pravidlo o posloupnosti příkazů již v současné době většinou neplatí.

Na dotaz, co je to program, většinou odpovídám, že je to předpis, jak splnit zadanou úlohu, zapsaný v nějakém programovacím jazyce (dokud není zapsaný v programovacím jazyce, není to program, ale algoritmus). Tato definice je možná přesná (a bude nejspíš platit stále), nicméně je tak obecná, že je pro naše účely prakticky nepoužitelná.

Definujme si proto, že objektově orientovaný program je v nějakém programovacím jazyce zapsaný popis použitých tříd, objektů a zpráv, které si tyto objekty posílají, doplněný u složitějších programů ještě o popis umístění programů na jednotlivých počítačích a jejich svěření do správy příslušných služebních programů (např. operačních systémů či aplikačních serverů).

Terminologická odbočka:
Budete-li slyšet programátory velkých aplikací hovořit o „deploymentu“, tak vězte, že hovoří o výše zmíněném rozmísťovacím aspektu svých programů.

Jak je z uvedené definice patrné, přechodem na objektové programování vstupujete do jiného programátorského vesmíru. Do vesmíru, v němž sice použijete mnohé z toho, co jste se naučili při studiu klasického programování, ale v němž se základní úvahy o koncepci a konstrukci programu ubírají naprosto jinými cestami, než na které jste byli doposud zvyklí.



Rudolf Pecinovský

0 comments:

Články dle data



Učitelské listy

Nabídka práce

Česká škola - portál pro ZŠ a SŠ

Česká škola poskytuje svým čtenářům diskusní prostor k vyjádření názorů na školskou problematiku. Tyto příspěvky se nemusí shodovat se stanoviskem redakce České školy a jsou uveřejňovány jako podnět k dalším diskusím.

Obsah článků nemusí vyjadřovat stanovisko redakce nebo vydavatele Albatros Media, a.s.


Všechna práva vyhrazena.

Tento server dodržuje právní předpisy
o ochraně osobních údajů.

ISSN 1213-6018




Licence Creative Commons

Obsah podléhá licenci Creative Commons Uveďte autora-Neužívejte dílo komerčně-Nezasahujte do díla 3.0 Česká republika, pokud není uvedeno jinak nebo nejde-li o tiskové zprávy.



WebArchiv - archiv českého webu



Tyto webové stránky používají k poskytování služeb, personalizaci reklam a analýze návštěvnosti soubory cookie. Informace o tom, jak tyto webové stránky používáte, jsou sdíleny se společností Google. Používáním těchto webových stránek souhlasíte s použitím souborů cookie.