0

我对 TDD 设计比较陌生,并且正在开展一个项目以获取相关经验。我的项目是一个塔防风格的游戏——我从一个基本的 Creep(怪物)开始,并根据测试的行为来设计它。然而,creep如何移动是一个相当复杂的方法。它目前看起来类似于:

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(Point2D)、Direction(矢量 xTrans、yTrans)和 Destination(Point2D)的 Creep。

据我了解,蠕变行为是:

  • 当 Creep 不能移动时,它的 CurrentPosition 在转弯后应该保持不变,
  • 当 Creep 可以移动并且 CurrentPosition 和 Destination 之间的距离小于 Direction 的范数时,转弯后 CurrentPosition 应该是 Destination,
  • 当 Creep 可以移动并且 CurrentPosition 和 Destination 之间的距离严格大于 Direction 的范数时,转弯后的 CurrentPosition 应该是 CurrentPosition + Direction。

从这个角度来看,我倾向于将计算/几何部分提取到几何类中,并将蠕变行为声明为

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 类的方法,Creep 的 3 个行为也应该是可测试的。

于 2012-05-01T16:37:09.420 回答