2 Stimmen

Welche OO-Struktur sollte ich verwenden, um die Verhaltensweisen von Tieren zu beschreiben?

Ich habe eine Java-Aufgabe, bei der mein Professor von mir verlangt, dass ich einen LeJOS NXT benutze, um einen Roboter zu bauen, der das Verhalten eines bestimmten Tieres simuliert. Ich habe mich für entwickeln. ein Drache. Alle möglichen Verhaltensweisen, die mir bis jetzt eingefallen sind, sind:

  • Wenden, wenn es zu nahe an einem Hindernis ist.
  • Einschlafen, wenn der Akku leer ist.
  • Schieben eines Objekts bei Berührung.
  • Wenn es zu hell ist, suchen Sie sich eine dunkle Stelle.
  • usw.

Ich bin jetzt ziemlich verwirrt, weil ich nicht weiß, ob ich sie nacheinander in einer Klasse entwickeln oder alle Verhaltensweisen des Drachens in verschiedene Klassen aufteilen soll. Bitte sehen Sie sich meine Erklärung unten an.

Anstatt alles in eine Klasse zu schreiben, wie hier:

Drache.java

public class Dragon {
   LightSensor ls = new LightSensor
   public static main(String args[]) {
       while (!BUTTON.Escape.IsPressed()) {
           if (this.closeToObject()) {
               this.turnAround();
           }

           // more conditions
       }
   }
   private boolean closeToObject() {
       //TODO
       return false;
   }
   private void turnAround() {
       //TODO
   }

   //... more methods
}

Ich möchte jedoch, dass es mehr objektorientiert erscheint, da der Kurs uns helfen soll, mehr OOP-Kenntnisse zu erwerben. Meine zweite Option besteht darin, Aktionsklassen zu erstellen, die die abstrakte Klasse Dragon's Behavior wie folgt erweitern (ungefähr):

Drache.java

public class Dragon {
   Detect detect = new Detect();  // carry all the detection methods: distance, sound, etc.
   TurnAround turnAround = new TurnAround();
   public static main(String args[]) {
       while (!BUTTON.Escape.IsPressed()) {
           if (detect.tooCloseToObject()) {
               turnAround.prepare(); // beep beep alert
               turnAround.setDerection(true); // e.g. turn right
               turnAround.turn();
           }
       }
   }
}

DragonBehaviors.java

abstract class DragonBehavior {
    abstract void prepare();
    public void setDirection(boolean direction) {
        //...
    }
}

TurnAround.java

public class TurnAround extends DragonBehaviors {
    String direction;
    public void TurnAround() {}
    public void prepare() {
        // sound alert
    }
    public void setDirection(boolean direction) {
        if (direction) this.direction = "Right";
        else this.direction = "Left";
    }
    public void turn() {
        // TODO
    }
}

Der obige Code ist nur ein grober Entwurf, konzentrieren Sie sich nicht auf ihn. Schließlich möchte ich fragen, ob meine Idee über die OO-Struktur oben vernünftig ist, sonst ist es viel einfacher, das Ganze in einer Klasse zu entwickeln, aber das hat nichts mit OOP zu tun. Ich habe auch mehrere Gruppenmitglieder, um den Code fertig zu stellen, also denke ich, dass es besser sein könnte, wenn wir die Klassen teilen, um in einer OOP-Art zu entwickeln.

Welchen Weg sollte ich unter diesen Umständen einschlagen?

Ich freue mich über alle Kommentare (:

4voto

Tomasz Nurkiewicz Punkte 322861

Ihre Entscheidung, verschiedene Aktionen in Klassen mit gemeinsamer Oberklasse zu extrahieren, ist IMHO vernünftig. Allerdings würde ich Dragon Klasse, die nur die DragonBehavior abstrakte Klasse, no die Unterklassen. Auf diese Weise können Sie dem Drachen Verhaltensweisen hinzufügen und entfernen, ohne ihn tatsächlich zu verändern.

Und wie? Sehen Sie sich Muster der Verantwortungskette - jedes Verhalten hat seinen Platz in der Kette. Wenn ein Verhalten beschließt, sich selbst zu aktivieren (d. h. etwas auszuführen), kann es die Auslösung weiterer Verhaltensweisen zulassen oder nicht. Außerdem können Sie Verhaltensweisen entfernen (sogar zur Laufzeit!) und neu anordnen, um die Rangfolge zu ändern ( Ist das Überwinden des Hindernisses mehr oder weniger wichtig als das Einschlafen? ).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X