Modelli di progettazione per sistemi di regole?


12

Come progetto rapido e divertente, ho provato a scrivere un solitario. Ma quando ho iniziato a scrivere i sistemi di regole, mi sono sentito sporco , perché il mio codice sembrava completamente non strutturato e inestensibile , principalmente perché la mia logica di gioco era un codice spaghetti completo.

Mi sono mai imbattuto in questo problema in precedenza e mi sento sempre imbarazzato quando scrivo questa parte del mio programma, quindi mi chiedevo, ci sono delle migliori pratiche testate quando si tratta di definire le regole in un gioco ?


1
Massimizza l' incapsulamento e minimizza l' accoppiamento
John McDonald,

Risposte:


2

Non credo che esista una soluzione unica, dal momento che molte problematiche derivano dal problema specifico.

È possibile utilizzare il modello Controller vista modello: questo sposta (confina) il problema su "come implementare un comportamento sul controller", un comportamento che segue sempre le regole.

A meno che non stiamo parlando di regole molto semplici, il modo in cui le organizzi pone un problema di espressività . Devi sempre affrontare le esigenze contrastanti di essere semplice (strutturato) ed espressivo (scrivere regole divertenti).

L'uso di MVC semplifica il lavoro perché il modello formalizza uno stato, ovvero il contesto in cui vengono applicate le regole.

Detto questo, potresti trovare utile implementare il Controller usando il modello di strategia e / o il modello di stato al fine di comporre un comportamento complesso in termini di comportamenti commutabili più semplici. Un modello di catena di resposibilità può aiutarti a esprimere le regole mentre una macchina a stati dovrebbe essere usata con attenzione perché il suo "stato" si sovrappone parzialmente al significato di "stato" del modello.

L'uso del modello di comando all'interno del controller può essere utile sia per ridurre la resposiblità del controller (il comando sa come gestire il modello) sia per aggiungere facilmente le funzioni di annullamento / ripetizione nel controller.

In ogni caso, dovresti provare a utilizzare i modelli di progettazione come linee guida: sono utili per evitare di reinventare la ruota, in particolare la ruota quadrata, ma non la soluzione di ogni problema consiste in un gruppo di ruote (rotonde) messe insieme.


2

Non sono sicuro di essere il migliore o addirittura buono, ma di solito uso il modello Observer . Ha funzionato abbastanza bene per me.


1
Puoi fare un esempio?
Gustavo Maciel,

puoi creare un osservatore per ogni regola, quindi collegarlo allo stato del gioco. dopo ogni turno lo stato del gioco chiama tutti gli osservatori per verificare se viene applicata una di queste regole.
Ali1S232,

0

A meno che tu non abbia fatto il lavoro molte volte prima, finirai sempre con il codice spaghetti. In realtà, a questo punto, hai appena iniziato: quello che hai è la bozza di una specifica preliminare. Dai un'occhiata ad alcuni degli altri consigli qui e fai qualche riscrittura seria. E poi ancora un po 'di riscrittura, e poi ... Personalmente, non sono mai sicuro se riesco a ottenere il mio codice in ottima forma o semplicemente mi stanco di riscriverlo, ma alla fine mi sembra di riuscire a farlo bene.

Affronta il problema da due estremità. Cerca di dare un senso al design generale e scegli le piccole parti che gestiscono le faccende semplici e le rendono giuste. Quindi prova a lavorare da entrambe le estremità verso il centro. E poi lavorare dal centro dietro verso entrambe le estremità. Quindi dall'alto verso il basso, quindi dal basso verso l'alto. Quindi ripetere l'intero processo.

In sostanza, quello che hai è una raccolta di classi. Considera la classe A. Se la classe A è costruita bene, le classi che la usano funzioneranno automaticamente meglio, per quanto buone o cattive siano. Se le classi usi di classe A e, quelle classi utilizzato sarà fare di più, per quanto buoni o cattivi che siano. Quindi organizza le tue lezioni nel miglior modo possibile, quindi assicurati che ognuna sia la migliore che possa essere.

È importante farlo nel modo più giusto possibile. Il codice errato ti perseguiterà fino al giorno in cui lo butterai via. Con il software, un po 'di lucidatura extra paga sempre . (A meno che nessuno finisca per usare il codice ....)

Per riassumere: controlla i consigli reali forniti nelle altre risposte, quindi riscrivi il codice fino a ottenere qualcosa che ti piace.


Quindi la tua risposta è fondamentalmente "leggi le altre risposte e fai codice pulito o te ne pentirai" ...
kaoD

@kaoD: Sì. Ma anche: il tuo primo tentativo di codifica sarà probabilmente spazzatura. (In caso contrario, non ti stai spingendo abbastanza forte.) Ci vorrà molto duro lavoro per metterlo insieme, insieme a un po 'di ricerca e un sacco di pensiero. Questo è normale quando si scrive un programma coinvolto. Tutti gli sforzi spesi in questo modo consentiranno di risparmiare tempo, fatica e dolore a lungo termine (se il programma è ancora lì a lungo termine). E anche: OOP aiuta alla grande se riesci a capire. (Il meglio che posso fare senza vedere il codice.)
RalphChapin,

4
Ti rendi conto che NON stai effettivamente rispondendo alla domanda?
Kaao

In realtà, indipendentemente dal fatto che il post di Ralph fosse tecnicamente una risposta o meno, penso che la risposta di Ralph abbia parlato in primo luogo del motivo del PO. Credo che abbia molto valore per un programmatore che non ha capito che è raro progettare il codice al primo tentativo. Inoltre, ha offerto un approccio per affrontarlo che sembrava essere nato dall'esperienza di Ralph.
Steve H,

@SteveH Penso che la sua risposta sia applicabile a quasi tutti i processi di ingegneria del software. Potresti copiarlo e incollarlo ovunque e si adatterebbe.
Kaao
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.