Padrões de design para sistemas de regras?

12

Como um projeto divertido e rápido, tentei escrever um jogo de paciência. Mas, ao escrever os sistemas de regras, senti-me sujo , porque meu código parecia completamente desestruturado e inextensível , principalmente porque minha lógica de jogo era um código de espaguete completo.

Eu já enfrentei esse problema antes e sempre me sinto estranho ao escrever essa parte do meu programa, então fiquei imaginando, existem práticas recomendadas para tentar definir regras em um jogo ?

Dasuraga
fonte
1
Maximize encapsulamento e minimizar Coupling
John McDonald

Respostas:

2

Eu não acho que exista uma solução única, pois muitas considerações vêm do problema em particular.

Você pode usar o padrão Model View Controller: isso move (confinam) seu problema para "como implementar um comportamento no controlador", um comportamento que sempre segue as regras.

A menos que estejamos falando de regras muito simples, a maneira como você as organiza coloca um problema de expressividade . Você sempre enfrenta as demandas conflitantes de ser simples (estruturado) e ser expressivo (escrever regras divertidas).

O uso do MVC simplifica seu trabalho, porque o modelo formaliza um estado, ou seja, o contexto em que as regras são aplicadas.

Dito isso, você pode achar útil implementar o Controlador usando o padrão de Estratégia e / ou o padrão de Estado para compor um comportamento complexo em termos de comportamentos comutáveis ​​mais simples. Um padrão de cadeia de responsabilidade pode ajudá-lo a expressar regras enquanto uma máquina de estado deve ser usada com cuidado porque seu "estado" se sobrepõe parcialmente ao significado de "estado" do modelo.

O uso do padrão Command no Controller pode ser útil para reduzir as responsabilidades do Controller (o Command sabe como lidar com o modelo) e facilitar a adição das funções de desfazer / refazer no Controller.

De qualquer forma, você deve tentar usar os padrões de design como orientação: eles são úteis para evitar reinventar a roda, especialmente a roda quadrada, mas nem todas as soluções de problemas consistem em várias rodas (redondas) juntas.

FxIII
fonte
2

Não tenho certeza sobre ser melhor ou até bom, mas geralmente uso o padrão Observer . Funcionou bem o suficiente para mim.

Ali1S232
fonte
1
Você pode dar um exemplo?
23133 Gustavo Maciel
você pode criar um observador para cada regra e anexá-los ao estado do jogo. após cada turno, o estado do jogo chama todos os observadores para verificar se alguma dessas regras é aplicada.
111112 Ali1S232
0

A menos que você tenha feito o trabalho muitas vezes antes, você sempre terminará com código de espaguete. Na verdade, neste ponto, você apenas começou: o que você tem é o rascunho de uma especificação preliminar. Confira alguns dos outros conselhos aqui e faça uma reescrita séria. E depois mais algumas reescritas, e então ... Pessoalmente, nunca tenho certeza se coloco meu código em ótima forma ou fico cansado de reescrevê-lo, mas pareço acertar eventualmente.

Resolver o problema de duas extremidades. Tente fazer o design geral fazer sentido e escolher peças pequenas que lidam com tarefas simples e que as acertem. Em seguida, tente trabalhar o seu caminho de ambas as extremidades para o meio. E depois trabalhe do meio para as duas extremidades. Depois, de cima para baixo e de baixo para cima. Em seguida, repita todo o processo.

Essencialmente, o que você tem é uma coleção de classes. Considere a classe A. Se a classe A for bem construída, as classes que a utilizarão funcionarão automaticamente melhor, por melhores ou más que sejam. Se a classe A usar bem as classes, essas classes usadas farão mais, por melhores ou más que sejam. Portanto, organize suas aulas da melhor maneira possível e garanta que cada uma seja a melhor classe possível.

É importante acertar o máximo possível. O código incorreto o assombrará até o dia em que você o expulsar. Com o software, um pouco de polimento extra sempre compensa. (A menos que ninguém acabe usando o código ....)

Para resumir: confira as orientações reais fornecidas nas outras respostas e reescreva seu código até obter o que deseja.

RalphChapin
fonte
Portanto, sua resposta é, basicamente, "leia as outras respostas e fazer um código limpo ou você vai se arrepender" ...
kaoD
@kaoD: Sim. Mas também: sua primeira tentativa de codificação provavelmente será lixo. (Se não estiver, você não está se esforçando o suficiente.) Vai demorar muito trabalho duro para juntar tudo, junto com um pouco de pesquisa e muito pensamento. Isso é normal ao escrever um programa envolvido. Todo esforço despendido dessa maneira economizará tempo, esforço e sofrimento a longo prazo (se o programa ainda estiver lá a longo prazo). E também: OOP ajuda bastante, se você conseguir pegar o jeito. (O melhor que eu posso fazer sem ver o código.)
RalphChapin
4
Você percebe que realmente NÃO está respondendo à pergunta?
22412 kaoD
Na verdade, independentemente de o cargo de Ralph ser ou não tecnicamente uma resposta, acho que a resposta de Ralph falou sobre o motivo do OP de fazer a pergunta em primeiro lugar. Acredito que isso tenha muito valor para um codificador que não chegou à conclusão de que é raro que você crie seu código melhor na primeira tentativa. Além disso, ele ofereceu uma abordagem para lidar com isso, que parecia ter nascido da experiência de Ralph.
21712 Steve
@SteveH Acho que a resposta dele é aplicável a quase qualquer processo de engenharia de software. Você pode copiá-lo e colá-lo em qualquer lugar e ele se encaixa.
KaoD