Un'alternativa all'inclusione di una logica decisionale complessa direttamente nel codice è creare una struttura dati personalizzata che rappresenti la complessa serie / raccolta di decisioni e / o stati che potresti altrimenti collegare al tuo codice.
Questa tecnica è talvolta nota come Programmazione basata su regole , che ha qualche associazione con forme deboli di IA, dove le strutture che incapsulano la tua logica / le decisioni sono conosciute come "Regole" .
La logica per fare questo è che le strutture di dati sono dichiarative piuttosto che procedurali; a volte è molto più facile (e più espressivo / idiomatico) rappresentare decisioni complesse in una struttura di dati dichiarativa piuttosto che rappresentare quelle stesse decisioni nel codice procedurale.
Usando alcune delle regole di un scacchi secondo la tua domanda; considera una struttura basata su XML per i diversi tipi di schemi di movimento consentiti per pezzi diversi:
<ChessPieceMoves>
<Piece type="Rook">
<Moves capture="true" move="true">
<CanMove pattern="Horizontal" />
<CanMove pattern="Vertical" />
</Moves>
</Piece>
<Piece type="King">
<Moves capture="true" move="true">
<CanMove pattern="Horizontal" rangeLimit="1" />
<CanMove pattern="Vertical" rangeLimit="1" />
<CanMove pattern="ForwardDiagonal" rangeLimit="1" />
<CanMove pattern="BackwardDiagonal" rangeLimit="1" />
</Moves>
<Moves capture="false" move="true">
<CanMove pattern="Castle" firstMoveOnly="true" />
</Moves>
</Piece>
<Piece type="Pawn">
<Moves capture="true" move="false">
<CanMove pattern="ForwardDiagonal" rangeLimit="1" />
</Moves>
<Moves capture="false" move="true">
<CanMove pattern="Forward" firstMoveOnly="true" rangeLimit="2" />
<CanMove pattern="Forward" rangeLimit="1" />
</Moves>
</Piece>
</ChessPieceMoves>
(Nota: quanto sopra può o non può essere una buona struttura per le mosse di scacchi, ho passato meno di 5 minuti a pensarci su).
Ovviamente, devi scrivere il codice che associa quelle "regole" nel tuo codice (cioè il codice che legge l'XML e rappresenta il codice procedurale per ogni comportamento / decisione differente in quei dati ); e questo non è necessariamente un compito banale (anche se qualcosa come XmlSerializer
di C # lo rende molto più semplice). Il codice di associazione dovrebbe essere significativamente meno complesso della logica per incorporare quelle decisioni / regole in codice procedurale.
Inoltre, esistono linguaggi di dichiarazioni dichiarative esistenti e vari tipi di motori di regole già esistenti; quindi potresti scegliere di imparare un linguaggio logico come Prolog .
Se la logica del codice finisce per essere più complessa, allora la struttura dei dati è probabilmente cattiva e richiede un ripensamento; è probabile che avrebbe bisogno di più informazioni (elementi / attributi) per coprire tutte le diverse mosse possibili negli scacchi, e probabilmente avrebbe bisogno anche di una ristrutturazione.