내 소프트웨어 엔지니어링 수업에서 과제는 특정 게임에서 다른 형태를 재생할 수있는 응용 프로그램을 설계하는 것입니다. 문제의 게임은 Mancala이며,이 게임 중 일부는 Wari 또는 Kalah라고합니다. 이러한 게임은 몇 가지 측면에서 차이가 있지만 내 질문에 따르면 다음과 같은 경우 게임이 다를 수 있음을 아는 것만 중요합니다.
- 이동 결과가 처리되는 방식
- 게임의 끝을 결정하는 방법
- 승자가 결정되는 방식
이것을 설계하기 위해 가장 먼저 생각한 것은 전략 패턴을 사용하는 것이 었습니다. 알고리즘 (게임의 실제 규칙)에 변형이 있습니다. 디자인은 다음과 같습니다.
나는 Mancala와 Wari 게임에서 승자가 결정되는 방식이 정확히 동일하고 코드가 복제 될 것이라고 스스로 생각했다. 나는 이것이 정의에 의해 '하나의 규칙, 한 곳'또는 DRY 원칙을 위반한다고 Mancala에 대한 규칙의 변경으로 보는 것이 Wari에서도 규칙이 변경되어야한다는 것을 자동으로 의미하지는 않는다고 생각하지 않습니다. 그럼에도 불구하고 교수로부터받은 피드백을 통해 다른 디자인을 찾을 수 있다는 인상을 받았습니다.
그런 다음 이것을 생각해 냈습니다.
각 게임 (Mancala, Wari, Kalah, ...)은 각 규칙의 인터페이스 유형의 속성을 가지게됩니다. 즉 WinnerDeterminer
Mancala 1.0과 동일한 Mancala 2.0 버전이있는 경우 승자가 결정되는 방법을 제외하고는 Mancala 버전을 사용하십시오.
전략 패턴으로 이러한 규칙을 구현하는 것이 확실히 유효하다고 생각합니다. 그러나 실제 문제는 더 디자인하려고 할 때 발생합니다.
템플릿 메소드 패턴에 대해 읽었을 때 즉시이 문제에 적용될 수 있다고 생각했습니다. 사용자가 움직일 때 수행되는 작업은 항상 동일하며 동일한 순서로 다음과 같습니다.
- 구멍에 돌을 입금하십시오 (모든 게임에서 동일하므로 템플릿 방법 자체로 구현됩니다)
- 이동 결과 결정
- 이전 이동으로 인해 게임이 완료되었는지 확인
- 게임이 끝나면 누가 이겼는지 결정하십시오
마지막 세 단계는 모두 위에서 설명한 전략 패턴에 있습니다. 이 두 가지를 결합하는 데 많은 어려움이 있습니다. 내가 찾은 가능한 해결책 중 하나는 전략 패턴을 포기하고 다음을 수행하는 것입니다.
전략 패턴과 이것의 디자인 차이가 실제로 보이지 않습니까? 그러나 템플릿 방법을 사용해야한다고 확신합니다 (전략 패턴을 사용해야한다고 확신하더라도).
또한 누가 TurnTemplate
객체 생성을 담당 할 것인지 결정할 수 없지만 전략 패턴을 사용하면 추상 팩토리 패턴을 사용하여 쉽게 생성 할 수있는 객체 패밀리 (세 가지 규칙)가 있다고 생각합니다. 나는 다음을 것 MancalaRuleFactory
, WariRuleFactory
등 그리고 그들은 나를 다시 규칙과 손의 올바른 인스턴스 생성 할 RuleSet
객체를.
전략 + 추상 팩토리 패턴 RuleSet
을 사용하고 세 가지 규칙에 대한 알고리즘 이있는 객체 가 있다고 가정 해 봅시다 . 이 방법으로 템플릿 메소드 패턴을 계속 사용할 수 있다고 생각하는 유일한 방법은이 RuleSet
객체를 my 에 전달 하는 것 TurnTemplate
입니다. 그때 나타나는 '문제'는 구체적인 구현이 필요하지 않다는 것입니다 TurnTemplate
.이 클래스는 더 이상 사용되지 않습니다. 에서 보호 된 메소드에서 TurnTemplate
전화를 걸 수 있습니다 ruleSet.determineWinner()
. 결과적으로 TurnTemplate
클래스는 더 이상 추상적이지 않지만 구체적이어야하는데 여전히 템플릿 메소드 패턴입니까?
요약하면, 올바른 방법으로 생각하고 있습니까, 아니면 쉬운 것을 놓치고 있습니까? 올바른 길을 가고 있다면 전략 패턴과 템플릿 방법 패턴을 어떻게 결합합니까?