Verze 15.57.5745 2015-10-24: 365 NS, 8 253 odstavců, 89 019 slov, 657 239 znaků, 2 963 968 bajtů OOP a Java 8 Návrh a vývoj složitějšího projektu vyhovujícího zadanému rámci Rudolf Pecinovský 49R_Adventura_TXT_ZLOM.doc verze 15.57.5745 2015-10-24, uloženo: so 2015-10-24 15:53 Strana 2 z 351 Ukázka knihy z internetového knihkupectví www.kosmas.cz
Rudolf Pecinovský OOP a Java 8 Návrh složitějšího projektu vyhovujícího zadanému rámci Copyright Rudolf Pecinovský, 2015 Vydalo nakladatelství Tomáš Bruckner, http://nakladatel.bruckner.cz První vydání, Řepín-Živonín 2015 V knize použité názvy mohou být ochrannými známkami nebo registrovanými ochrannými známkami příslušných vlastníků. Návrh vnitřního layoutu Rudolf Pecinovský Zlom Rudolf Pecinovský Počet stran 351 ISBN 978-80-87924-03-7 (PDF) Strana 3 z 351
Všem, kteří se chtějí něco naučiti Strana 4 z 351
Stručný obsah 5 Stručný obsah Stručný obsah Stručný obsah... 5 Podrobný obsah... 6 Seznam programů... 15 Seznam obrázků... 20 Seznam odboček podšeděných bloků... 21 Úvod... 22 1. Zadání projektu... 31 2. Podpůrný framework... 35 3. Koncepce testů scénáře... 50 4. Správce scénářů... 67 5. Návrh správce scénářů konkrétní hry... 84 6. Sjednocený správce scénářů... 111 7. Návrh rámce pro hru... 128 8. Začínáme tvořit vlastní hru... 147 9. Vytváříme svět hry... 177 10. Dotahujeme svět hry... 204 11. Vytvoření prvních definic povinných akcí... 217 12. Definice společného rodiče kontejnerů h-objektů... 242 13. Definice nestandardních akcí... 272 14. Realizace rozhovoru... 298 15. Zprovoznění zbylých testů... 316 16. Definice uživatelského rozhraní... 321 A Používané termíny... 341 B Šablony zdrojových kódů... 345 Literatura... 348 Rejstřík... 349 Strana 5 z 351
Podrobný obsah 6 Podrobný obsah Podrobný obsah Stručný obsah... 5 Podrobný obsah... 6 Seznam programů... 15 Seznam obrázků... 20 Seznam odboček podšeděných bloků... 21 Úvod... 22 Účel této publikace... 22 Komu je kniha určena... 23 Rozdělení textu... 23 Koncepce výkladu... 24 Terminologie... 25 Použitý jazyk... 25 Potřebné vybavení... 25 Doprovodné programy... 26 Formátování doprovodných programů... 26 Použité typografické konvence... 27 Odbočka podšeděný blok... 29 Zpětná vazba... 29 1. Zadání projektu... 31 1.1 Koncepce vyvíjené hry... 31 Co to je h-objekt... 32 1.2 Příklady her... 33 1.3 Shrnutí co jsme se dozvěděli... 34 2. Podpůrný framework... 35 2.1 Koncepce frameworku... 35 Vymezení mantinelů... 35 Doména pedu.eu a balíček eu.pedu... 36 Předpřipravené datové typy a soubory... 36 Usnadnění testů... 36 2.2 Propojení frameworku s vyvíjeným programem... 37 2.3 Umístění zdrojových kódů do balíčku... 37 Rodičovský balíček... 38 Dvě konvence... 38 Konvence respektující školu studenta... 38 Konvence nerespektující školu studenta... 39 Balíček studenta... 39 Balíček řadového čtenáře... 40 Balíček doprovodných programů... 40 2.4 Pojmenování projektů... 41 2.5 Vytváříte svůj projekt... 41 Strana 6 z 351
Podrobný obsah 7 2.6 Jméno a ID autora... 42 Problémy klasického řešení... 42 Řešení v Javě 8... 42 Definice vlastního autorského interfejsu... 45 2.7 Interfejs IGSMFactory... 45 Definice vlastní tovární třídy... 48 2.8 Program Zipper... 48 2.9 Shrnutí co jsme se v kapitole dozvěděli a co jsme prozatím naprogramovali... 49 3. Koncepce testů scénáře... 50 3.1 Jak testovat... 50 Programování řízené testy... 51 Jednotkové a integrační testy... 51 Možnosti testování naší hry... 52 3.2 Třída Scenario... 53 3.3 Kroky scénáře třída ScenarioStep... 53 Jednoslovnost názvů... 55 3.4 Typ kroků scénáře třída TypeOfStep... 55 3.5 Třída ScenarioStep podrobněji... 60 3.6 Typ scénáře třída TypeOfScenario... 62 3.7 Simulace průběhu hry... 63 3.8 Minimální požadavky na hru a její scénáře... 63 3.9 Diagram tříd balíčku scenario... 64 3.10 Shrnutí co jsme se v kapitole dozvěděli a co jsme prozatím naprogramovali... 64 4. Správce scénářů... 67 4.1 Interfejs IScenarioManager... 67 4.2 Správce by měl být jedináček... 68 4.3 Spravované scénáře... 68 4.4 Jak získat hru k testování... 70 Jak získat objekt třídy... 70 Jak získat instanci tovární třídy... 71 4.5 Testování korektnosti správce scénářů... 72 4.6 Testování korektnosti hry... 74 4.7 Definice interfejsu IScenarioManager... 75 4.8 Společný rodič správců třída AScenarioManager... 78 Vytvoření scénářů... 79 Návrhový vzor Stavitel (Builder)... 79 Předání podkladů pro vytvoření scénářů společnému rodiči... 80 4.9 Shrnutí požadavků... 81 4.10 Shrnutí co jsme se v kapitole dozvěděli a co jsme prozatím naprogramovali... 82 5. Návrh správce scénářů konkrétní hry... 84 5.1 Zadání, které budeme řešit... 84 5.2 Prázdný správce scénářů... 85 Import k odstranění... 86 Implementace interfejsu IAuthorPrototype... 86 Potomek třídy AScenarioManager... 86 Class-objekt sdružené tovární třídy... 86 Úprava sdružené tovární třídy... 86 5.3 Jednoduchý správce využívající literály... 87 Počáteční krok... 89 Strana 7 z 351
Podrobný obsah 8 Pokračovací kroky... 89 Přechod mezi scénáři Základní chybový scénář... 91 Umístění statických inicializačních bloků... 95 Konstruktor... 96 Hlavní metoda... 96 5.4 Trochu chytřejší správce... 99 5.5 Definice třídy Texts... 100 5.6 Definice správce scénářů využívajícího konstanty... 104 5.7 Prověrka ekvivalence obou správců... 105 5.8 Tovární třída v doprovodném projektu... 106 5.9 Úkol... 106 Dodatečný požadavek k usnadnění testů... 108 Náměty... 108 5.10 Shrnutí co jsme se v kapitole dozvěděli a co jsme prozatím naprogramovali... 109 6. Sjednocený správce scénářů... 111 6.1 Řešený problém... 111 Návrhový vzor Strategie (Strategy)... 112 6.2 Použití návrhového vzoru Dekorátor... 112 Vytvoření dekorující třídy... 113 Přizpůsobení základním požadavkům... 113 Probírka definovaných instančních metod... 115 Definice konstruktoru... 117 Definice metody main(string[])... 117 6.3 Použití dědění... 118 Vytvoření společné rodičovské třídy... 119 Úprava konstruktoru... 119 Definice nastavení požadovaného potomka... 120 Definice tovární metody... 120 Definice metody main(string[])... 121 6.4 Úprava tovární třídy... 121 6.5 Bez propagace do dalších kapitol... 126 6.6 Shrnutí co jsme se v kapitole dozvěděli a co jsme prozatím naprogramovali... 126 7. Návrh rámce pro hru... 128 7.1 Koncepce rámce hry... 128 7.2 Objekty vystupující ve hře... 129 Zadání... 129 Definice použitých interfejsů... 129 Hra IGame... 130 Svět IWorld... 130 Prostor IArea... 130 Příkaz Akce IAction... 130 Přechod... 131 H-objekt IItem... 131 Hráč... 131 Batoh IBag... 132 Úkol, cíl... 132 Množství, kapacita... 132 7.3 Upřesnění návrhu rámce... 132 IAction... 133 Název getname()... 133 Popis getdescription()... 133 Reakce na zadání příkazu execute(string[])... 134 Ukázka knihy z internetového knihkupectví www.kosmas.cz Strana 8 z 351
Podrobný obsah 9 IItem... 134 Název getname()... 134 Váha getweight()... 135 IBag... 135 Kapacita getcapacity()... 135 Obsah getitems()... 135 IArea... 136 Název getname()... 136 Sousedé prostoru getneighbors()... 136 H-objekty v prostoru getitems()... 136 IWorld... 136 Kolekce prostorů hry getallareas()... 137 Aktuální prostor getcurrentarea()... 137 IGame... 137 Identifikace autora getauthorname(), getauthorid()... 137 Tovární třída getfactoryclass()... 138 Název getname()... 138 Kolekce přípustných akcí getallactions()... 138 Získání světa hry getworld()... 138 Získání obsahu batohu getbag()... 139 Informace o živosti hry isalive()... 139 Povinné akce getbasicactions()... 139 Externí ukončení hry stop()... 140 Provedení příkazu executecommand(string)... 140 7.4 Doplnění společných rodičů... 140 Pojmenované objekty interfejs INamed... 140 Pomocné statické metody geto(string,?)... 141 Datový typ Optional<E>... 142 Kontejnery h-objektů interfejs IItemContainer... 142 7.5 Doplnění uživatelského rozhraní... 143 7.6 Diagram tříd balíčku game_txt... 143 7.7 Diagram tříd v balíčku empty_classes... 145 7.8 K čemu je dobrý rámec hry... 145 7.9 Shrnutí co jsme se v kapitole dozvěděli... 146 8. Začínáme tvořit vlastní hru... 147 8.1 Výběr metody návrhu... 147 8.2 Začínáme s třídou hry... 148 8.3 Předek ANamed... 149 8.4 Interfejs IAuthorPrototype... 150 8.5 Class-objekt tovární třídy... 150 8.6 Aktivace tovární metody... 150 8.7 Vyvíjíme podle TDD... 151 8.8 Kdo má mít na starosti zpracování příkazů... 154 Tři skupiny objektů... 154 Jak jsou na tom příkazy/akce?... 155 Dva druhy správců... 156 Správce jako instance samostatné třídy... 156 Správce jako objekt třídy... 156 8.9 Definice správce akcí třídy AAction... 157 Modifikátor přístupu... 157 Přístupová práva a jejich vlastnosti... 158 Konstruktor... 158 Neimplementovaná abstraktní metoda... 158 Příprava definice správce... 159 Strana 9 z 351
Podrobný obsah 10 Úprava definice konstruktoru akcí... 160 Konstruktor správce a vytvoření jednotlivých akcí... 161 Kde inicializovat... 162 Úprava metody execute(string) ve třídě hry... 163 8.10 Definice metody pro provádění příkazů... 163 Dva režimy zpracování příkazů... 164 Metoda isalive() ve třídě hry... 165 Metoda isalive() ve správci akcí AAction... 165 Definice metody executecommand(string)... 166 8.11 Metoda pro spuštění hry startgame(string)... 167 8.12 Metoda pro zpracování běžného příkazu executecommoncomand(string)... 168 Rozdělení příkazového řádku na slova... 168 Převedení počátečního slova na akci... 169 8.13 Prozatímní podoba definice třídy AAction... 169 8.14 Test... 173 8.15 Aktualizace informace o živosti hry... 174 8.16 Opakování testu... 174 8.17 Co jsme se v kapitole dozvěděli a co jsme prozatím naprogramovali... 175 9. Vytváříme svět hry... 177 9.1 Analýza chybového hlášení... 177 9.2 Svět hry jako správce prostor hry... 178 9.3 Vytvoření třídy světa hry (Apartment)... 178 Jedináček... 178 Přístupová práva... 179 Definice metody getallareas()... 179 9.4 Třída prostorů hry (Room)... 179 Začínáme s úpravami... 180 Konstruktor prostoru... 180 Metoda getneighbors()... 182 Změna typu návratové hodnoty... 183 Metoda getitems()... 184 Zabezpečení nezměnitelnosti kontejneru... 185 9.5 Třída h-objektů v prostorech (Item)... 186 Kdo si má co pamatovat... 187 Mají-li h-objekty několik různých vlastností ovlivňujících jejich chování... 187 Název a váha/přenositelnost jako parametry konstruktoru... 188 Alternativní možnosti předání údajů... 188 Proč kódovat dodatečné údaje do prefixu... 189 Zveřejnění prefixů... 190 Vlastní definice... 191 Předběžné vytvoření třídy batohu... 191 Dokončení konstruktoru... 192 Přístupové metody... 192 Zdrojový kód ukázkové hry v doprovodném projektu... 192 9.6 Dokončení definice třídy prostorů (Room)... 195 9.7 Dokončení definice třídy světa hry (Apartment)... 196 Metoda getallareas()... 197 Doplnění konstruktoru... 197 Metoda getcurrentarea()... 199 9.8 Úprava metody getworld() ve třídě hry... 199 9.9 Test... 200 9.10 Shrnutí co jsme se v kapitole dozvěděli a co jsme prozatím naprogramovali... 201 10. Dotahujeme svět hry... 204 Strana 10 z 351
Podrobný obsah 11 10.1 Úvahy o inicializaci... 204 10.2 Inicializace světa hry a správce prostorů... 206 Nastavení výchozího prostoru... 206 Vyvolání inicializace jednotlivých prostorů... 207 10.3 Inicializace jednotlivých prostorů... 207 Nastavení h-objektů uložených v místnosti na počátku hry... 208 Příprava na nastavení počátečních sousedů... 209 Nastavení počátečních sousedů... 210 10.4 Test... 210 10.5 Oprava definice metody getbag() ve třídě hry... 211 Test... 212 10.6 Dotažení definice třídy batohu... 212 Metoda getitems()... 212 Metoda initialize()... 213 Začlenění inicializace batohu mezi ostatní... 213 Metoda getcapacity()... 214 10.7 Test... 214 10.8 Co jsme se v kapitole dozvěděli a co jsme prozatím naprogramovali... 215 11. Vytvoření prvních definic povinných akcí... 217 11.1 Jak sjednotit postup pro většinu her... 217 11.2 Definice nového scénáře... 218 11.3 Úprava definice konstruktoru... 221 11.4 Úprava definice metody main(string[])... 222 11.5 Definice akce pro nápovědu... 222 Zkopírování kostry třídy... 223 Rodičovská třída... 223 Metoda execute(string...)... 224 Doplnění těla metody getallactions() ve třídě hry... 224 Doplnění těla metody getallactions() ve třídě správce akcí... 225 Dokončení definice metody execute(string...)... 226 Proč to nechodí... 227 Vytvoření objektu definované akce... 228 Test... 228 11.6 Definice akce pro přesun z aktuálního prostoru do zadaného sousedního prostoru... 229 Metoda execute(string...)... 230 Existence parametru... 230 Korektnost parametru... 231 Realizace přesunu do cílového prostoru... 231 Test... 233 11.7 Definice akce pro zvednutí h-objektu v aktuálním prostoru a jeho přemístění do batohu... 233 Metoda execute(string...)... 234 Existence parametru... 234 Název zvedaného h-objektu... 234 Korektnost parametru... 234 Přítomnost h-objektu v aktuálním prostoru... 235 Přenositelnost požadovaného h-objektu... 235 Změna obsahu kolekce h-objektů v prostoru... 236 Úpravy definice třídy batohu... 237 Dokončení definice metody execute(string...)... 238 Test... 239 11.8 Co jsme se v kapitole dozvěděli a co jsme prozatím naprogramovali... 240 12. Definice společného rodiče kontejnerů h-objektů... 242 Strana 11 z 351
Podrobný obsah 12 12.1 Definice akce pro položení h-objektu... 242 12.2 Úvahy o výhodnosti společného předka... 243 LSP (Liskov Substitution Principle) Substituční princip Liskové... 244 Více předků prostoru... 245 12.3 Definice společného předka AItemContainer... 246 Kontrolní test... 246 Vlastní definice předka... 247 První úprava jeho budoucích potomků: tříd prostorů a batohu... 248 12.4 Dotváříme společného předka... 248 Úpravy odvozené od třídy prostorů... 248 Vytknutí konstant týkajících se h-objektů... 249 Úprava konstruktoru... 249 Přidání parametru rodičovskému konstruktoru... 249 Metoda getitems()... 250 Doplnění implementace interfejsu IItemContainer... 250 Metoda removeitem(item)... 250 Metoda initializeitems()... 251 Úpravy odvozené od třídy batohu... 251 Atributy items a exporteditems... 251 Konstruktor... 252 Proměnný počet parametrů a jeho specifika... 253 Metoda getitems()... 253 Metoda initialize()... 253 Metoda tryadditem(item)... 254 Přidání dalších metod... 254 Shrnutí... 255 Kontrolní test... 262 12.5 Pokračujeme v definici akce pro pokládání h-objektů ActionPutDown... 263 Test... 264 12.6 Příkaz k předčasnému ukončení hry ActionExit... 264 Metoda execute(string...)... 265 Test... 265 Aktualizace informace o živosti hry... 265 Dokončení definice metody execute(string...)... 266 Test... 267 12.7 Prověření programu chybovým scénářem... 267 Doplnění reakce na prázdný příkaz... 268 Test... 269 12.8 Shrnutí co jsme se v kapitole dozvěděli a co jsme prozatím naprogramovali... 270 13. Definice nestandardních akcí... 272 13.1 Změna testu... 273 13.2 Definice akce pro otevření ledničky... 274 13.3 Definice třídy State... 275 13.4 Vytvoření třídy ActionOpen... 278 13.5 Definice metody execute(string...)... 279 Test existence parametru... 279 Test přítomnost otevíraného h-objektu... 279 Test otevíratelnosti zadaného h-objektu... 280 Dokončení definice... 280 Doplnění testu podloženost... 281 Test... 282 13.6 Oprava definice akce pro položení h-objektu... 283 Odhalování chyby krokováním programu... 283 Test... 286 Strana 12 z 351
Podrobný obsah 13 13.7 Definice akce pro přečtení papíru... 287 Test existence parametru... 287 Test přítomnosti daného h-objektu v batohu... 288 Test, zda je požadováno přečtení h-objektu, který lze opravdu přečíst... 288 Test nasazených brýlí... 288 Výsledná podoba metody... 289 Test... 290 13.8 Definice akce pro nasazení brýlí... 290 Test... 291 13.9 Definice akce pro podložení ledničky... 292 Test plnosti batohu... 292 Definice metody execute(string...)... 293 Test... 295 13.10 Co jsme prozatím přeskočili... 296 13.11 Shrnutí co jsme se v kapitole dozvěděli a co jsme prozatím naprogramovali... 296 14. Realizace rozhovoru... 298 14.1 Specifika rozhovoru... 298 14.2 Přepnutí do konverzačního režimu... 299 Zavedení příznaku prověřenosti... 299 Úprava metody execute(string...) ve třídě ActionPickUp... 299 14.3 Třída Conversation... 301 Metoda start(item)... 301 14.4 Úprava metody executecommand(string) ve třídě AAction... 302 14.5 Definice metody answer(string) ve třídě Conversation... 303 Stavy rozhovoru... 304 Reakce v závislosti na stavu... 305 Vlastní definice metody answer(string)... 306 Test... 306 14.6 Definice metody waitingfortheage(string)... 308 Test... 310 14.7 Definice metody waitingfortheyear(string)... 311 Test... 312 14.8 Příkaz pro zavření ledničky ActionCLose... 312 Test... 313 14.9 Shrnutí co jsme se v kapitole dozvěděli a co jsme prozatím naprogramovali... 314 15. Zprovoznění zbylých testů... 316 15.1 Metoda stop() ve třídě RUPApartmentGame... 316 Test... 317 15.2 Metoda getbasicactions() ve třídě RUPApartmentGame... 317 Test... 319 15.3 Shrnutí co jsme se v kapitole dozvěděli a co jsme prozatím naprogramovali... 319 16. Definice uživatelského rozhraní... 321 16.1 Co je třeba navrhnout... 321 16.2 Úprava rozdělení do balíčků... 322 16.3 Uživatelské rozhraní využívající služeb třídy javax.swing.joptionpane... 323 Definice metody startgame()... 323 Metody třídy JOptionPane... 324 Definice metody startgame(igame)... 325 Test... 326 Strana 13 z 351
Podrobný obsah 14 16.4 Uživatelské rozhraní komunikující prostřednictvím standardního vstupu a výstupu... 327 Nevýhody používání standardního vstupu a výstupu... 327 Třída java.util.scanner... 327 Vytvoření třídy pro konzolový vstup... 328 Test... 329 16.5 Zobecnění uvedených řešení... 329 Interfejs IGamePlayer... 329 Hlavní metoda umožňující volbu použitého rozhraní... 330 Výsledná definice třídy UIC_GamePlayer... 331 16.6 Další zobecnění uživatelského rozhraní... 335 16.7 Shrnutí co jsme se v kapitole dozvěděli a co jsme prozatím naprogramovali... 339 A Používané termíny... 341 Rozhraní (interface)... 341 Signatura (signature)... 341 Kontrakt (contract)... 341 Interfejs (interface type)... 341 Rodičovský podobjekt... 341 Metoda (method)... 341 Konstruktor třídy (class constructor)... 342 Konstruktor instancí (instance constructor)... 342 Instance typu Xxx (Xxx instance)... 342 Mateřská třída objektu (object s mother class)... 342 Přetížení metody (method overloading)... 342 Zakrytí metody (method hiding)... 343 Přebití metody (method overriding)... 343 Předefinování metody (method redefining)... 343 Přepsání metody (method rewriting)... 343 Instance versus objekt... 343 Class-objekt datového typu Xxx (class-object of the Xxx data type)... 343 Kontejner... 344 B Šablony zdrojových kódů... 345 Šablona interfejsu... 345 Šablona třídy... 346 Literatura... 348 Rejstřík... 349 Ukázka knihy z internetového knihkupectví www.kosmas.cz Strana 14 z 351
Seznam programů 15 Seznam programů Seznam programů Výpis 2.1: Definice interfejsu IAuthorPrototype, tentokrát i s deklarací balíčku a s importy (ty budou v příštích výpisech chybět)... 43 Výpis 2.2: Definice interfejsu IGSMFactory... 46 Výpis 3.1: Výčtový typ TypeOfStep... 56 Výpis 3.2: Výchozí podoba třídy ScenarioStep... 60 Výpis 3.3: Definice třídy TypeOfScenario... 62 Výpis 4.1: Definice metody getinstanceoffactory(class<t>) v interfejsu IGSMFactory... 72 Výpis 4.2: Definice interfejsu IScenarioManager... 75 Výpis 5.1: Výpis první části zdrojového kódu třídy RUPScenarioManagerLit až po definici prvních dvou kroků úspěšného (šťastného) scénáře... 87 Výpis 5.2: Výpis druhé části zdrojového kódu třídy RUPScenarioManagerLit od posledního kroku úspěšného (šťastného) scénáře až po definici prvních čtyř kroků chybového scénáře... 90 Výpis 5.3: Výpis třetí části zdrojového kódu třídy RUPScenarioManagerLit začínající za definicí kroků chybového scénáře (tj. definicí atributu s odkazem na jedináčka) a pokračující až do konce definice třídy... 92 Výpis 5.4: Výpis autotestu ukázkového správce scénářů z výpisů 5.1 až 5.3 se zakomentovanými kroky testujícími v chybovém scénáři reakci za zadání příkazů bez parametrů... 97 Výpis 5.5: Definice třídy Texts definující jednotlivé textové konstanty... 100 Výpis 5.6: Definice prvních tří kroků úspěšného scénáře ve třídě ManagerWithConstants... 104 Výpis 5.7: Definice metody getscenariomanager() ve třídě RUPGSMFactory... 106 Výpis 6.1: Definice statické nastavovací metody setdelegate(ascenariomanager) ve Výpis 6.2: třídě RUPScenarioManagerD... 114 Definice statické tovární metody getinstance() ve třídě RUPScenarioManagerD... 115 Výpis 6.3: Definice bezparametrického konstruktoru ve třídě RUPScenarioManagerD... 117 Výpis 6.4: Definice metody main(string[]) ve třídě RUPScenarioManagerD... 118 Výpis 6.5: Definice instančního konstruktoru ve třídě RUPScenarioManagerH... 119 Výpis 6.6: Výpis 6.7: Definice statické nastavovací metody setchild(rupscenariomanagerh) ve třídě RUPScenarioManagerH... 120 Definice statické tovární metody getinstance() ve třídě RUPScenarioManagerH... 120 Výpis 6.8: Definice statické tovární třídy RUPGSMFactory... 122 Výpis 7.1: Popis rozhraní konstruktoru instancí třídy BasicActions... 139 Výpis 8.1: Definice konstruktoru instancí třídy RUPApartmentGame... 149 Výpis 8.2: Definice metody getgame() ve třídě RUPGSMFactory... 151 Strana 15 z 351