可以說我有一些圖形動畫代碼,我有兩個類: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,但違反了「不問不問」的原則?