Attenzione, Javascript è disabilitato! Il sito funziona meglio se è attivo!

Il logo di Imagine Software

Boolli: interprete di espressioni booleane

Implementare sistemi di regole

Boolli è un interprete di espressioni booleane open-source scritto in C# e disponibile come libreria su NuGet.

Cosa può fare Boolli? Rispondere true o false data un'espressione booleana!

Per Boolli, un'espressione booleana è una stringa generata secondo questa grammatica EBNF:

Come software Boolli è composto da tre moduli:

  • Un lexer
  • Un parser
  • Un interprete

...e la struttura dati alla base del suo funzionamento è l'Abstract Syntax Tree.

Perché Boolli può esserti utile?

  • A scopo didattico: per capire come funziona un semplice interprete. Noi informatici li diamo per scontati, ma sono molto interessanti!
  • Se sostituisci, via codice, i token booleani con delle Func<bool> (o anche delle Func<Task<bool>>). Uno use case è quello di definire un semplice sistema di regole.

Esempi pratici

Proviamolo insieme!

Valutare un'espressione booleana

...puoi anche usare 0 al posto di false
e 1 al posto di true

Valutare un'espressione di Func<bool>

...anche in versione async,
con un'espressione di Func<Task<bool>>

Scenario reale

Un semplice generatore di alert basato su regole

Ho sviluppato un semplicissimo scenario a scopo dimostrativo (se vuoi lo puoi migliorare tramite GitHub, fa sempre piacere!): un sistema di creazione di alert basato su regole configurabili interpretate da Boolli

Qui su GitHub puoi trovare il codice sorgente dell'esempio specifico che sto per approfondire.

L'idea è quella di generare degli alert testuali basati su dati di monitoraggio hardware, come ad esempio la percentuali di CPU utilizzata in un dato momento. Ogni alert è generato da una regola che può essere scritta come una stringa - e quindi configurabile anche da una GUI - come ad esempio: CPUPercentage and UsedRAMGigaBytes.

In questo caso CPUPercentage è una funzione booleana che valuta la percentuale di CPU di un dato record secondo una soglia. Ad esempio può ritornare true se il valore supera il 90%.

Per completare l'esempio, ho cercato di immaginare uno scenario il più possibile reale. Abbiamo bisogno di questi elementi per far funzionare tutto:

  • Una lista di regole (Rules)
  • Dei dati di monitoraggio (MonitoringData) che in questo caso ho generato casualmente con FakeMonitoringDataRepository
  • Un generatore di alert che utilizzi un interprete di espressioni booleane (Boolli)

L'anatomia di una regola

Le property salienti sono:

  • BooleanExpression: con questa property specifichi un'espressione booleana che deve essere parsata ed eseguita da Boolli utilizzando i nomi di funzione specificati in DataEvaluationFunctionDescription
  • MessageFormat: per comporre il messaggio testuale di alert utilizzando come parametri l'output delle funzioni di valutazione dei record
In questo esempio specifico ho definito la classe DataEvaluationFunctionDescription con lo scopo di parametrizzare ogni tipo di metrica da valutare e la sua soglia specifica.

Il generatore di alert

Questa è la parte più complessa di questo esempio, perché qui si mette tutto insieme: le regole, Boolli e i dati di monitoraggio.

In questo frangente c'è un ciclo che valuta ogni regola ed il punto di giunzione con Boolli è proprio qui: le DataEvaluationFunctionDescription diventano NamedBooleanFunction per poter essere utilizzate dalla libreria.

La funzione concreta dietro le quinte

Dopo aver letto tutto questo potrete pensare: ok, ma chi è che materialmente valuta quando i dati di monitoraggio devono generare un alert oppure no?

Il codice sopra è l'If sostanziale che sta alla base di tutto.

Contribuire

Il mondo dell'open source è meraviglioso proprio perché ognuno può dare il proprio contributo ed aiutare chissà chi nel mondo!

Il codice di Boolli è interamente open source su GitHub ed è aperta alla collaborazione da parte di tutti!