03. Analízis modell kidolgozása 1. - AdjustmentBeaver/szoftlab GitHub Wiki

Analízis modell kidolgozása 1.

Objektum katalógus

CollisionCheck

Ennek az osztálynak a segítségével vizsgáljuk meg két vonat között, hogy történt-e ütközés. Azt vizsgálja, hogy két vonat különböző vonatelemei ütköznek-e. Ilyen eset lehet például a ráfutásos ütközés, váltónál való ütközés.

Command

A parancsok végrehajtásáért felelős, legyen akár felhasználót vagy rendszerparancs.

Game

Létrehozza a játék futásához szükséges objektumokat.

Map

A pálya létrehozásakor keletkező Map objektum tartalmazza a vonatokat és a különböző pályaelemeket (Node-okat). A pályához tartozik egy pályaállapot, amiben az aktuális állás található.

MapBuilder

Az a feladata, hogy a már létező pályákat betöltése fájlokból.

MapManager

A pályák megfelelő kezeléséért felelős. Egy korábbi mentés/pálya pálya betöltésében és a játékállás mentésében vesz részt.

Node

A Node objektumok írják le a pálya elemeit. Ezek határozzák meg a vonatok irányát. Ismerik a szomszédos Node-okat. Akkor szomszédos két Node, ha sínpálya köti őket össze. Ha a vonatelemnek szüksége van a következő Node-ra, akkor a vonatelem haladási irányának megfelelő szomszédját adja vissza. Ha egy vonatelem olyan Node-ra ér, amely nem ad számára meg következő szomszédot, akkor felrobbantja az egész vonatot.

SimulationTimer

A szimuláció időzítéséért (vonatok elindítása, mozgatása, ütközésdetektálás) felelős. A megadott időközönként ütemezi a szimulációt.

SpecialPlace

Ezek megkülönböztetett helyek a pályán. Egyik irányból csak másik SpecialPlace-hez lehet hozzácsatlakoztatni. Az alagutak bejáratául szolgál. Építhető vagy lerombolható rajta alagút. Építeni akkor lehet, ha hozzákötjük egy másik ilyen helyhez, lerombolni pedig, ha nem tartózkodik vonat az alagútban. Egyszerre csak egy alagút lehet felépítve.

Station

A játékban vannak vonatállomások. Rendelkeznek azonosító színnel. Ha egy vonat beérkezik az állomásra, akkor a legelső utasokat szállító kocsi utasai leszállhatnak ott - feltéve ha az állomás és a kocsi színe megegyezik.

Statistics

Feladata a játékmenet kezelése. Observer design pattern szerint működik. Kezeli a szimulációs eseményeket (vonat felrobbanás, pálya megnyerése). Statisztikát vezet a játékról (pl.: kiürült kocsik száma), ez alapján utasításokat hajt végre.

Switch

Speciális pályaelem, amely három irányból is megközelíthető. Ha a megfelelő irányból közelítjük meg, akkor a beállítástól függően változik, hogy melyik csomópont a következő. Egyéb esetben csak egy irányba haladhatunk tovább, ez megegyezik azzal, amelyikből érkezve több opciónk is van. Ha egy vonat rajta tartózkodik nem állítható, melyik a következő csomópont.

Train

A Train osztály példányai jelképezik a pályán futó vonatokat. TrainPart-okat (vonatelemeket) tartalmaz. A vonat felrobbantásáért felelős. Ismeri az utolsó vonatelemét, van sebessége, illetve ismeri az objektum az utolsó nem üres vonatelemének a színét.

TrainCar

A játékban a kocsik utasokat szállítanak és rendelkeznek szín azonosítóval. A színazonosító adja meg, hogy a rajta utazó emberek hol kívánnak leszállni.

TrainEngine

Ez a mozdony vonatelem, amely a vonat elején áll. Ez határozza meg a vonat sebességét.

TrainPart

A vonatelemeket reprezentáló osztály. Figyeli, hogy elért-e egy Node-ot, és mindig a következő szomszédos elem felé mozog. Ismeri, hogy melyik vonathoz tartozik.

TrainScheduler

A vonatok bizonyos időközönkénti indításáért felelős.

Statikus struktúra diagramok

Fő osztálydiagram

Parancsok osztálydiagramja

Parancs osztályok depedenciái

Osztályok leírása

CollisionCheck

  • Felelősség
    A vonatok közötti ütközéseket vizsgálja.

  • Interfészek
    Notifiable

  • Metódusok

    • CollisionCheck(Map<String,Train> list): A konstruktorában megkapja a vonatok listáját, amiket vizsgálni fog.

    • void update(): A vonatok összeütközésének vizsgálatát végző metódus.

Color

  • Felelősség
    A vonatelemek és az állomások rendelkeznek színnel. Ezt reprezentálja ez az osztály.

Command

  • Felelősség
    Interfész. Felületet biztosít a játékban előforduló parancsok számára. A Command tervezési minta szerint működik.

  • Metódusok

    • void execute(): Az adott parancs végrehajtása. Az egyes osztályok amik megvalósítják az interfészt, ebben a metódusban hajtják végre a parancsot, amire hivatottak.

Coordinate

  • Felelősség
    A pályán elhelyezett elemek helyzetét leíró osztály. Ennek segítségével állapítható meg, hogy a vonatok ütköztek vagy valamilyen csomóponthoz értek.

ExitGameCommand

  • Felelősség
    A parancs hatására a játék befejeződik.

  • Interfészek

    • Command
  • Attribútumok

    • Game game: Ő fogja elvégezni a játékból való kilépést.
  • Metódusok

    • ExitGameCommand(Game g):Konstruktor. Beállítja a Game attribútumot.

    • void execute(): Megvalósítja a kilépéshez szükséges logikát.

Game

  • Felelősség
    Inicializálja a játékhoz szükséges objektumokat. Létrehozza a SimulationTimer és a MapManager objektumokat. Rajra keresztül állítható a játék állapota.

  • Metódusok

    • Main(args: string[]): Létrehozza a SimulationTimer és a MapManager objektumokat.

    • void startGame(): Elindítja a szimulációt. A SimulationTimernek start üzenetet küld, aminek hatására elindul az időzítés.

    • void stopGame(): Megállítja a szimulációt. A SimulationTimernek stop üzenetet küld, aminek a hatására az időzítés megáll.

    • void resumeGame(): A játék előző állapota alapján dönt. Ha futott a játék akkor újra elindítja azt.

    • void parseCommand(String cmd): Értelmezi a kapott parancsot

LoadGameCommand

  • Felelősség
    A pálya betöltéséért felelős parancs. A MapManagernek üzenetet küld a betölteni kívánt pálya útvonalával, aminek hatására A MapManager létrehozza a pályát utána pedig a subscription szekvencia fut, amiben megtörténik az időzítőre való feliratkozás az elemek számára.

  • Interfészek

    • Command
  • Attribútumok

    • String mapName: A betöltendő pálya neve.

    • MapManager m: Neki kell betölteni a pályát

  • Metódusok

    • NewGameCommand(m: MapManager, mapName: String): Konstruktor, beállítja az attribútumokat.

    • void execute(): Szól a MapManagernek, hogy kezdje ez a pálya betöltését.

Map

  • Felelősség
    A pálya tartalmazza a mindenkori játékállást. A pályán találhatóak meg a vonatok és a csomópontok, illetve a pálya adminisztrációjához szükséges objektumok (Statistics, TrainScheduler).

  • Attribútumok

    • Statistics stat: A játék közbeni statisztika. pl.: mennyi kocsi üres.

    • Map<String,Train> trainMap: A játékban résztvevő vonatok.

    • Map<String,Node> nodeMap: Adminisztrációs lista.

    • List<Notifiable> notifiableList: Azok az objektumok találhatóak ebben a listában akik feliratkoztak az időzítőre (TrainScheduler, CollisisonCheck).

    • TrainScheduler trainScheduler: A vonatok elindításáért felelős.

    • CollisionCheck collisionCheck: A vonatok ütközésének vizsgálatát végzi.

  • Metódusok

    • Map():Konstruktor

    • void subscribe(SimulationTimer timer): A maphoz tartozó vonatok, TrainScheduler és CollisionCheck feliratkoztatása az időzítőre.

    • void addNode(Node n): Csomópont hozzáadása a nodeListhez.

    • void addTrain(Train t): Vonat hozzáadása a trainListhez.

    • void addStatistics(Statisctics s): Statisztika hozzáadása a pályához.

    • void addNotifiable(Notifiable n): Hozzáad egy értesítendő objektumot a pályához.

    • Map<String,Node> getNodeList(): Visszaadja a csomópontokat

    • Map<String,Train> getTrainList() :Visszaadja a vonatokat

MapBuilder

  • Felelősség
    Ő végzi az IO műveleteket. Létrehozza magát a pályát és feltölti a rajta lévő és a hozzá kapcsolódó elemekkel.

  • Metódusok

    • void MapBuilder(String mapName): Konstruktor. Beállítja a felépíteni kívánt pálya nevét.

    • Map buildMap(MapManager mm): Létrehozza a pálya működéséhez szükséges összetevőket és elvégzi a file olvasás műveletet az adatok feldolgozásával.

MapManager

  • Felelősség
    A pályák kezeléséért felelős. Képes menteni egy játékállást, betölteni egy korábban lementettet, vagy újat, és kezeli az ezzel járó feliratkoztatásokat (ld. subscription szekvencia). Tárolja a jelenlegi Map-ot.

  • Attribútumok

    • SimualtionTimer timer: A MapManager ezen az attribútumon keresztül éri el az időzítőt.

    • Map map: A létrehozott pálya.

  • Metódusok

    • MapManager(SimualtionTimer timer): Konstruktor, amiben beállításra kerül az időzítő.

    • void newMap(String mapName): Betölti a paraméterül kapott nevű pályát egy MapBuilder segítségével.

    • void saveMap(String mapName): Lementi az aktuális játékállást a paraméterben kapott néven.

    • void loadMap(String mapName): Betölt egy korábban lementett játékállást.

    • void subscribe(): Feliratkoztatja az időzítőre a vonatokat a CollisionCheckert és a TrainSchedulert.

NewGameCommand

  • Felelősség
    Új játék indításáért felelős parancs. Szól a MapManagernek, hogy hozzon létre egy új pályát, majd egy StartGameCommand parancs segítségével elindítja a játékot.

  • Interfészek

    • Command
  • Attribútumok

    • String mapName: A betöltendő pálya neve.

    • MapManager m: Neki kell betölteni a pályát

  • Metódusok

    • NewGameCommand(MapManager m, String mapName):Konstruktor, beállítja az attribútumokat.

    • void execute(): Végrehajtja az új játék létrehozásához szükséges logikát.

Node

  • Felelősség
    A TrainPartok következő útirányát határozza meg. A csomópontok gráfot alkotnak.

  • Attribútumok

    • List<Node> neighborNodeList : A szomszédos csomópontokat tárolja.

    • Train currentTrain: A csomóponton lévő vonat.

    • Coordinate nextNode: A következő csomópontot meghatározó hely.

    • Coordinate pos: A Node helyzetét adja meg.

  • Metódusok

    • Node():Konstruktor

    • void getTrain(): Visszaadja a Vonatot aminek a TrainPart a része.

    • void accept(TrainEngine te) : A csomópont irányítja a TrainEnginet a következő állomás felé, ha az létezik.

    • void accept(TrainCart tc) : A csomópont irányítja a TrainCartot a következő állomás felé, ha az létezik.

Notifiable

  • Felelősség
    Interfész. Felületet nyújt az időzítőre feliratkozni kívánó osztályok számára.

  • Metódusok

    • void update(): Az időzítéskor meghívott metódus. A SimualtionTimer hívja meg a Notifablet megvalósító osztályoknak.

ResumeGameCommand

  • Felelősség
    Parancs a játék folytatásához. Kimenetele a játék előző állapotától függ. A játék mentésénél van jelentősége, ami történhet megállított és éppen zajló játék mellett is.

  • Interfészek

    • Command
  • Attribútumok

    • Game game: Ezt kell elindítani
  • Metódusok

    • ResumeGameCommand(Game g): Konstruktor, beállítja az attribútumot.

    • execute(): Ha a játék előző állapotában futott, akkor újra elindítja, különben marad megállított állapotban.

SaveGameCommand

  • Felelősség
    Parancs a játékállapot mentéséhez.

  • Interfészek

    • Command
  • Attribútumok

    • String mapName: A pálya neve.

    • MapManager m: Neki kell lementenie a pályát

  • Metódusok

    • SaveGameCommand(MapManager m ,String mapName): Konstruktor. Beállítja a MapManagert.

    • void execute(): Megállítja a játékot, majd a MapManager segítségével lementi azt, végül ResumeGameCommand parancsot ad ki.

SimulationTimer

  • Felelősség A szimuláció időzítéséért felelős. Meghatározott időközönként értesíti a szimulációban részt vevő objektumokat.

  • Metódusok

    • SimualtionTimer(): Inicializálja az időzítőt.

    • void start(): Elindítja az időzítőt.

    • void stop(): Megállítja az időzítőt.

    • void addSubscriber( sub:Notifable): Az ütemezni kívánt objektumokhoz adja a paraméterül kapott Notifable interfészt megvalósító interfészt.

    • deleteSubscription(): Törli a feliratkozásokat.

SpecialPlace

  • Felelősség Ezeken a speciális csomópontokon tud a felhasználó alagútszájakat építeni. A pályán maximum 2 alagútszáj lehet aktív, amiket alagút köt össze. Megépített alagútszájat le is lehet rombolni.

  • Ősosztályok

    • Node
  • Interfészek

    • Toggleable
  • Metódusok

    • void toggle(): Elvégzi az alagútszáj építéséhez köthető logikát, ha az lehetséges.

Speed

  • Felelősség A vonat sebességét leíró osztály.

Station

  • Felelősség Ezeken a helyeken tudnak leszállni az emberek a kocsiból, de csak akkor, ha az állomás színével megegyező az adott kocsi, és nincs előtte nem üres. Ha adott színű kocsiból több van egymás után, az összes kiürül.

  • Ősosztályok

    • Node
  • Attribútumok

    • Color: az állomás színe
  • Metódusok

    • Color getColor() -visszaadja az állomás színét

StartGameCommand

  • Felelősség
    Játék elindításáért felelős parancs.

  • Interfészek

    • Command
  • Attribútumok

    • Game g: Ő fogja elvégezni a játék indítását.
  • Metódusok

    • StartGameCommand(Game g): Konstruktor. Beállítja a Game attribútumot.

    • void execute(): A Game objektumon meghívja a startGame metódust. A játék elindul.

Statistics

  • Felelősség
    A játékról vezet statisztikát. A TrainPartok őt értesítik, ha felrobbantak vagy kiürültek.

  • Attribútumok

    • Integer numberOfCarts: Az összes kocsi száma a pályán.

    • Integer emptyCarts: Üres kocsik száma.

    • List<String> mapList: Pályák hogyan következnek egymás után.

    • String currentLevel: Az aktuális szint.

  • Metódusok

    • Statistics(MapManager mm): Konstruktor. Beállítja a MapManagert a későbbi parancsok futtatása miatt.

    • void trainExplode(): Train hívja amikor felrobban. Kiadja a pálya újraindítása parancsot.

    • void cartUnloaded(): Egy TrainPart hívja, amikor kiürült. Vizsgálja, hogy sikerült-e teljesíteni a pályát.

StopGameCommand

  • Felelősség
    A játék megállításáért felelős parancs

  • Interfészek

    • Command
  • Attribútumok

    • Game g: A megállítandó játék
  • Metódusok

    • StopGameCommand(Game g ): Konstruktor. Beállítja a Game attribútumot.

    • void execute(): A Game objektumon meghívja a stopGame metódust. A játék megáll.

Switch

  • Felelősség
    Egy kereszteződésben ezek segítségével állítható, merre szeretnénk, hogy a vonat továbbhaladjon. Ha a két irány, amelyek irányába állítható a váltó, egyikéből jön a vonat, mindig a harmadik irányba halad tovább. A váltó nem állítható, ha vonat tartózkodik rajta.

  • Ősosztályok

    • Node
  • Interfészek

    • Toggleable
  • Attribútumok

    • Node rootNode: A váltó gyökércsomópontja, ahonnan az elágazás indul.

    • Node activeNode: A váltó aktív kimenete.

  • Metódusok

    • void toggle(): Elvégzi a váltó állításhoz szükséges logikát, ha az lehetséges.

ToggleCommand

  • Felelősség
    A toggle metódus elvégzéséért felelős, egy Toggleable interfészt megvalósító osztályon.

  • Interfészek

    • Command
  • Attribútumok

    • String id: Toggleable interfészt megvalósító csomópont azonosítója.

    • Map m: A pálya amin id alapján megkeressük az adott interfészt.

  • Metódusok

    • ToggleCommand(Map m, String id): Konstruktor, beállítja a map és az id attribútumokat.

    • void execute(): A mapon megkeresi az id azonosítójú Nodeot és elvégzi rajta a toggle metódust.

Train

  • Felelősség
    A vonat felrobbantásáért felelős, ekkor triggereli Statistics osztály figyelő függvényét. Tárolja a kocsikat, mozdonyt. Mozgatja saját magát.

  • Interfészek

    • Notifiable
  • Attribútumok

    • List<TrainPart> trainPartList: Tartalmazza, hogy milyen egységekből áll a vonat.

    • Color colorToUnload: A következő színű kocsi, amit ki lehet üríteni.

    • Boolean running: A vonat a pályán van-e.

  • Metódusok

    • void explode() : Felrobbantja a vonatot. Megsemmisíti a vonatelemeket. triggereli Statistics-ot.

    • void move() : Mozgatja a vonatelemeket.

    • Color getColor() : Visszaadja az utolsó nem üres vonatelem színét.

    • void addPart(TrainPart p) : Hozzáad egy kocsit a vonathoz.

    • boolean isRunning(): Visszaadja, hogy a vonat a pályán van-e már.

    • void StartTrain(): Elindítja a vonatot.

TrainCart

  • Felelősség
    A vonat része a kocsi, utasokat szállít, meghatározott színe van.

  • Ősosztályok

    • TrainPart
  • Attribútumok

    • Color color: A kocsi színe.
  • Metódusok

    • TrainCart(Train t, Statistics st, Color c): Konstruktor, a Statistics osztályt ismeri, itt kapja meg. Beállításra kerül még, hogy melyik vonathoz tartozik.

    • Color getColor(): Visszaadja a kocsi színét.

    • void unload(): Kiüríti a kocsit. Ha szükséges beállítja semleges színűre és triggereli a Statistics osztály ürítéseket számláló függvényét.

TrainEngine

  • Felelősség
    A vonat része a mozdony, meghatározza a vonat sebességét. Ha több mozdony lenne, tetszőleges logika szerint lehetne vonat eredő sebességét számolni.

  • Ősosztályok

    • TrainPart
  • Attribútumok

    • Speed speed: A mozdony sebességét adja meg.
  • Metódusok

    • TrainEngine(Train t, Speed s): Beállítja a sebességet és, hogy melyik vonathoz kapcsolódik

    • Speed getSpeed(): Visszaadja a mozdony sebességét.

TrainPart

  • Felelősség
    Absztrakt bázisosztály vonatelemekhez. A vonatok TrainPartokból állnak, a vonatok mozgatása a TrainPartok mozgatására vezethetö vissza, ezért minden TrainPart mozgatja saját magát. Mozgatáskor érheti el a célpontjául szolgáló adott állomást, és visitor minta szerint meglátogatja, azaz triggereli a node-okat ha elért hozzájuk.

  • Attribútumok

    • Node nextNode: Következő cél Node-ja, ahová tart.

    • Coordinate pos: A TrainPart helyzetét határozza meg.

  • Metódusok

    • void move(): Mozgatja a TrainPartot. Absztrakt, a leszármazottak valósítják meg.

    • setNextNode(Node n): Beállítja a kapott Node-ot az adott kocsi következő céljának.

TrainScheduler

  • Felelősség
    Vonatok indításának ütemezéséért felelős osztály. A SimulationTimer triggereli, ekkor ha szükséges indítja a következő vonatot.

  • Interfészek

    • Notifiable
  • Metódusok

    • TrainScheduler(Map<String,Train> list): Konstruktor, itt kapja meg a vonatok listáját, innen keres vonatot, amit tud indítani.

    • update(): Notifiable interfész megvalósítása, itt történik a vonatindítási logika.

Szekvencia diagramok

Init

New Game

Map Building

Load Game

Save Game

Start Game

Stop Game

Resume Game

Command Loop

Toggle Command

Train Explode

Train Moving

Unloading

Subscription

Notifying

State-chartok

Game

Special Places

Switch

Train Cart

Train

Napló

Kezdet Időtartam Résztvevők Leírás
február 22. 13:00 3 óra Dobai, Dömötör, Földvári, Kövér, Telek Megbeszélés: Sablon áttekintése, fő objektumok felelősségének meghatározása.
február 23. 13:00 7 óra Dobai, Dömötör, Földvári, Kövér, Telek Megbeszélés: Felelősségek tisztázása, osztálydiagram elkezdése
február 24. 16:00 5.5 óra Dobai, Dömötör, Földvári, Kövér, Telek Megbeszélés: Felelősségek újragondolása, állapotdiagramok létrehozása, tervezési minták átnézése, alkalmazása.
február 25. 16:00 6.5 óra Dömötör Szekvencia diagramok nagy része, egyéb tervezés
február 25. 15:00 6 óra Telek Osztálydiagramok, osztályleírások
február 25. 16:00 1.5 óra Dobai, Földvári, Kövér Objektum katalógus szerkesztése
február 26. 11:00 1.5 óra Földvári Osztályok leírása
február 26. 14:30 4.5 óra Dömötör Szekvencia diagramok maradék része, state-chart diagramok véglegesítése, kis leírás osztályokhoz
február 26. 15:00 4 óra Dömötör, Földvári, Kövér Osztályok leírása
február 26. 15:00 4 óra Telek Osztálydiagramok, szekvencia diagramok kiegészítése
február 26. 18:00 1 óra Kövér Konzisztencia ellenőrzés
február 26. 19:00 3 óra Dobai, Dömötör, Földvári, Kövér, Telek Konzisztencia ellenőrzés
február 26. 21:00 2 óra Telek Szekvencia diagramok ellenőrzése, képek beillesztése a dokumentációba