Принцип «Скажи, не спрашивай» - должен ли я применить его здесь? - PullRequest
3 голосов
/ 08 марта 2012

Допустим, у меня есть некоторый графический код анимации, где у меня есть два класса: 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, который, на мой взгляд, является наилучшим, но нарушает принцип «не спрашивай»?

Ответы [ 2 ]

6 голосов
/ 25 мая 2012

Почему аниматору нужно заботиться? Учитывая текущую логику, заблокированные проверенные должны выполняться внутри метода Sprite.move(). Единственная обязанность аниматоров - указывать спрайту двигаться. Спрайт должен решить, движется он или нет.

4 голосов
/ 08 марта 2012

Исходя из принципа, похоже, что второй вариант - это путь.

Скажите объект, что вы хотите. Пусть это выяснит, как это сделать.

Не слишком переживайте по поводу названия функции, еще лучше, если вы боитесь не помнить, как работает эта функция, просто прокомментируйте функцию должным образом, чтобы она была легко поддержана вами или кем-то еще. *

...