Допустим, у меня есть некоторый графический код анимации, где у меня есть два класса: Sprite и SpriteAnimator. SpriteAnimator отвечает за перемещение спрайтов через равные промежутки времени. Спрайт имеет свойство, которое может заблокировать его от движения, хотя.
Я впервые реализовал этот вариант использования следующим образом:
public class Sprite
{
public bool Locked;
public void MoveTo(int x, int y){}
}
public class SpriteAnimator
{
private List<Sprite> Sprites;
public void DoMovement()
{
foreach (Sprite sprite in Sprites)
{
if (!sprite.Locked) MoveTo(newX, newY);
}
}
}
... но потом я вспомнил принцип "говори-не спрашивай" , и я чувствую, что спрашиваю о состоянии, принимаю решение и затем говорю им, что делать - как принцип запрещает мне Поэтому я перекодирую к этому:
public class Sprite
{
private bool Locked;
public void MoveIfNotLockedTo(int x, int y) { ... }
}
public class SpriteAnimator
{
private List<Sprite> Sprites;
public void DoMovement()
{
foreach (Sprite sprite in Sprites)
{
MoveIfNotLockedTo(newX, newY);
}
}
}
.. но действительно ли это лучший код? Я не уверен, что я чувствую по поводу имен методов, связанных со словом «если».
Существует также третий вариант - когда Контроллер становится владельцем заблокированных состояний спрайтов. Примерно так:
public class Sprite
{
public void Move(int x, int y) { ... }
}
public class SpriteAnimator
{
private List<Sprite> Sprites;
private List<Sprite> LockedSprites;
public void DoMovement()
{
foreach (Sprite sprite in Sprites)
{
if (!LockedSprites.Contains(sprite) MoveTo(newX, newY);
}
}
}
... но это влияет на производительность, поскольку я получаю O (N ^ 2) цикл.
Так что вы, ребята, думаете? Настало ли время проявить прагматичность и выбрать вариант № 1, который, на мой взгляд, является наилучшим, но нарушает принцип «не спрашивай»?