我是TDD设计的新手,正在从事一个项目以获取经验。我的项目是一款塔防风格的游戏-我从一个基本的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对象作为我的业务逻辑的一部分,因此我知道它至少必须有点复杂,但是现在看来我似乎还不对。问题的一部分可能是我没有适当的价值对象吗?

谢谢,

最佳答案

如果我正确理解了您的问题,那么您将拥有一个带有CurrentPosition(Point2D),Direction(向量xTrans,yTrans)和Destination(Point2D)的蠕变。

据我了解,蠕变行为是:


当蠕变无法移动时,转弯后的CurrentPosition应该保持不变,
当蠕变可以移动并且CurrentPosition与Destination之间的距离小于Direction范数时,转弯之后CurrentPosition应该为Destination,
当蠕变可以移动并且CurrentPosition和Destination之间的距离严格大于Direction规范时,转弯后CurrentPosition应该为CurrentPosition + Direction。


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

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个行为也应该可以测试。

09-27 15:13