0

私はTDD設計に比較的慣れておらず、経験を積むためにプロジェクトに取り組んでいます。私のプロジェクトはタワー ディフェンス スタイルのゲームです。基本的なクリープ (モンスター) から始めて、テスト済みの動作に基づいて設計しています。しかし、クリープがどのように動くかはかなり複雑な方法です。現在、次のように見えます。

public void moveToward(Point2D destination) {
  if (canMove()) {
    if (speedGreaterThanDistance(destination) {
      leftoverDistance = calculateLevtoverDistance(destination);
      currentLocation.setLocation(destination);
    } else {
      // do math to calculate x distance and y distance to move
      Point2D newLocation = new Point2D.Double(oldX + xTrans, oldY + yTrans);
      currentLocation.setLocation(newLocation);
    }
  }
}

これは本当に正しいデザインと構造のようには思えませんが、それをセグメント化する方法がわかりません. これを行う方法について私に指摘する提案やリンクはありますか? 私のデザインには、ビジネス ロジックの一部として Creep オブジェクトが含まれているため、少なくとも多少複雑になることはわかっていますが、現時点では適切ではないようです。私の問題の一部は、適切な値オブジェクトが配置されていないことでしょうか?

ありがとう、

4

1 に答える 1

1

私があなたの問題を正しく理解していれば、CurrentPosition (a Point2D)、Direction (a Vector xTrans、yTrans)、および Destination (a Point2D) を持つ Creep があります。

私が理解している限り、クリープの動作は次のとおりです。

  • クリープが移動できない場合、ターン後の CurrentPosition は同じままである必要があります。
  • クリープが移動でき、CurrentPosition と Destination の間の距離が Direction のノルムよりも小さい場合、ターン後の CurrentPosition は Destination である必要があります。
  • Creep が移動可能で、CurrentPosition と Destination の間の距離が Direction のノルムより厳密に大きい場合、ターン後の CurrentPosition は CurrentPosition + Direction になります。

その観点から、計算/ジオメトリ部分を Geometry クラスに抽出し、クリープ動作を次のように述べる傾向があります。

public void moveToward(Point2D destination) 
{
  if (CanMove()) 
  { 
    var distanceToDestination = Geometry.Distance(CurrentPosition, destination);
    var distancePerTurn = Geometry.Length(Direction);
    if (distanceToDestination <= distancePerTurn)
    {
      CurrentPosition = destination;
    }
    else
    {
      CurrentPosition = Geometry.Add(CurrentPosition, Direction);
    }   
  }
}

Geometry クラスのメソッドをテストできるようになり、クリープの 3 つの動作もテストできるようになります。

于 2012-05-01T16:37:09.420 に答える