Objektovo-orientované programovanie, ak. rok 2023/24

Cvičenie 3

(k prednáške 3)

späť


Projekt

Využite možnosť prekonzultovať zámery svojich projektov s vyučujúcimi na cvičeniach. Tu je opísaný rámcový postup na realizaáciu projektu, ktorý presahuje rámec tohto cvičenia. Zatiaľ ho preštudujute a do budúceho cvičenia sa uistite, že viete, na čo bude zameraný váš projekt, a že dokážete aj diagramaticky vyjadriť jeho podstatu, ako je vysvtlené ďalej.

Predstavte si, že sa váš program vykonáva a identifikujte jednu alebo viac typických situácií, ktoré pritom vznikajú. Zamyslíte sa nad tým, aké dôležité objekty sa v danej situácii vyskytujú. Aké vlastnosti majú tieto objekty? Nakreslite tieto objekty a spojte hranami tie objekty, medzi ktorými preedpokldáte interakciu. V tomto momente si nerobte starosti s triedami, ale dbajte na výstižne pomenovanie objektov. Na kreslenie takéhoto diagramu objektov môžete použiť nástroj UMLet. Pozrite príklad diagramu objektov pre hru s obrami a rytiermi, ktorý znázorňuje interakciu obra a rytiera (PDF/UXF), alebo ďalší diagram objektov, ktorý znázorňuje aj objekt stretu (PDF/UXF).

Objekty, ktoré ste identifikovali, možno zovšeobecniť, čím získate kľúčové triedy vášho programu. Názvy tried vyplývajú z názvov objektov. Vzťahy medzi triedami vyplývajú zo väzieb medzi objektmi. Na tejto úrovni sa môžete obmedziť na dva typy vzťahov: všeobecnú asociáciu a dedenie. Vlastnosti identifikovaných objektov predstavujú atribúty a metódy týchto tried. Na kreslenie takéhoto diagramu tried znovu môžete použiť nástroj UMLet. Pozrite príklad diagramu tried pre hru s obrami a rytiermi (PDF/UXF).

Vytvorte provizornú implementáciu identifikovaných tried (napíšte ich kód). Niektoré ich časti zostanú nejasné, ale ešte stále môžete z nich vytvoriť niekoľko objektov a vyskúšať funkcionalitu, ktorú poskytnete.

Funkcionalitu zatiaľ kontrolujte obyčajnými výpismi na štandardný výstup (pomocou print() alebo println()). Ak potrebujete vstup, môžete využiť štandardný vstup a výstup, v čom vám môže pomôcť príklad načítania vstupu z konzoly. Používateľské rozhranie rozpracujete neskôr. Už na ďalšej prednáške budeme hovoriť o grafickom používateľskom rozhraní.

Niektoré z tried možno budú vo vzťahu dedenia. Z niektorých tried možno nebudete chcieť povoliť tvorbu objektov – tie budú abstraktné. Už teraz možno identifikujete aj niektoré rozhrania.

Všetko môžete neskôr zmeniť, ale skúste sa už teraz povzniesť nad prosťé zabezpečenie želanej funkčnosti a pridajte flexibilitu uplatnením polymorfizmu. Váš program by mal byť otvorený pre rozšírenie bez nutnosti modifikácie základnej logiky. Podobný stav sme dosiahli v hre s obrami a rytiermi, kde, napriek rozšíreniam, metódu stret() triedy Stret tvorí slučka, ktorá tam bola už v prvej verzii kódu.

^


UMLet

V CPU je dostupný nástroj na kreslenie UML a iných diagramov: UMLet. Nástroj môžete stiahnuť a inštalovať na vašich počítačoch. Dostupná je aj online verzia: UMLetino. Pri oboch nástrojoch dbajte na to, aby ste diagramy ukladali v editovateľnom formáte UXF, a nie iba ako obrázky alebo PDF súbory.

Prvky z palety vpravo vyberáte dvojitým kliknutím. Vybraný prvok následne môžete upravovať v poli pod paletou. V menu File máte možnosť diagram exportovať.

^


Úlohy

  1. V hre s obrami a rytiermi z prednášky bol aplikovaný návrhový vzor Observer.
    1. Preštudujte realizáciu tohto vzoru v hre.
    2. Pridajte ďalšieho pozorovateľa jedného z dvoch jestvujúcich druhov.
    3. Pridajte ďalší druh pozorovateľa.
  2. V hre s obrami a rytiermi z prednášky bol aplikovaný návrhový vzor Strategy.
    1. Preštudujte realizáciu tohto vzoru v hre.
    2. Zmeňte stratégiu na inú z jestvujúcich dvoch.
    3. Pridajte ďalšiu stratégiu.
  3. V hre s obrami a rytiermi z prednášky bol aplikovaný návrhový vzor Visitor.
    1. Preštudujte realizáciu tohto vzoru v hre. Všimnite si absenciu explicitne vyčleneného rozhrania Visitor a rozšírenie zoznamu parametrov operácie (metódy) accept().
    2. Metóda attack() triedy Knight je v triede BraveKnight prekonaná, ale jej telo je len zopakované. Zrušte túto metódu v triede BraveKnight. Spusťte program. Všimnite si (na základe výpisov), že sa pri útoku všetci rytieri správajú ako objekty triedy Knight. Prečo? Ak sa vám nedarí nájsť dôvod, kliknite sem pre tip. (Pre ďalšie úlohy vráťte kód do pôvodného stavu.)
    3. Pridajte ďalší druh meča. Treba upraviť triedy rytierov?
    4. Pridajte ďalší druh rytiera. Čo musíte zmeniť v triedach, ktoré reprezentujú druhy mečov? Treba upraviť iné triedy rytierov?
  4. (Nepovinná úloha.) Vyskúšajte príklady návrhových vzorov Observer, Composite a Strategy podľa poskytnutého kódu. Kód je uvedený v zjednodušenej forme: kompletný kód je v jednom súbore (môžete ho rozdeliť do súborov podľa typov). Pri vzore Observer skúste pridať ďalší spôsob zobrazenia teploty, napr. vysoká/nízka teplota alebo teplota zaokruhlená na celé stupne. Príklad uplatnenia návrhových vzorov Composite a Strategy je len načrtnutý: kód treba doplniť, aby sa dal spustiť. Zoznamy (List a ArrayList) a tzv. rozšírenú slučku for zatiaľ nechajme bokom. Dostaneme sa k ním na prednáške o štruktúrovaných typoch údajov, generickosti a perzistencii.

^



Valentino Vranić
vranic at stuba.sk