Design patterns 告诉,don';不要问原则——我应该在这里应用它吗?

Design patterns 告诉,don';不要问原则——我应该在这里应用它吗?,design-patterns,Design Patterns,假设我有一些图形动画代码,其中有两个类:Sprite和SpriteAnimator。SpriteAnimator负责定期移动精灵。精灵有一个属性,可以锁定它的移动 我首先实现了这个用例,如下所示: public class Sprite { public bool Locked; public void MoveTo(int x, int y){} } public class SpriteAnimator { private List<Sprite> Sp

假设我有一些图形动画代码,其中有两个类: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
{
    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);
        }
    }
}
公共类精灵
{
公共厕所上锁;
公共void MoveTo(intx,inty){
}
公共类SpriteAnimator
{
私有列表精灵;
公开无效动议
{     
foreach(精灵中的精灵)
{
如果(!sprite.Locked)移动到(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 void MoveIfNotLockedTo(intx,inty){…}
}
公共类SpriteAnimator
{
私有列表精灵;
公开无效动议
{     
foreach(精灵中的精灵)
{
移动到(newX,newY);
}
}
}
但这真的是更好的代码吗?我不确定我对包含“If”一词的方法名的感觉如何

还有第三个选项-控制器拥有精灵锁定状态的所有权。大概是这样的:

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
{
    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);
        }
    }
}
公共类精灵
{
公共无效移动(int x,int y){…}
}
公共类SpriteAnimator
{
私有列表精灵;
私有列表锁定精灵;
公开无效动议
{     
foreach(精灵中的精灵)
{
如果(!LockedSprites.Contains(sprite)MoveTo(newX,newY);
}
}
}
…但当我得到O(N^2)循环时,这会对性能产生影响


你们觉得呢?是时候务实点,选择选项1了吗?我觉得这是最好的,但违反了“不说不问”的原则?

基于这一原则,第二个选项似乎是可行的

告诉对象你想要什么,让它知道怎么做


不要太担心函数的名称,更好的是,如果你害怕忘记该函数是如何工作的,只需适当地注释该函数,这样你或其他人就可以轻松地对其进行维护。

为什么动画师需要关心?鉴于当前的逻辑,锁定复选框应该在
Sprite.move()中完成
方法。动画师唯一的责任是告诉精灵移动。是否移动取决于精灵