규칙 시스템의 디자인 패턴?


12

재밌는 프로젝트로 솔리테어 게임을 작성해 보았습니다. 그러나 규칙 시스템을 작성할 때 내 게임 로직이 완전한 스파게티 코드이기 때문에 코드가 완전히 구조화되지 않고 확장 불가능 하다고 느꼈기 때문에 더러워 졌습니다.

나는 전에이 문제에 부딪 쳤고 프로그램 의이 부분을 작성할 때 항상 어색하다고 느꼈 습니다. 게임에서 규칙을 정의 할 때 시도되고 테스트 된 모범 사례 가 있는지 궁금합니다 .


1
최대화 캡슐화 및 최소화 커플 링
존 맥도날드

답변:


2

많은 문제가 특정 문제에서 왔기 때문에 독특한 해결책이 있다고 생각하지 않습니다.

Model View Controller 패턴을 사용할 수 있습니다. 이렇게하면 문제가 항상 규칙을 따르는 동작 인 "컨트롤러에서 동작을 구현하는 방법"으로 이동 (충돌)합니다.

우리가 매우 간단한 규칙에 대해 이야기하지 않는 한, 규칙을 구성하는 방식은 표현력에 문제가 있습니다. 당신은 항상 단순 (구조화)되고 표현 적 (즐거운 규칙 작성)이라는 상충되는 요구에 직면합니다.

모델이 상태, 즉 규칙이 적용되는 상황 을 공식화하기 때문에 MVC를 사용하면 작업이 간단 해 집니다.

더 간단한 전환 가능한 동작의 관점에서 복잡한 동작을 구성하기 위해 전략 패턴 및 / 또는 상태 패턴 을 사용하여 컨트롤러를 구현하는 것이 유용 할 수 있습니다. 체인의-resposibility 패턴 의 "상태"부분적으로 "상태"모델의 의미를 겹쳐 있기 때문에 상태 머신은 신중하게 사용되어야하는 동안 규칙을 표현하는 데 도움이 될 수 있습니다.

Controller 내 에서 Command 패턴을 사용하면 Controller Resposliblities (명령은 모델 처리 방법을 알고 있음)를 줄이고 Controller에서 실행 취소 / 다시 실행 기능을 쉽게 추가 할 수 있습니다 .

어쨌든 디자인 패턴을 지침으로 사용하십시오. 바퀴, 특히 사각형 바퀴를 재발 명하는 것을 피하는 것이 유용하지만 모든 문제의 해결책이 여러 바퀴로 구성된 것은 아닙니다.


2

나는 최고인지 잘 모르겠지만 보통 Observer pattern을 사용 합니다. 그것은 나를 위해 충분히 잘 작동했습니다.


1
예를 들어 볼 수 있습니까?
Gustavo Maciel 님의

각 규칙에 대한 관찰자를 만든 다음 게임 상태에 연결할 수 있습니다. 각 턴 게임 상태 후 모든 관찰자에게 해당 규칙이 적용되는지 확인합니다.
Ali1S232

0

여러 번 작업을 수행하지 않았다면 항상 스파게티 코드로 끝납니다. 실제로이 시점에서 방금 시작한 것입니다. 예비 사양의 대략적인 초안입니다. 여기에서 다른 조언 중 일부를 확인하고 심각한 재 작성을 수행하십시오. 그리고 좀 더 재 작성하고 .... 개인적으로, 나는 코드를 정말로 훌륭한 모양으로 만들지 또는 재 작성에 질리게 될지 확신하지 못하지만 결국에는 올바르게 처리 하는 것 같습니다 .

두 끝에서 문제를 해결하십시오. 전반적인 디자인을 이해 하고 간단한 집안일을 처리하고 올바르게 만드는 작은 부품을 선택하십시오. 그런 다음 양쪽 끝에서 중간 방향으로 작업하십시오. 그런 다음 가운데에서 양쪽 끝으로 작업하십시오. 그런 다음 위에서 아래로, 위에서 아래로. 그런 다음 전체 과정을 반복하십시오.

본질적으로, 당신이 가진 것은 클래스 모음입니다. 클래스 A를 고려하십시오. 클래스 A가 제대로 구축되면 클래스 A를 사용하는 클래스는 좋든 나쁘 든 자동으로 더 잘 작동합니다. 클래스 A가 클래스를 잘 사용한다면, 사용 된 클래스는 더 좋을지 모르지만 더 좋을 입니다. 따라서 수업을 최대한 잘 정리 한 다음 각 수업이 가능한 최고의 수업인지 확인하십시오.

당신이 할 수있는대로 그것을 얻는 것이 중요합니다. 당신이 그것을 버릴 때까지 나쁜 코드는 당신을 괴롭힐 것입니다. 소프트웨어를 사용하면 약간의 추가 연마가 항상 유리 합니다. (아무도 코드를 사용하지 않는 한 ....)

요약 : 다른 답변에 제공된 실제 조언을 확인한 다음 원하는 것을 얻을 때까지 코드를 다시 작성하십시오.


따라서 귀하의 답변은 기본적으로 "다른 답변을 읽고 코드를 깨끗하게 작성하거나 후회하게 될 것입니다"
kaoD

@kaoD : 예. 그러나 첫 번째 코딩 시도는 아마도 정크 일 것입니다. (만약 그렇지 않다면, 당신은 자신을 충분히 강요하지 않을 것입니다.) 약간의 연구와 많은 생각과 함께 그것을 풀기 위해서는 많은 노력이 필요합니다. 관련된 프로그램을 작성할 때 이는 정상적인 현상입니다. 이러한 방식으로 소비 된 모든 노력은 장기적으로 (프로그램이 여전히 장기적으로 존재하는 경우) 시간, 노력 및 슬픔을 줄여줍니다. 또한 : OOP를 사용하면 많은 시간을 할애 할 수 있습니다. (코드를 보지 않고도 최선을 다할 수 있습니다.)
RalphChapin

4
실제로 질문에 대답하지 않는다는 것을 알고 있습니까?
kaoD

실제로 Ralph의 게시물이 기술적으로 답인지 여부에 관계없이 Ralph의 답변은 처음에 질문을하는 OP의 동기에 대한 것이라고 생각합니다. 첫 번째 시도에서 코드를 가장 잘 디자인하는 것은 드물다는 사실을 깨닫지 못한 코더에게는 많은 가치가 있다고 생각합니다. 또한 그는 Ralph의 경험에서 비롯된 것처럼 보이는 것을 다루는 접근법을 제안했습니다.
Steve H

@SteveH 그의 대답은 거의 모든 소프트웨어 엔지니어링 프로세스에 적용 할 수 있다고 생각합니다. 어디에서나 복사하여 붙여 넣을 수 있습니다.
kaoD
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.