2013-05-07 27 views
11

Sto lavorando a una classe che invia un RequestDTO a un servizio Web. Devo convalidare la richiesta prima che venga inviata.Come ridurre la complessità ciclomatica?

La richiesta può essere inviata da 3 diversi luoghi e ci sono diverse regole di convalida per ciascun "tipo di richiesta", ad es. request1 deve avere nome e numero di telefono, request2 deve avere indirizzo, ecc.)

Ho un DTO che contiene un lungo elenco di campi (nome, indirizzo, città, numero di telefono, ecc.) ed è lo stesso DTO inviato non importa che tipo di richiesta è.

Ho creato 3 diversi metodi di convalida e in base al tipo viene chiamato il metodo appropriato.

In ognuno di questi metodi ho una lunga lista di if-else per controllare i campi che sono necessari per ogni tipo di richiesta.

private void validateRequest1(Request request) { 
    StringBuilder sb = new StringBuilder(); 
    if (null == request) { 
     throw new IllegalArgumentException("Request is null"); 
    } 
    if (isFieldEmpty(request.getName())) { *see below 
     sb.append("name,")); 
    } 
    if (isFieldEmpty(request.getStreet())) { 
     sb.append("street,")); 
    } 
    ... 

isFieldEmpty() controlli la stringa per nulla e isEmpty() e restituisce un valore booleano

Questo mi dà una complessità ciclomatica di 28 in uno di quei metodi così la mia domanda è .. è possibile ridurre questa complessità? - se sì, come potrei fare?

In definitiva ho bisogno di controllare un sacco di campi e non riesco a vedere come questo può essere fatto senza un sacco di controlli:/

+1

La mia idea sarebbe: utilizzare una sorta di oggetto 'FieldChecker' che incapsula il vuoto (o qualche altro) controllo, e l'azione da intraprendere (' sb.append() ') ecc., E scorrere su un elenco di tali oggetti. Ciò rende il codice più chiaro poiché è necessario definire esplicitamente gli output e gli input di tale controllo. – millimoose

risposta

22

Un modo semplice è quello di promuovere l'assegno in un metodo separato:

private String getAppendString(String value, String appendString) { 
    if (value == null || value.isEmpty()) { 
     return ""; 
    } 
    return appendString; 
} 

E quindi è possibile utilizzare questo metodo al posto dei blocchi if:

sb.append(getAppendString(request.getStreet(), "street,"); 

Ciò consentirà di ridurre la complessità da 28 fino a 3. ricordate sempre: coun alta complessità Queste sono un'indicazione che un metodo sta cercando di fare troppo. La complessità può essere affrontata dividendo il problema in parti più piccole, come abbiamo fatto qui.

1

Un altro approccio sarebbe quello di far rispettare tale contratto nell'oggetto Richiesta stesso. Se un campo è richiesto o non può essere nullo, dì di si quando viene creata la richiesta.

Creare la richiesta in modo che sia valida al 100% e pronta per andare quando il costruttore esiste.

Vorrei anche creare quella versione String nel metodo Request toString(). Dovrebbe sapere come renderizzarsi.

Problemi correlati