2012-03-07 6 views
3

Sprite와 SpriteAnimator의 두 클래스가있는 일종의 그래픽 애니메이션 코드가 있다고 가정 해 보겠습니다. SpriteAnimator는 스프라이트를 일정한 간격으로 이동시킵니다. 스프라이트에는 움직임을 막을 수있는 속성이 있습니다.Tell, do not ask principle - 여기에 적용해야합니까?

내가 먼저 이런이 사용 사례 구현 :

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을 기억하고, 내가 결정을, 상태에 대한 요구하고 무엇을 그들에게있어 기분이 - 원리가 저를 금지하는 것처럼. 따라서 나는 다음과 같이 코드를 다시 작성합니다.

..하지만 실제로 더 좋은 코드입니까? "If"라는 단어를 포함하는 메소드 이름에 대해 어떻게 생각하는지 모르겠습니다.

컨트롤러에는 스프라이트의 잠긴 상태에 대한 소유권이있는 세 번째 옵션이 있습니다. 이런 식으로 뭔가 : 나는 O (N^2) 루프를 먹을수록 이것은 성능에 영향을

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

...하지만.

그럼 너희들은 어떻게 생각하니? 실용 주의적이고 선택권 # 1을 선택할 때가 좋습니까?하지만 최고라고 말하면서 말하지 말고 말하지 마십시오.

답변

4

원칙에 따르면 두 번째 옵션은 갈 길이 멀다.

원하는 것을 개체에게 알리십시오. 그것을하는 방법을 이해하자.

기능이 작동하는 방식을 기억하지 못하는 것을 두려워하는 경우 함수의 이름을 너무 걱정하지 마세요. 함수를 올바르게 주석 처리하면 나 또는 다른 누군가가 쉽게 유지 관리 할 수 ​​있습니다. .

6

왜 애니메이터는 신경 써야합니까? 현재 로직이 주어지면 잠김 검사는 Sprite.move() 메소드 내에서 수행되어야합니다. 애니메이터의 책임은 스프라이트에 이동을 지시하는 것입니다. 그것이 움직이는 지 아닌지를 결정하는 것은 스프라이트에 달려있다.

관련 문제