@DennisJaamann 말했듯이 - 명령이 하나의 일을해야한다. 그러나 도에는 실제 도메인 논리가 포함되어서는 안됩니다. 또한 모델이나 View 클래스에 있어야하지 않습니다.
다음과 같은 이유가 있습니다. 게임 로직을 프레임 워크 특정 클래스에 넣는다면 게임을이 특정 프레임 워크에 묶을 수 있습니다 (좋은 게임이라 할지라도). 그러나 TicTacToe의 게임 규칙은 RobotLegs, PureMVC 또는 다른 기술 선택에 관계없이 항상 동일하게 유지되어야합니다. 예를 들어, 몇 달 만에 새로운 멋진 모바일 장치 용 게임 버전을 만들기로 결정하고 공급 업체별 MVC 프레임 워크 및 구성 요소를 사용하려면 처음부터 모든 것을 다시해야합니다. 또한 게임 논리를 몇 가지 명령 클래스에 분산 시키면 코드를 읽고, 이해하는 것이 훨씬 더 어려워집니다. 이렇게하면 디버깅이 정말 어려워집니다.
As Uncle Bob Martin would put it : 프레임 워크는 배달 메커니즘입니다. 그 이상도 이하도 아닌. 정보를 제공하는 데 사용해야합니다 (예 :그것을 사용자에게 제시하고, 사용자 상호 작용 이벤트를 처리합니다. 그러나 실제 도메인 논리는 의존성을 거꾸로하는 프레임 워크에 종속되지 않는 유스 케이스 클래스에 있어야하며 따라서 전달 메커니즘과 완전히 분리됩니다.
그래서 게임 인터페이스를 만들고, ITicTacToe
이라고하고 게임 클래스 인 TicTacToe
에 구현합니다. 여기에는 상태 (즉, 이미 표시된 셀)와 로직 (즉, 3 회 연속) TicTacToe의 단일 라운드를 수행하고 모니터링합니다. 이러한 것들은 같은 목적을 위해 사용되기 때문에 함께 있습니다. single reason to change : TicTacToe의 규칙이 변경되는 경우에만!
TDD를 사용하여 게임의 동작을 구현하고 점수 등을 추적하는 대신 게임이 승리하거나 분실 될 때마다 게임 클래스를 파견하도록하십시오. 이것은 응용 프로그램 로직 주위에 게임인데이지만 게임 그 자체가 아닙니다.
다음 게임을 CellSelectedCommand
에 삽입하고 게임 클래스에서 해당 메소드를 호출하고 로컬 게임 이벤트를 청취 한 다음 중앙 디스패처를 통해 응용 프로그램 전체 이벤트를 전달할 수 있습니다. 이것들을 사용하여 별도의 과 GameLostCommand
클래스를 트리거하여 점수에 점수를 추가하고 ScoreModel
에 보유 할 수 있습니다. 모델에는 공유 상태 (즉, 하나 이상의 작업에서 필요로하는 데이터) 만 포함되어야합니다. 서랍과 상자 같은 모델을 큰 선반에 올려 놓고 생각합니다. 작업을 수행하기 위해 필요한 일부 데이터 (예 : 게임을 시작하기 전에 일부 사용자 정보)를 처리하고 처리 한 다음 나중에 저장합니다 (점수 저장). 핵심 응용 프로그램 로직을 프레임 워크 및 전달 메커니즘에 항상 유지하려고 시도하십시오. - 시스템의 중심이 아닌 확장 기능, 플러그인이어야합니다. .
글쎄 !! –
본인은 귀하가 중재자, 명령 및 모델 유형에 대해 명시한 원칙에 동의하지만 핵심 도메인 논리가 그러한 유형의 논리에 속하지 않아야합니다. 내 대답을 보라. – weltraumpirat