V minulých dvou článcích jsem se snažil vysvětlit, proč je klasický způsob výuky nevhodný. Nyní se pokusím ukázat, čeho všeho se dá s dětmi dosáhnout při výuce OOP.
Na toto téma jsem již řadu článků publikoval (mnohé na tomto serveru) a nechci se zbytečně opakovat. Pro ty, které by zajímaly některé z článků, na něž bude tento článek navazovat, uvedu nejprve pár odkazů.
Většinu zásad, které bychom se měli ve výuce programování snažit dodržovat, jsem shrnul na tomto serveru v článku Zásady správné výuky programování . Později jsem o těchto zásadách aplikovaných na výuku OOP hovořil na konferenci Objekty 2003 (viz [1]) a na Žilinské didaktické konferenci (viz [2]). Vlastní postup výkladu pak najdete v knize Myslíme objektově v jazyku Java 5.0 [3], která nedávno vyšla a podle níž učím jak děti v kroužcích, tak profesionální programátory ve svých kurzech. Starší verze výkladu najdete i na tomto serveru (viz jejich přehled ). Jeho PDF verzi včetně kapitol, které na České škole nevyšly, si můžete stáhnou na adrese http://vyuka.pecinovsky.cz/.
Nebudu zde proto opakovat, co již bylo napsáno. Spíš bych se vám pokusil přiblížit úlohy, které děti v jednotlivých etapách výuky řeší, abyste je mohli porovnat s úlohami, které lze pro děti připravit při výuce strukturovaného programování. Předvedené úlohy jsou k dispozici ke stažení na adrese http://knihy.pecinovsky.cz/mojj50 (stránka věnovaná zmíněné publikaci, na které jsou doplňující komentáře i doprovodné příklady).
Seznámení s třídami a objekty
V prvních hodinách se děti dozvědí, co je to objekt a třída, a seznámí se s termínem instance třídy. Vysvětlíme si, že objektový program je popis tříd, jejich instancí a zpráv, které si mezi sebou tyto instance posílají. Děti si otevřou projekt se třemi třídami představující grafické objekty a dalšími třemi pomocnými třídami. Zkouší si interaktivně vytvářet instance předdefinovaných tříd a posílat jim i jejich třídám zprávy. Experimentální fáze trvá v dětských kroužcích dva až tři týdny.
Naprogramování vlastní třídy
Po této experimentální fázi se začnou učit, jak definovat vlastní třídy, konstruktory, které vytvářejí jejich instance, metody (ekvivalenty procedur a funkcí), jež jsou popisem reakcí tříd a instancí na zaslané zprávy, a atributy, v nichž si třídy a instance uchovávají informace o svém stavu.
Tato část končí tvorbou hry, při níž mají děti za úkol navrhnout třídu UFO, jejíž instance představují UFO v simulovaném vesmíru. Dostanou seznam 16 zpráv, na které musí UFO umět reagovat, a reakce na tyto zprávy samy naprogramují. Vzhledem k tomu, že 12 z těchto reakcí lze naprogramovat pomocí jediného příkazu, 3 pomocí dvou příkazů a jednu pomocí šesti příkazů, zvládají jejich naprogramování poměrně snadno i ti nejmladší.
Šest příkazů vyžaduje i definice konstruktoru, takže ani ta nebývá zdrojem závažnějších problémů. Výsledkem je program, v kterém se vytvořená UFO pohybují zrychleně v závislosti na velikosti tahu jejich motorů, která se nastavuje stisky kurzorových kláves. Hráči pak mají za úkol dovést UFO ze startovací rampy do některého z připravených hangárů. Chtějí‑li řešení zrychlit, mohou rozpohybovat několik UFO najednou a přepínat mezi jejich ovládáním.
Všimněte si, že děti zde bez problémů vytvářejí program řízený událostmi, v němž se nezávisle na sobě pohybuje několik objektů, které jsou schopny reagovat na příkazy z klávesnice. Nepotřebují k tomu ani podmíněné příkazy, ani cykly.
Polymorfizmus
Po vytvoření třídy UFO s žáky ještě chvíli prohlubujeme jejich znalosti tvorby tříd a pak přejdeme k dalšímu tématu, kterým je polymorfismus. Zde si ukážeme, že jeden a ten samý objekt může měnit svůj typ v závislosti na okamžité potřebě, a převedeme si několik jednoduchých příkladů, jak toho lze využít.
Pokračujeme výkladem dědičnosti typů a ukazujeme si, jak může být v některých případech užitečné, když má parametr více typů současně. Vše si pak demonstrujeme na dvou příkladech.
Nejprve děti seznámím s návrhovým vzorem Stav a ukážu jim, jak je možno s jeho pomocí definovat šipky pohybující se ve čtyřech či osmi směrech (připomínám, že děti stále neznají příkaz if).
Pak dostanou samostatnou úlohu, v níž mají za úkol definovat třídu Kabina, jejíž instance (kabiny) budou schopny se pohybovat po uzavřených linkách od stanice ke stanici. U linky si vždy zjistí, jaká je na ní doporučená rychlost a doporučená doba čekání ve stanici, a po požadovaném počkání vyrazí. Když kabina dojede zadanou rychlostí do další stanice, zeptá se jí, která stanice po ní následuje, a vyrazí k ní. A tak stále pořád dokola.
Děti tak vytvoří další událostmi řízený program, v němž se nezávisle na sobě pohybuje několik objektů. Stále jsme přitom ještě nezavedli podmíněný příkaz ani cykly a nevyužíváme ani rekurzi.
Veškerá „inteligence“ programu je postavena na využití základních objektových konstrukcí a událostmi řízeného programování. Všechny „procedury“ a „funkce“, které děti vytvářejí, obsahují několik málo příkazů. Konkrétně třída pohybujících se kabin vyžaduje definici konstruktoru tvořeného osmi příkazy, tří metod tvořených jediným příkazem, dvou metod tvořených dvěma příkazy a dvou tvořených čtyřmi příkazy. Nic, co by nemohly zvládnout i ty nejmladší děti z kroužku.
Příště předvedu příklady, které s dětmi řešíme poté, co se konečně seznámí s podmíněnými příkazy a cykly.
Literatura
[1] Pecinovský R.: Výuka objektově orientovaného programování žáků základních a středních škol. Objekty 2003 – Sborník příspěvků osmého ročníku konference. Ostrava 2003. ISBN 80-248-0274-0. PDF verzi článku si můžete stáhnout na adrese http://vyuka.pecinovsky.cz/Vyuka_OOP_zaku_zakladnich_a_strednich_skol.pdf
[2] Pecinovský R.: Proč a jak učit OOP žáky základních a středních škol. Žilinská didaktická konferencia, červen 2004. PDF verzi článku si můžete stáhnout na adrese http://vyuka.pecinovsky.cz/Proc_a_jak_ucit_OOP_na_ZS_a_SS.pdf
[3] Pecinovský R.: Myslíme objektově v jazyku Java 5.0, Grada, 2004. ISBN 80‑247‑0941‑4.
Autor pracuje jako EDU-expert ve společnosti Amaio Technologies, Inc.
Rudolf Pecinovský
0 komentářů:
Okomentovat