2

Java の課題があり、教授から LeJOS NXT を使用して、特定の動物の行動をシミュレートするロボットを作成するように求められています。私はドラゴンを開発することにしました。これまでに思いついたすべての可能な動作は次のとおりです。

  • 障害物に近すぎると向きを変える。
  • バッテリーが少なくなるとスリープ状態になります。
  • 触れたら物を押す。
  • 明るすぎる場合は、暗い場所を見つけてください。

1つのクラスで順番に開発するか、すべてのドラゴンの動作を異なるクラスに分割するかがわからないため、現在かなり混乱しています。以下の私の説明をご覧ください。

次のように 1 つのクラス内にすべてを記述する代わりに:

Dragon.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
}

ただし、コースはより多くの OOP スキルを習得するのに役立つことを目的としているため、よりオブジェクト指向に見えるようにしたいと考えています。したがって、私の 2 番目のオプションは、Dragon の Behavior 抽象クラスを次のように拡張するアクション クラスを作成することです (大まかに):

Dragon.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
    }
}

上記のコードはおおまかに下書きです。それに注目しないでください。最終的に、上記の OO 構造に関する私の考えが妥当かどうかを尋ねたいと思います。そうでない場合は、1 つのクラスですべてを開発する方がはるかに簡単ですが、OOP とは何の関係もありません。コードを仕上げるためのグループ メンバーも何人かいるので、クラスを共有して OOP で開発するとよいと思います。

この場合、どちらに行けばいいですか?

すべてのコメントに感謝します (:

4

1 に答える 1

4

異なるアクションを共通のスーパークラスを持つクラスに抽出するという選択は、私見では合理的です。ただし、サブクラスではなく、抽象クラスDragonのみをクラスに認識させます。このようにして、実際にドラゴンを変更することなく、ドラゴンの動作を追加および削除できます。DragonBehavior

どのように?Chain-of-responsibility のパターンを見てください。動作がそれ自体をアクティブにする (つまり、何かを実行する) ことを決定した場合、それ以上の動作をトリガーできる場合とできない場合があります。さらに、動作を削除して (実行時でも!)、それらを再配置して優先順位を変更することができます (障害を押すことは、スリープ状態になることよりも多かれ少なかれ重要ですか? )。

于 2011-09-25T08:33:18.637 に答える