2009-11-05 1 views
0

오브젝트와 같은 상태 머신을 작성하고 있습니다. 모양이오브젝트와 같은 상태 머신에 대한 클래스 디자인 아이디어

Class A: 

vector<Actions> m_enter_actions; 
vector<Actions> m_exit_actions; 

public: 

    ClassA.... 
    ~ClassA 

    SetEnterActions(vector<Actions> vector) 
    SetExitActions(vector<Actions> vector) 

이 문제를 해결하는 가장 좋은 방법입니까? 내가 좋아해야하는지 궁금해.

Class A: 
    EnterActions m_exit_actions; 
    ExitActions m_exit_actions; 

public: 

    ClassA.... 
    ~ClassA 

    SetEnterActions(EnterActions& actions) 
    SetExitActions(ExitActions& actions) 

EnterActions 클래스는 자체 동작 벡터가있는 컨테이너입니다. ClassA 클래스는 원시 벡터를 관리 할 필요가 없습니다.

도움을 주시면 감사하겠습니다. 나는 수업 설계에 나쁘다. 학습 비록 :)

답변

1

SetEnterActions 및 SetExitActions 함수의 서명은 호출자가 ClassA에서 작업을 저장하는 방법을 알 수 없도록 디자인되어야합니다. ClassA 사용자는 ClassA가 벡터, 양 목록, 목록 또는 EnterActions 클래스에 저장하는지 여부를 원하지 않습니다. 그들은 ClassA가 어떤 컨테이너에 저장했는지에 관계없이 패키지를 만들어야하는 것을 원하지 않습니다.

첫 번째 경향은 호출자가 반복자를 제공 할 수있게 해주는 것입니다. 호출자가 호출자가 함수 호출에 시간 : 발신자가 벡터에이를 경우

template <typename InputIterator> 
AddEnterActions(InputIterator first, InputIterator last); 

AddEnterAction(const Action &action); 

그래서 그는 AddEnterActions(vec.begin(), vec.end());를 호출합니다. 그가 배열되어 있다면 그는 AddEnterActions(arr, arr+size);로 전화합니다. 그 (것)들을 생성하는 특별한 방법이있는 경우에, 그는 그 (것)들을 콘테이너로두기의 주위에 뒤죽박죽이어서 그 (것)들을 전부 즉시 추가하고, 생성하기 위하여 iterator 종류를 쓸 필요 없다. 그는 자신이 무엇인지 알아낼 때 추가 할 수 있습니다.

한편, 벡터를 ClassA 저장 작업은 다음 구현은 단지 인 경우

template <typename InputIterator> 
AddEnterActions(InputIterator first, InputIterator last) { 
    m_enter_actions.insert(m_enter_actions.end(), first, last); 
} 

AddEnterAction(const Action &action) { 
    m_enter_actions.push_back(action); 
} 

를 ClassA 나중에 다른 뭔가에 저장하고 싶은 경우에, 당신은 어떤 클라이언트 코드를 변경할 필요가 없습니다.

가능한 경우 발신자가 원하는 것을 기준으로 인터페이스를 먼저 디자인하십시오. 그런 다음 구현에 대해 걱정하십시오. 때때로 인터페이스로 돌아가서 인터페이스를 조정해야합니다. 인터페이스가 구현 불가능하거나 클래스가 무의미하게 무언가를 수행하도록 요구할 때가 있습니다. 그러나 대개는 그렇지 않습니다.

0

당신이 정상적인 벡터 너머에 행동을 전시해야한다고 생각한다면 EnterActions과 ExitActions를 사용하십시오. 그렇지 않으면 벡터가 좋습니다.

관련 문제