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