Programování pro hračičky/Andělé/Lekce 1
Tato stránka je součástí kurzu: | |
středoškolská | |
Příslušnost: skupinová |
O co nám půjde?
[editovat]Cílem tohoto kurzu je dojít od prvního seznámení se světem programování ke schopnosti analyzovat úlohu, navrhnout datové struktury a algoritmus k jejímu řešení, a pak ji též naprogramovat v nějakém programovacím jazyce a vývojovém prostředí, přičemž za tento jazyk budeme brát v rámci tohoto kurzu LPC a za vývojové prostředí MUD Prahy. Během kurzu bychom se však měli vzdělat natolik, abychom dokázali využít své znalosti analýzy a algoritmizace úloh pro programování v libovolném dalším programovacím jazyce, kterému se (někde mimo tento kurz) naučíme.
Výchozí ujasnění pojmů
[editovat]- algoritmus a program
- programování, programovací jazyk
- procedurální a objektový přístup (jak vidno v těch wikipedických článcích, je možno dělit podrobněji, ale pro jednoduchost stačí uvědomit si tuto základní polaritu — obojí budeme používat, nejsou to přístupy protichůdné, nýbrž vzájemně se doplňují)
Příprava
[editovat]Objekty a jejich vlastnosti
[editovat]Projdeme se hrou a budeme si všímat jednotlivých objektů: jsou to jednak předměty, s nimiž můžeme různě zacházet (sušenka, hrnec, plácačka), jednak místnosti, mezi nimiž se pohybujeme (jídelna, šatna, plošinka na schodišti, sprchový kout), jednak nehráčské postavy, s nimiž se setkáváme a komunikujeme (Josef, Lída), jednak samotné postavy hráčů.
Objekty mají různé vlastnosti, které můžeme zjistit jejich prozkoumáváním různými smysly (prohlédni si sušenku
, očichej sušenku
a pod.), a také reagují na různé akce (vem sušenku ze stolu
, jez sušenku
a pod.), resp. dá se s nimi zacházet různými metodami. Na tyto reakce se můžeme dívat stejně jako na vlastnosti, respektive i vlastnosti můžeme považovat za reakce na akce (napíšu očichej sušenku
, a sušenka zareaguje tím, že mi pošle zprávu o své vůni).
Ve výsledku si můžeme představit, že všechny akce a reakce jsou zprávy, které si objekty vzájemně posílají, a přitom případně mění některé své vlastnosti, tedy informace, které mají někde uloženy: Když napíšu příkaz sever
, pak je to zpráva pro místnost, v níž se právě nacházím. Místnost mi buď pošle zprávu, že na sever jít nemohu, nebo rozešle zprávu o mém odchodu všem objektům, které se v ní nacházejí, vyřadí mne ze seznamu těchto objektů a pošle zprávu o mém pohybu sousední místnosti. Sousední místnost mi pak pošle zprávu se svým popisem, zapíše si mne mezi objekty, které se v ní nacházejí, a rozešle všem objektům z tohoto seznamu zprávu o mém příchodu.
Přinejmenším zprvu se tak můžeme na všechny objekty dívat jako na černé skříňky, u nichž určitému vstupu (zprávě, která byla danému objektu poslána) odpovídá určitý výstup (zprávy, které objekt pošle jiným objektům). Uvědomíme si, jaké výstupy očekáváme v odpovědi na určitý vstup od objektů různých druhů (sušenka, hrnec, stůl, místnost atd.) — v čem se tyto očekávané reakce u různých objektů shodují (sušenku i hrnec mohu vzít), a v čem se naopak liší (sušenku mohu sníst, do místnosti mohu vstoupit).
Dědičnost
[editovat]Na objekty, které se v něčem chovají stejně, můžeme nahlížet jako na určitou třídu objektů: sušenku, kmín, huspeninu a další objekty, které se dají jíst (tedy reagují na příkaz jez
tím, že začnou vydávat zprávy o tom, jak je jíme, a v závěru tohoto procesu se samy zničí), můžeme shrnout do třídy „potrava“; sušenku, hrnec, lístek a další objekty, které můžeme brát, přenášet a pokládat, můžeme shrnout do třídy „objekty, kterými se dá pohybovat“; hrnec, truhlu, místnost a další objekty, v nichž mohou být obsaženy jiné objekty, můžeme shrnout do třídy „objekty s obsahem“. Naopak můžeme říci, že objekt sušenky je uskutečněným zástupcem, tedy instancí třídy „potrava“.
Každý objekt třídy „potrava“ bude zároveň patřit do třídy „objekty, kterými se dá pohybovat“. To znamená, že všechny vlastnosti, které očekáváme od pohybovatelného objektu, bude mít rovněž objekt potravy. Pokud tedy máme již vytvořen objekt, kterým se dá pohybovat, a chtěli bychom vytvořit objekt potravy, je vhodné jeho pohybovací funkce nevytvářet znovu, nýbrž převzít od již hotového pohybovatelného objektu — v praxi to znamená, že vytvářenému objektu potravy (resp. třídě „potrava“) sdělíme, že má zdědit vlastnosti (a metody zacházení) od pohybovatelného objektu (resp. od třídy „objekty, kterými se dá pohybovat“).
Objekty třídy „potrava“ budou takto dědit též od dalších tříd („objekty, na které se dá dívat“, „objekty, které je možno očichávat“ atd.), takže každý objekt potravy půjde vzít, prohlédnout, očichat atd., a samozřejmě také jíst. Objekt této třídy se tedy přímo může vyskytnout ve hře — sada jeho vlastností bude stejná jako u každého jiného objektu potravy, jen bude konkrétně jinak nastavena. Oproti tomu objekt třídy „objekty, kterými se dá pohybovat“ se sám o sobě ve hře vyskytnout nemůže — musí nejprve zdědit další vlastnosti, které přímo nesouvisí s pohybovatelností, ale patří ke všem ve hře se vyskytujícím pohybovatelným předmětům (prohlédnutelnost, očichatelnost a pod.); takovým třídám se říká abstraktní.
Nyní můžeme u různých objektů ve hře přemýšlet, do jakých tříd mohou patřit, resp. jaké abstraktní třídy potřebuje celá hra, aby se s ní dalo zacházet způsobem, kterým s ní zacházíme.
Reálný a naprogramovaný svět
[editovat]Protože naprogramovaný svět mezi Prahy napodobuje různé části našeho reálného světa, můžeme zprvu nabýt dojmu, že by bylo možno celý reálný svět takto reprezentovat virtuálně. Možno to není (a to se dá dokonce matematicky dokázat), a v praxi to ani nechceme, nýbrž při programování úloh souvisících s reálným světem pečlivě zvažujeme, které vlastnosti reálných objektů jsou pro úlohu podstatné, a které naopak nejsou.
Takováto redukce je zcela zásadním krokem při analýze úlohy a jejím následném programování. Pokusme si proto u různých herních objektů (sušenka, truhla, svetr, místnost atd.) uvědomovat, jakým způsobem je příslušný reálný objekt zredukován na objekt herní:
- Jaké z jeho vlastností a metod zacházení hrají roli i ve hře? Jaké jsou naopak pro hru nepodstatné? Jaké by se ve hře mohly uplatnit, jen (zatím) nebyly naprogramovány?
- Pokud by se měly ve hře uplatnit některé vlastnosti objektu, které zatím nejsou naprogramovány, co by na nich bylo pro hru podstatné, jaké akce by tím byly ovlivněny, co všechno by se změnilo vůči jiným objektům i hráčům?
- Jak spolu souvisí různé ve hře implementované vlastnosti a metody objektu? (Například pohyb předmětu musí brát ohled na jeho hmotnost atd.)
- S jakými jinými objekty takový objekt sdílí své vlastnosti a metody, případně některé z nich? Ze kterých abstraktních tříd je asi dědí?
Úkol do příští lekce
[editovat]Rozmyslete si reálný objekt, který jste ve hře zatím nepotkali, ale který byste potkat mohli, kdyby ho někdo naprogramoval.
- Které jeho vlastnosti a metody by byly pro hru podstatné? Udělejte si jejich přehledný soupis, z něhož bude též patrné, které metody a vlastnosti na sobě vzájemně závisí.
- Které z těchto vlastností a metod by objekt sdílel s jinými objekty? Pokud by byl přímo instancí nějaké třídy, co všechno by do takové třídy patřilo? Z jakých dalších tříd by své vlastnosti a metody dědil, s jakými jinými třídami objektů (stačí příklady) je sdílel?
Své nápady můžete (ale nemusíte) popsat též na stránce pro tento úkol vyhrazené, kde na ně pak mohou reagovat jak další účastníci kurzu, tak jiní uživatelé Wikiverzity.