可以说我有一些图形动画代码,我有两个类: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,但违反了“不问不问”的原则?