2012-03-07 74 views
3

可以说我有一些图形动画代码,我有两个类: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); 
     } 
    } 
} 

...但后来我想起Tell-don't ask principle,我觉得我问的状态,作出决定,然后告诉他们该怎么做 - 就像原则禁止我一样。所以我重新编码到这:

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); 
     } 
    } 
} 

..但是这实际上是更好的代码?我不知道我对包含单词“If”的方法名称有何看法。

还有第三种选择 - 其中控制器采用精灵的锁定状态的所有权。事情是这样的:

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,但违反了“不问不问”的原则?

回答

4

的原则基础上,它看起来像第二个选项是要走的路。

告诉你想要的对象。让它找出如何去做。

不要太担心该函数的名称,更重要的是,如果你害怕不记住,函数是如何工作的,只是发表评论的正常工作,因此将是您轻松维护,或者别人。

6

为什么动画师需要照顾?鉴于当前的逻辑,锁定的检查应在Sprite.move()方法内完成。动画师唯一的责任是告诉精灵移动。由精灵决定是否移动。

相关问题