Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen.

Ähnliche Präsentationen


Präsentation zum Thema: "Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen."—  Präsentation transkript:

1 Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen

2 Entwürfe Dr.Little schlecht,besser Unterschiede schlecht ->besser Erweiterung um hoch, runter Erweiterung Stories 1.0 Statische Sicht Dynamische Sicht Verteilungssicht Fachliche Sicht Erweiterung Stories 2.0 Unterschiede zu Stories 1.0

3 TODO Hier kommen die Klassendiagramme von Dr.Little schlecht und besser rein

4 Merkmale von Dr.Little-schlecht

5 Feste Eingänge -> Erweiterungen sind schwierig Öffentliche Attribute -> InformationHiding class Raum { public String beschreibung; public Raum nordausgang; public Raum suedausgang; public Raum ostausgang; public Raum westausgang class Raum { public String beschreibung; public Raum nordausgang; public Raum suedausgang; public Raum ostausgang; public Raum westausgang

6 Hohe Kopplung Nicht alle Parameter werden verwendet -> Interface zu breit Schlecht für Erweiterungen -> Parameterliste müsste erweitert Bei mehrmaligen Setzten eines Raumes, kann kein Null mehr für einen Raum gesetzt werden public void setzeAusgaenge(Raum norden, Raum osten, Raum sueden, Raum westen) { if(norden != null) nordausgang = norden;... public void setzeAusgaenge(Raum norden, Raum osten, Raum sueden, Raum westen) { if(norden != null) nordausgang = norden;...

7 Ausgang Norden und Osten bleiben beim zweiten Aufruf erhalten!!! // Aufruf 1: setzeAusgaenge(ausgangNorden,ausgangOsten, ausgangSueden, ausgangWesten) // Aufruf 2: setzeAusgaenge(null,null, ausgangSueden, ausgangWesten);... // Aufruf 1: setzeAusgaenge(ausgangNorden,ausgangOsten, ausgangSueden, ausgangWesten) // Aufruf 2: setzeAusgaenge(null,null, ausgangSueden, ausgangWesten);... Fehler beim wiederholten Aufrufen. Beispiel:

8 Direkter Zugriff auf Klassen-Attribute Man muss das innere von Raum kennen -> hohe Kopplung Es kann die Abfrage eines Attributs vergessen werden private void willkommenstextAusgeben(){... if (aktuellerRaum.nordausgang != null) System.out.print("north "); if (aktuellerRaum.ostausgang != null) System.out.print("east "); if (aktuellerRaum.suedausgang != null) System.out.print("south "); if (aktuellerRaum.westausgang != null) System.out.print("west "); private void willkommenstextAusgeben(){... if (aktuellerRaum.nordausgang != null) System.out.print("north "); if (aktuellerRaum.ostausgang != null) System.out.print("east "); if (aktuellerRaum.suedausgang != null) System.out.print("south "); if (aktuellerRaum.westausgang != null) System.out.print("west ");

9 Feste Befehlsliste -> Feste Bestandteile von Veränderlichen trennen Schlecht für Erweiterung Ausgabe auslagern -> trennen von Blogic (MVC) private void hilfstextAusgeben() { System.out.println("Sie haben sich verlaufen. Sie sind allein."); System.out.println("Sie irren auf dem Unigelände herum."); System.out.println(); System.out.println("Ihnen stehen folgende Befehle zur Verfügung:"); System.out.println(" go quit help"); } private void hilfstextAusgeben() { System.out.println("Sie haben sich verlaufen. Sie sind allein."); System.out.println("Sie irren auf dem Unigelände herum."); System.out.println(); System.out.println("Ihnen stehen folgende Befehle zur Verfügung:"); System.out.println(" go quit help"); }

10 Wird nur von verarbeiteBefehl() aufgerufen, daher sollte die Schnittstelle kleiner sein (nur den Raum übergeben) private void wechsleRaum(Befehl befehl) { Allgemein für die Klasse Spiel gilt: Klasse sollte sich nur um Spielelogik kümmern, nicht um das Parsen der Eingabe.

11 Look wird angenommen, obwohl es nicht spezifiziert ist. Dadurch dass look nicht erwartet wird, wird es nicht abgefangen Anweisung wie look ??? wird ausgeführt class Befehlswoerter { // ein konstantes Array mit den gültigen Befehlswörtern private static final String gueltigeBefehle[] = { "go", "quit", "help", "look" }; class Befehlswoerter { // ein konstantes Array mit den gültigen Befehlswörtern private static final String gueltigeBefehle[] = { "go", "quit", "help", "look" };

12 "Das Befehlswort sollte 'null' sein, wenn dieser Befehl als nicht vom Spiel erkannt gekennzeichnet werden soll. Schlecht: Datenparameter haben eine Doppelbedeutung public Befehl(String erstesWort, String zweitesWort) { befehlswort = erstesWort; this.zweitesWort = zweitesWort;}.... public boolean istUnbekannt() { return (befehlswort == null); } public Befehl(String erstesWort, String zweitesWort) { befehlswort = erstesWort; this.zweitesWort = zweitesWort;}.... public boolean istUnbekannt() { return (befehlswort == null); }

13 Liefert das Befehlswort (das erste Wort) dieses Befehls. Wenn der Befehl nicht verstanden wurde, ist das Ergebnis 'null'. Schlecht: Datenparameter haben eine Doppelbedeutung Verbesserung: Exceptions im Fehlerfall public String gibBefehlswort() { return befehlswort; } public String gibBefehlswort() { return befehlswort; }

14 Ausgaben (hier via println) sowie das einlesen via Buffered Reader sollten von dem eigentlichen Parsen entkoppelt werden. public Befehl liefereBefehl() {... System.out.print("> "); // Eingabeaufforderung..... BufferedReader eingabe = new BufferedReader(new InputStreamReader(System.in));..... eingabezeile = eingabe.readLine();... public Befehl liefereBefehl() {... System.out.print("> "); // Eingabeaufforderung..... BufferedReader eingabe = new BufferedReader(new InputStreamReader(System.in));..... eingabezeile = eingabe.readLine();...

15 Merkmale von Dr.Little-besser

16 Private wird verwendet -> Attribute versteckt Attribute nur über Getter und Setter zu erreichen gibKurzbeschreibung() gibLangeBeschreibung() setzeAusgang() class Raum { private String beschreibung; private HashMap ausgaenge; // die Ausgänge dieses Raums class Raum { private String beschreibung; private HashMap ausgaenge; // die Ausgänge dieses Raums

17 Private wird verwendet -> Attribute versteckt Attribute nur über Getter und Setter zu erreichen gibKurzbeschreibung() gibLangeBeschreibung() setzeAusgang() Beliebige Richtung können eingegeben werden (-) Keine Absicherung der Richtung(Dubbleten) public void setzeAusgang(String richtung, Raum nachbar) { ausgaenge.put(richtung, nachbar); } public void setzeAusgang(String richtung, Raum nachbar) { ausgaenge.put(richtung, nachbar); }

18 Ausgänge werden als HashMap implementiert -> mehrere Ausgänge möglich Nachteile: (-) richtung als String ->Eingabe falscher Ausgänge Abgeschwächt bei Verwendung von StringKonstanten private HashMap ausgaenge; // die Ausgänge dieses Raums.... ausgaenge.put(richtung, nachbar);... private HashMap ausgaenge; // die Ausgänge dieses Raums.... ausgaenge.put(richtung, nachbar);... draussen.setzeAusgang("east", hoersaal); draussen.setzeAusgang(East", labor); Besser: draussen.setzeAusgang(EAST, labor); draussen.setzeAusgang("east", hoersaal); draussen.setzeAusgang(East", labor); Besser: draussen.setzeAusgang(EAST, labor);

19 Ausgänge werden als HashMap implementiert -> mehrere Ausgänge möglich Nachteile: (-) richtung als String ->Eingabe falscher Ausgänge Abgeschwächt bei Verwendung von StringKonstanten private HashMap ausgaenge; // die Ausgänge dieses Raums.... ausgaenge.put(richtung, nachbar);... private HashMap ausgaenge; // die Ausgänge dieses Raums.... ausgaenge.put(richtung, nachbar);...

20 TODO Hier kommen die CODE-Stellen der Änderung für hoch + runter In Dr.Little besser rein

21 Erweiterung von Dr. Little-besser um Stories 1.0

22 TODO Aufgabe 2

23 Erweiterung von Dr. Little-besser um Stories 2.0

24 TODO AUFGABE3


Herunterladen ppt "Ein Textadventure AIP Aufgabe 2 14.05.2009 Fabian Bergfeld Patrick Boeckhoven Christian Haberland Benjamin Jochheim Liem Nguyen."

Ähnliche Präsentationen


Google-Anzeigen