Ti suggerisco di provare ad andare via usando espressioni booleane reali e capire quali azioni o eventi stai facendo al "sistema" che stai sviluppando. Se stai usando le if-statement potresti anche usare un linguaggio di scripting.
C'era una volta ho creato un DSL in formato JSON che definiva le regole come azioni o eventi anziché utilizzare espressioni booleane. Ho scelto JSON perché il codice DSL è stato generato da un back-end Web e sarebbe stato utilizzato in un front-end web javascript.
Considera una serie di opzioni che un utente può utilizzare nell'interfaccia utente di un designer, tutte individualmente identificabili con un nome. L'interfaccia utente del designer per l'esempio seguente saranno le auto che l'utente può selezionare. In pratica, il DSL assomigliava a questo:
// an array of rules
"rules": [
// rule number 1
{
// the originating option of the event or action
"source": "car_1",
// the option(s) that receives of the action or event
"destination": ["color_yellow", "color_blue"],
// the event or action that should happen
// in this case the destination should be disabled
"action": "disable",
// what to roll back to if the destination was selected
"instead": "color_red"
},
// rule number 2, same as above but used to
// demonstrate chaining
{
"source": "roof_sunroof",
"destination": "color_red",
"action": "disable",
"instead": "color_green"
},
... and so on
]
In questo esempio, nella prima regola: se l'utente ha selezionato l'opzione "car_1", le opzioni di colore "color_yellow" e "color_blue" saranno disabilitate (perché quella particolare auto non è disponibile nei colori giallo e blu). Nella seconda regola, se l'utente seleziona "roof_sunroof", l'opzione di "color_red" è disabilitata.
Nel frattempo il front-end prende questo file JSON e crea tutte le opzioni sull'interfaccia utente e usa l'array di regole per determinare quali eventi configurare.
Le azioni e gli eventi sono stati implementati in modo tale da essere concatenabili con il set di regole, quindi se una sorgente si disabilitava e l'opzione di rollback era disabilitata, l'evento cercava invece cosa ripristinare. Nell'esempio sopra se è stata selezionata l'opzione "roof_sunroof" e quindi "car_1", l'applicazione prima tenterebbe di eseguire il rollback su "color_red" (che è disabilitato) e quindi su "color_green". Se ci fossero delle dipendenze circolari, molto probabilmente sarebbe un bug nella DSL piuttosto nell'interfaccia utente del designer. Nota che gli eventi applicano le regole senza la necessità di costruire un albero complesso.
Sul lato back-end, è più semplice rappresentare le regole come oggetti se sono definizioni per un DSL. Certo, se segui il percorso dell'istruzione if, puoi mantenere la regola come script di testo.