2012-04-30 2 views
0

Я относительно новичок в дизайне 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

Если я правильно понимаю вашу проблему правильно, у вас есть Creep с CurrentPosition (а Point2D), направление (векторною xTrans, yTrans) и назначения (а Point2D).

Поведение Ползучесть, насколько я понимаю:

  • Когда Creep не может двигаться, его CurrentPosition после поворота должен оставаться таким же,
  • Когда Creep может двигаться и расстояние между CurrentPosition и Destination меньше нормы направления, после поворота CurrentPosition должно быть Destination,
  • Когда ползучесть может двигаться, а расстояние между 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); 
    } 
    } 
} 

Теперь можно протестировать методы класса геометрии и 3 поведения ползучести также должны быть проверкой.

+0

Вы правильно поняли мою проблему. :) Я рассмотрю, что вы сказали, и посмотрите, как это реализовать. Если мне это понравится, я отдам тебе ответ. До тех пор - надеюсь, появятся новые предложения. ^.^Спасибо за вход. :) –

+0

Я думал об этом подходе. Как я вижу ваше предложение, я бы реорганизовал часть работы на вспомогательный класс с кучей статических методов (например, Length), чтобы выполнить некоторые другие работы для меня. Я не уверен, как это выгодно, если бы у меня были личные методы помощника в моем классе. Не могли бы вы объяснить немного больше? –

+0

Здесь я вижу 2 связанных аргумента. Во-первых, есть вероятность, что другие элементы вашей игры будут использовать один и тот же тип логики; то, возможно, позиция и движение ползучести являются его ответственностью, но соответствующие вычисления не таковы: расстояние до места назначения не похоже на работу ползучести. Я хотел бы использовать статический помощник для геометрических вычислений, но вы также можете получить нестатический класс Board или что-то в этом роде, которое будет занимать позиции и обрабатывать расстояния. – Mathias

Смежные вопросы