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 oben,unten Erweiterung Stories 1.0 Statische Sicht Dynamische Sicht Verteilungssicht Fachliche Sicht Erweiterung Stories 2.0 Unterschiede zu Stories 1.0

3

4

5

6 Feste Eingänge -> Erweiterungen sind schwierig Verwendung öffentlicher Attribute class Raum { public String beschreibung; public Raum nordausgang; public Raum suedausgang; public Raum ostausgang; public Raum westausgang Verletzung -> InformationHiding

7 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

8 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;... -> InformationHiding -> hohe Kopplung

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

10 alle Parameter werden verwendet Ausgaenge nur durch Setter zu setzen Beliebige Richtung können eingegeben werden (-) Keine Absicherung der Richtung (Dubbleten) ‏ public void setzeAusgang(String richtung, Raum nachbar) { ausgaenge.put(richtung, nachbar); }

11 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);... draussen.setzeAusgang("east", hoersaal); draussen.setzeAusgang(“East", labor); Besser: draussen.setzeAusgang(EAST, labor);

12 Direkter Zugriff auf Klassen-Attribute Man muss das innere von Raum kennen 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 "); -> Information Hiding -> hohe Kopplung

13 Redundanter Code Genauso wie in willkommenstextAusgeben() ‏ Gefahr bei Änderungen private void wechsleRaum(Befehl befehl) {... System.out.println("Sie sind " + aktuellerRaum.gibBeschreibung()); System.out.print("Ausgänge: "); 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 ");

14 Spiel greift über gibLangeBeschreibung() auf Raum, um Ausgänge auszugeben Spiel braucht keine Interna von Raum wissen public String gibLangeBeschreibung() ‏ { return "Sie sind " + beschreibung + ".\n" + gibAusgaengeAlsString(); } private String gibAusgaengeAlsString() ‏ { String ergebnis = "Ausgänge:"; Set keys = ausgaenge.keySet(); for(Iterator iter = keys.iterator(); iter.hasNext(); ) ‏ ergebnis += " " + iter.next(); return ergebnis; }

15 Greift direkt auf interne Attribute Codeänderung bei Erweiterung von Richtung private void wechsleRaum(Befehl befehl) ‏ {..... Raum naechsterRaum = null; if (richtung.equals("north")) naechsterRaum = aktuellerRaum.nordausgang; if (richtung.equals("east")) naechsterRaum = aktuellerRaum.ostausgang; if (richtung.equals("south")) naechsterRaum = aktuellerRaum.suedausgang; if (richtung.equals("west")) naechsterRaum = aktuellerRaum.westausgang;..... Information Hiding

16 Ermittlung des nächsten Raumes liegt jetzt in Raum Spiel braucht keine Interna von Raum wissen Spiel greift über aktuellerRaum.gibAusgang(richtung) auf nächsten Raum zu class Raum {.... private HashMap ausgaenge; // die Ausgänge dieses Raums... public Raum gibAusgang(String richtung){ return (Raum)ausgaenge.get(richtung); }

17 Feste Befehlsliste -> Feste Bestandteile von Veränderlichen trennen Schlecht für Erweiterung Ausgabe auslagern -> trennen von Logic 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"); } (Open Closed Principle) ‏

18 Ausgabe aller gültigen Befehle wurde an Parser übergeben Parser besitzt alle Befehlswoerter Gültige Befehle werden einer Stelle definiert (in Befehlswoerter) ‏ private void hilfstextAusgeben() {.... System.out.println("Ihnen stehen folgende Befehle zur Verfügung:"); parser.zeigeBefehle(); } class Parser { public void zeigeBefehle() ‏ { befehle.alleAusgeben(); }

19 Wird nur von verarbeiteBefehl() aufgerufen, daher sollte die Schnittstelle kleiner sein (nur den Raum übergeben) ‏ private void wechsleRaum(Befehl befehl) {

20 „Look“ wird angenommen, obwohl es nicht spezifiziert ist. Dadurch dass „look“ nicht erwartet wird, wird es nicht abgefangen Unerwartete Funktionalität class Befehlswoerter { // ein konstantes Array mit den gültigen Befehlswörtern private static final String gueltigeBefehle[] = { "go", "quit", "help", "look" };

21 "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); } Single Responsibility Principle

22 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; }

23 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();... Single Responsibility Principle Trennung von Funktion und Interaktion

24 Dr.Little schlecht und besser werden um oben+unten erweitert

25 class Raum {... public Raum oberausgang; public Raum unterausgang;.... public void setzeAusgaenge(Raum norden, Raum osten,, Raum oben, Raum unten Raum sueden, Raum westen, Raum oben, Raum unten) { if(oben != null) ‏ oberausgang = oben; if(unten != null) ‏ unterausgang = unten;... public void setzeAusgaenge(Raum norden, Raum osten, Raum sueden, Raum westen) {, null, null this.setzeAusgaenge(norden, osten, sueden, westen, null, null); }

26 Class Spiel {... private void raeumeAnlegen(){ Raum aussichtsturm, keller; //Erweiterung oben+unten.... aussichtsturm = new Raum("im Aussichsturm der Uni"); keller = new Raum("im Keller der Uni");.... draussen.setzeAusgaenge(null, hoersaal, labor, cafeteria); hoersaal.setzeAusgaenge(null, null, null, draussen); cafeteria.setzeAusgaenge(null, draussen, null, null); labor.setzeAusgaenge(draussen, buero, null, null, null, keller); buero.setzeAusgaenge(null, null, null, labor, aussichtsturm, null); keller.setzeAusgaenge(null, null, null, null, labor, null); aussichtsturm.setzeAusgaenge(null, null, null, null, null, buero);

27 Class Spiel {... private void willkommenstextAusgeben() {... if (aktuellerRaum.oberausgang != null) System.out.print("upstairs "); if (aktuellerRaum.unterausgang != null) System.out.print("downstairs ");.... private void wechsleRaum(Befehl befehl) { if (richtung.equals("upstairs")) naechsterRaum = aktuellerRaum.oberausgang; if (richtung.equals("downstairs")) naechsterRaum = aktuellerRaum.unterausgang;... if (aktuellerRaum.oberausgang != null) System.out.print("upstairs "); if (aktuellerRaum.unterausgang != null) System.out.print("downstairs ");

28 Class Spiel {... private void raeumeAnlegen(){... aussichtsturm = new Raum("im Aussichsturm der Uni"); keller = new Raum("im Keller der Uni");.... labor.setzeAusgang("north", draussen); labor.setzeAusgang("east", buero); labor.setzeAusgang("downstairs", keller); //Erweiterung; oben+unten buero.setzeAusgang("west", labor); buero.setzeAusgang("upstairs", aussichtsturm); //Erweiterung; oben+unten //Erweiterung; oben+unten keller.setzeAusgang("upstairs", labor); aussichtsturm.setzeAusgang("downstairs", buero);

29 Erweiterung von Dr. Little-besser um Stories 1.0

30 Demonstration

31

32 Erweiterung von Dr. Little-besser um Stories 2.0

33 Demonstration

34 Stories 2.0: GUI

35 Vielen Dank!


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