Come consentire agli utenti di specificare le proprie condizioni logiche?

1

Sto lavorando a un progetto JEE, ecco la situazione:

Ho un'applicazione che mette il concetto finanziario di maker / checker. Il produttore sceglie un'operazione e può modificarne i valori, ma il controllore dovrebbe approvare queste modifiche in modo che possano essere registrate. Il problema è che alcune operazioni hanno determinate condizioni impostate che obbligano a scegliere un determinato controllore queste condizioni possono cambiare a seconda del produttore. Come posso prendere in considerazione nel mio codice Java queste condizioni senza sapere nulla su di loro solo che sono un input nell'applicazione?

Metti semplicemente come codificare le condizioni fatte da un utente esterno?

Esempio:

  • Operazione: condizioni di credito:

    if(card.equals("normal")) credit = 500 ;

    il produttore potrebbe voler aggiungere un'altra condizione dicendo che il credito = 500 quando abbiamo una carta normale e l'utente ha meno di 20 anni. Quindi il produttore sta cambiando la condizione ma non ha l'accesso all'applicazione, tuttavia l'applicazione dovrebbe prendere in considerazione questo cambiamento, qualcuno ha qualche idea su come implementarlo?

posta Ilyasse 28.02.2017 - 16:25
fonte

1 risposta

2

Questa attività può essere visualizzata come 3 attività secondarie differenti. È necessario definire come devono essere specificate le condizioni. Hai bisogno di una rappresentazione delle condizioni. E devi integrarlo nel programma.

Come specificare le condizioni

A meno che tu non sia in grado di programmare, sembra che tu abbia bisogno di un DSL (lingua specifica per il dominio). Se gli sviluppatori scrivono o aiutano gli esperti di dominio a scrivere, le condizioni e le azioni, qui definite "regole", possono essere probabilmente eseguite con una versione testuale. Un'opzione, se si usano linguaggi di scripting, è di fare effettivamente le regole in quella lingua con un po 'di zucchero sintattico. Ma dal momento che usi Java, dovrai compilarlo. Ad esempio, il linguaggio potrebbe essere simile a questo:

IF card = normal AND years < 20 THEN set credit = 500

Il frammento di cui sopra ha un sacco di contesto. Se puoi evitare di essere ambiguo, allora questo può rendere la lingua molto più semplice. Per esempio, di chi "anni" stiamo parlando prima? Bene, se le regole vengono valutate nel contesto di una carta, allora è il proprietario della carta. Ma se non è chiaro, la lingua potrebbe dover essere più complicata, ad es. 'anni (proprietario (carta))', e potresti iniziare a spaventare gli utenti normali con le parate.

Se non sono gli sviluppatori che scrivono le condizioni, dovresti prendere in seria considerazione uno strumento grafico intorno alla tua lingua. Lo strumento grafico può limitare le opzioni, per evitare errori di ortografia, ad esempio, e guidare gli utenti alle opzioni disponibili.

Modello semantico

Avere qualche modello formale di linguaggio. Questo potrebbe essere un albero di sintassi astratto per le espressioni. E la radice è un nodo con due figli, un nodo di condizione e un nodo di azione. Quindi, per valutare le regole per alcuni contesti, trovi tutte le regole definite dall'utente, valutale usando l'albero di sintassi astratto e la condizione è vera, quindi esegui l'azione. Potresti anche interpretare le regole per gestire i conflitti. Ad esempio, cosa succede se c'è un'altra regola che dice "se la carta è normale e l'età dell'utente inferiore a 15 allora imposta il credito a 300"? Ora si applicano entrambe le regole, ma se ciò non è desiderabile, è possibile informare l'utente. Attenzione, tuttavia se il tuo linguaggio è troppo potente, questo può essere indecidibile, il che significa che non puoi rilevare tutti questi conflitti.

Il frammento di cui sopra potrebbe risultare in una struttura sintattica astratta come la seguente:

                  ________________RULE____
                 /                        \
               AND                     ACTIONS
        ______/   \______                 |
       /                 \              _SET_
    _ = _              _ < _           /     \
   /     \            /     \      credit    500
card    normal      age     20

Interprete

Devi implementare un interprete o il tuo modello semantico. Questo eseguirà il modello contro i dati che hai. Ad esempio, utilizzare i dati correnti nel sistema, per verificare le condizioni descritte dal modello semantico, quindi eseguire le azioni appropriate che aggiornano i dati.

Ad esempio lo pseudocodice per elaborare il setNode potrebbe essere simile a questo:

onVisitSet(SetNode setNode, CardContext context) {
    if (setNode.assignType == CARD) {
        Account account = context.getAccountForCard();
        account.setBalance(500);
    } else if (...)
    //....
}

Ricorda, anche se le banche reali non si limitano a "stabilire" un equilibrio.

    
risposta data 28.02.2017 - 17:10
fonte

Leggi altre domande sui tag