在下列情况下适当下放责任?

时间:2012-04-30 16:32:49

标签: java tdd separation-of-concerns

我对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对象作为我的业务逻辑的一部分,所以我知道它必须至少有点复杂,但它似乎并不像我现在正确。部分问题可能是我没有适当的价值对象吗?

谢谢,

1 个答案:

答案 0 :(得分:1)

如果我正确理解你的问题,你有一个带有CurrentPosition(一个Point2D)的Creep,一个Direction(一个Vector xTrans,yTrans)和一个Destination(一个Point2D)。

据我所知,Creep的行为是:

  • 当Creep无法移动时,转弯后的CurrentPosition应保持不变,
  • 当Creep可以移动并且CurrentPosition和Destination之间的距离小于Direction的范数时,转动CurrentPosition后应该是Destination,
  • 当Creep可以移动并且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个行为也应该是可测试的。