2013-05-07 15 views
11

Ich arbeite an einer Klasse, die ein RequestDTO an einen Webdienst sendet. Ich muss die Anfrage validieren, bevor sie gesendet wird.Wie kann die zyklomatische Komplexität reduziert werden?

Die Anfrage kann von 3 verschiedenen Orten gesendet werden und es gibt verschiedene Validierungsregeln für jeden "Anfragetyp", z. request1 muss name und phonenumber haben, request2 muss adresse haben, etc)

Ich habe eine DTO, die eine lange Liste von Feldern (Name, Adresse, Stadt, Telefonnummer, etc.) enthält und es ist die gleiche DTO gesendet egal welche Art von Anfrage ist es?

Ich habe 3 verschiedene Validierungsmethoden erstellt und basierend auf dem Typ die entsprechende Methode aufgerufen.

In jeder dieser Methoden habe ich eine lange Liste von if-else, um nach den Feldern zu suchen, die für jeden Anforderungstyp erforderlich sind.

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() prüft die Zeichenfolge für null und isEmpty() und gibt einen Booleschen

Das gibt mir eine zyklomatische Komplexität von 28 in einer dieser Methoden so meine Frage .. ist es möglich, diese Komplexität zu reduzieren? - Wenn ja, wie würde ich dies tun?

Letztlich muss ich eine Menge Felder überprüfen, und ich kann nicht sehen, wie dies ohne viele Kontrollen durchgeführt werden kann:/

+1

Meine Idee wäre: Verwenden Sie eine Art von 'FieldChecker'-Objekt, das die Leere (oder eine andere) Prüfung einkapselt, und die Aktion (' sb.append() ') etc, und Schleife über eine Liste von solche Objekte. Dies macht den Code klarer, da Sie die Ausgaben und Eingaben dieser Prüfung explizit definieren müssen. – millimoose

Antwort

22

Eine einfache Möglichkeit ist die Prüfung in einem separaten Verfahren zu fördern:

private String getAppendString(String value, String appendString) { 
    if (value == null || value.isEmpty()) { 
     return ""; 
    } 
    return appendString; 
} 
anstelle der if Blöcke

Und dann können Sie diese Methode verwenden:

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

Diese Komplexität reduzieren wird vom 28. bis 3. Denken Sie immer daran: hohe Komplexität coun ts sind ein Hinweis darauf, dass eine Methode zu viel versucht. Komplexität kann behandelt werden, indem das Problem in kleinere Teile unterteilt wird, wie wir es hier getan haben.

1

Ein anderer Ansatz wäre, diesen Vertrag im Request-Objekt selbst durchzusetzen. Wenn ein Feld erforderlich ist oder nicht null sein kann, sagen Sie dies, wenn die Anforderung erstellt wird.

Erstellen Sie die Anforderung so, dass sie 100% gültig ist und fertig ist, wenn der Konstruktor existiert.

Ich würde auch diese String-Version in der Request toString() -Methode erstellen. Es sollte wissen, wie es sich rendert.

Verwandte Themen