Modelli per la convalida di alberi con condizioni complesse?

2

Devo scrivere funzioni di convalida API in cui le regole possono diventare pelose e avere molti output in base al ramo preso.

Queste funzioni di convalida finiscono qua e là ad annidare molte condizioni IF (cerco di attenermi alla semplice condizione IF per semplicità), dove ho molti commenti per aiutare cosa sta succedendo, ma è un grosso spaghetto.

Inoltre, mentre convalido, faccio piccoli passi verso la costruzione dell'oggetto / risultato a cui sono interessato, quindi ho due problemi con questo codice:

  • È un enorme spaghetti con molti rami di uscita, che ... riflette la complicata situazione della vita reale.

  • La convalida e la costruzione dei risultati avvengono insieme, difficile separare la convalida separatamente, perché se fatto, allora finisco con questo albero complesso due volte, una volta in una funzione di convalida e un'altra per costruire il mio risultato.

Ci sono strategie / schemi per cercare questi scenari?

PS: sto usando Python nel caso in cui qualsiasi libreria o pattern aiuti con quello.

    
posta Jj. 03.11.2017 - 02:26
fonte

2 risposte

1
  • Scrivi semplici funzioni booleane e combinale.

    bool ContainsUpperCase(string s) { }
    bool ContainsNumbers(string s) { }
    bool ContainsLowerCase(string s) { }
    bool ContainsSpecialCharacters(string s) { }
    bool IsValidPassword = ContainsUpperCase(password) && ContainsNumbers(password) ...etc
    
  • Utilizza l'uscita anticipata

    if (parameter == null) return (or throw);
    if (!IsValidPassword) return (or throw);
    
  • Utilizza valori predefiniti per evitare i controlli nulli

    int parameter = 0;
    
  • Riscrivi la logica in modo che richieda meno condizioni.

  • Utilizza una libreria di convalida

  • Scrivi un motore di regole

.. etc

    
risposta data 03.11.2017 - 03:28
fonte
-2

Ecco alcuni snippet come suggerimento.

class MyComplexObject:
    def __init__(self):
        #lots of properties in your complex object


def build_complex_result(complex_input):

    complex_object = MyComplexObject()

    #Validate person info
    assert(complex_input.age > 10 \
           and complex_input.age < 50 \
           and 'brazil' not in complex_input.country)

    add_person_info(complex_object, complex_input)

    #Validating address
    assert(complex_input.address is not None) #...and lots of other conditions...

    add_address_info(complex_object, complex_input)

    #... and so on ...
    #Also, you could place these assertions and 'add_xxxx_info' to other classes
    #if necessary
    return complex_object
    
risposta data 03.11.2017 - 13:00
fonte

Leggi altre domande sui tag