몇 가지 제안을하겠습니다. 그들 중 일부는 서로 모순됩니다. 그러나 일부는 유용 할 수 있습니다.
목록 대 플래그 고려
전 세계를 반복하고 각 항목에서 플래그를 확인하여 플래그를 수행할지 여부를 결정할 수 있습니다. 또는 깃발 일을 해야하는 항목의 목록을 유지할 수 있습니다.
목록 및 열거 고려
부울 필드를 항목 클래스 isAThis 및 isAThat에 계속 추가 할 수 있습니다. 또는 { "isAThis", "isAThat"} 또는 {IS_A_THIS, IS_A_THAT}와 같은 문자열 또는 열거 형 요소 목록을 가질 수 있습니다. 이렇게하면 필드를 추가하지 않고 열거 (또는 문자열 const)에 새로운 것을 추가 할 수 있습니다. 필드 추가에 실제로 문제가있는 것은 아닙니다 ...
함수 포인터 고려
플래그 또는 열거 목록 대신 다른 컨텍스트에서 해당 항목에 대해 실행할 조치 목록이있을 수 있습니다. (엔티티 -ish…)
객체를 고려
일부 사람들은 데이터 중심, 스크립트 또는 구성 요소 개체 접근 방식을 선호합니다. 그러나 구식 개체 계층도 고려할 가치가 있습니다. 기본 수업은“턴 페이즈 B를 위해이 카드를 사용하십시오”와 같은 행동을 받아 들여야합니다. 그런 다음 각 종류의 카드를 무시하고 적절하게 응답 할 수 있습니다. 플레이어 객체와 게임 객체도있을 수 있으므로 게임은 if (player-> isAllowedToPlay ()) {do play…}와 같은 작업을 수행 할 수 있습니다.
디버그 기능 고려
플래그 필드 더미에 대해 좋은 점은 모든 항목의 상태를 동일한 방식으로 검사하고 인쇄 할 수 있다는 것입니다. 상태가 다른 유형이나 구성 요소의 백, 함수 포인터로 표시되거나 다른 목록에 있으면 항목의 필드를 보는 것만으로는 충분하지 않을 수 있습니다. 모든 절충점입니다.
결국 리팩토링 : 단위 테스트 고려
아키텍처를 얼마나 일반화하든, 다루지 않는 것들을 상상할 수 있습니다. 그런 다음 리팩터링해야합니다. 아마 조금, 아마 많이.
보다 안전한 방법은 단위 테스트를 사용하는 것입니다. 그렇게하면 아래에있는 것들을 (다수로) 재 배열하더라도 기존 기능이 여전히 작동한다는 것을 확신 할 수 있습니다. 각 단위 테스트는 일반적으로 다음과 같습니다.
void test1()
{
Game game;
game.addThis();
game.setupThat(); // use primary or backdoor API to get game to known state
game.playCard(something something).
int x = game.getSomeInternalState;
assertEquals(“did it do what we wanted?”, x, 23); // fail if x isn’t 23
}
보시다시피, 게임 (또는 플레이어, 카드, & c)에 대한 최상위 API 호출을 안정적으로 유지하는 것이 단위 테스트 전략의 핵심입니다.