2012-03-07 77 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()方法內完成。動畫師唯一的責任是告訴精靈移動。由精靈決定是否移動。

相關問題