classi riutilizzabili di condizione / espressione
-
08-07-2019 - |
Domanda
In diverse occasioni ho avuto bisogno di alcune classi per rappresentare e manipolare le condizioni (in genere in un'interfaccia utente in modo che l'utente costruisca una query combinando diversi tipi di condizioni e quindi il codice può trasformarlo a seconda del sistema sottostante da interrogare, ad esempio lucene e un db). Ho cercato dappertutto un insieme riutilizzabile di classi, sono sicuro che questo deve essere usato in molti posti esistenti (tutti i linguaggi di espressione per cominciare) ma non sono riuscito a trovare nulla facilmente utilizzabile. Ho finito per programmare entrambe le volte da solo, ma mi sono sentito male per non riutilizzare qualcosa di cui sicuramente sono sicuro.
I bisogni tipici sono: - più operatori: e o ecc - numero variabile di operandi - combinare le condizioni per costruire espressioni - serializzazione di espressioni - analisi / formattazione di espressioni da / a stringhe
qualcuno ha trovato qualcosa del genere?
Soluzione
Dai un'occhiata a Apache Commons Functor . Per esempio. UnaryPredicate , UnaryAnd , UnaryOr , ecc. Il costruito -in implementazioni sono serializzabili, ma non so di analizzare dalle stringhe. Tuttavia, penso che sia un ottimo inizio per quello che vuoi. Inoltre, dai un'occhiata a questo tutorial IBM basato sul biblioteca.
Altri suggerimenti
Sembra che tu stia cercando Functors (aka oggetti funzione). In tal caso, questa SO question sarebbe pertinente, wRT. scelte: Commons functor (già menzionato) è un'alternativa ma ce ne sono anche altre.
Tutte le librerie di funzioni vengono fornite con il framework (che è abbastanza semplice; predicati binari unari, funzionalità di mapping per quelli, combinando per concatenamento) e set di funzioni di base più comunemente necessari.
Sembra che tu stia cercando qualcosa come Hibernate API criteri . Lo svantaggio è che si è collegati a un database o, peggio ancora, a una specifica implementazione del framework di persistenza. Inoltre non copre tutti i requisiti, quindi non credo che questa sia una buona scelta ...
Potresti voler dare un'occhiata a ANTLR .