2016-05-05 10 views
2
autorisierten

ich unten Methode verwenden für null oder leer Feld Überprüfung:Die zyklomatische Komplexität dieser Methode ist, größer ist als

public boolean isVoNotNull(){ 
     return null != this.cardNo && StringUtils.isNotBlank(this.cardNo) 
       && null != this.otp && StringUtils.isNotBlank(this.otp) 
       && null != this.password && StringUtils.isNotBlank(this.password) 
       && null != this.userid && StringUtils.isNotBlank(this.userid) 
       && null != this.type && StringUtils.isNotBlank(this.type) 
       && null != this.walletMobileNo && StringUtils.isNotBlank(this.walletMobileNo); 
    } 

Aber unter Ausnahme erhalten, während dieser Code mit SonarLint Validierung ist

AUSNAHME : Die zyklomatische Komplexität dieser Methode "isVoNotNull" ist 12, die größer als 10 autorisiert ist.

Wie kann ich diese Ausnahme lösen oder wie kann ich die Komplexität aus dem Code entfernen?

+1

Wenn Sie 'StringUtils' von Apache verwenden, warum suchen Sie dort nach' null'? – Tom

Antwort

7

Sie müssen doppelten Code analysieren und ihn in ein Re-Refaktor umwandeln verwendbare Methode.

ursprünglichen Schnipsel gegeben,

public boolean isVoNotNull() { 
    return null != this.cardNo && StringUtils.isNotBlank(this.cardNo) 
     && null != this.otp && StringUtils.isNotBlank(this.otp) 
     && null != this.password && StringUtils.isNotBlank(this.password) 
     && null != this.userid && StringUtils.isNotBlank(this.userid) 
     && null != this.type && StringUtils.isNotBlank(this.type) 
     && null != this.walletMobileNo && StringUtils.isNotBlank(this.walletMobileNo); 
} 

wir die folgende sich wiederholende Teil identifizieren können:

null != this.xxx && StringUtils.isNotBlank(this.xxx) 

Da StringUtils#isNotBlank()already Kontrollen für null wir es weiter vereinfachen kann.

StringUtils.isNotBlank(this.xxx) 

Vorausgesetzt, dass Sie dies eine variable Anzahl von Zeiten aufrufen müssen, am besten wäre es ein Verfahren zum Umgestalten eines variable number of arguments nehmen, die sie alle in einer Schleife überprüft.

public static boolean isNoneBlank(String... strings) { 
    for (String string : strings) { 
     if (!StringUtils.isNotBlank(string)) { 
      return false; 
     } 
    } 
    return true; 
} 

Oder wenn Sie bereits auf Java 8 mit Streams and Lambda Unterstützung:

public static boolean isNoneBlank(String... strings) { 
    return Arrays.stream(strings).allMatch(StringUtils::isNotBlank); 
} 

Jetzt können Sie Gebrauch davon, wie unten machen:

public boolean isVoNotNull() { 
    return isNoneBlank(this.cardNo, this.otp, this.password, this.userid, this.type, this.walletMobileNo); 
} 

Sie weiter die vorformulierten verringern könnte durch Entfernen der unnötigen this.

public boolean isVoNotNull() { 
    return isNoneBlank(cardNo, otp, password, userid, type, walletMobileNo); 
} 

Dies alles war ein Gerät der Don't Repeat Yourself (DRY) Software-Engineering-Prinzip.

Das sagte, wie msandiford wies darauf hin, dass Apache Commons Lang StringUtils seit Version 3.2 already genau diese Methode hat. Wenn Sie es noch nicht haben, sollten Sie Apache Commons Lang auf mindestens 3.2 aktualisieren.

public boolean isVoNotNull() { 
    return StringUtils.isNoneBlank(cardNo, otp, password, userid, type, walletMobileNo); 
} 
+0

Beste Antwort für mich, es zeigt den Refactoring-Prozess, der viel wertvoller ist als das letzte korrekte Code-Snippet – GameDeveloper

1

Fügen Sie die Strings zu einem Array hinzu und überprüfen Sie mit einer Schleife auf Nichtigkeit und nicht auf Leerzeichen. Schlimmste Leistung natürlich, aber sollte diese nicht gespürte Grenze brechen.

Beispielcode:

public boolean isVoNotNull(){ 
    string [] stringsToCheck = new string[]{ 
    this.cardNo, 
    this.otp, 
    // ... 
    } 

    //return CheckStringArrayNotNull(stringsToCheck);   
    return StringUtils.isNoneBlank(stringsToCheck); 
} 

// high chance this method already exists inside StringUtils 
// INFACT FOUND! :) 
private boolean CheckStringArrayNotNull(string [] stringsToCheck){ 
    for(int i=0; i<stringsToCheck.length(); i++) 
     if(StringUtils.isNotBlank(stringsToCheck[i]) == false) 
      return false; 

    return true; 
} 

oder noch besser, (EDIT: scheint für diese Lösung mich rechtzeitig @msandiford zu schlagen)

public boolean isVoNotNull(){  
    return StringUtils.isNoneBlank(cardNo, otp, ...); 
} 

Sie natürlich in mehr Methoden brechen könnte zyklomatischen zu reduzieren Komplexität, aber das macht die Klasse noch schwerer zu lesen und zu verstehen. Code-Metriken sollten nur verwendet werden, um Probleme zu untersuchen, nicht als ein Entwicklungsmantra, zum Beispiel kann ich eine sehr dumme Klasse mit 100 Methoden mit einer zyklomatischen Komplexität von 100 nehmen und sie so umgestalten, dass sie perfekte Code-Metriken hat, aber unmöglich zu verstehen ist. Sehen Sie sich nie Code-Metriken an, denken Sie an gute Lösungen, ohne Codierungsmetriken zu verwenden.

0

StringUtils.isNotBlank

https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#isNotBlank%28java.lang.CharSequence%29

"Prüft, ob ein CharSequence nicht leer ist (" "), nicht null und nicht nur Leer."

überprüfen Die Funktion bereits, wenn das Objekt null ist, dann können Sie vereinfachen

public boolean isVoNotNull() { 
    return StringUtils.isNotBlank(this.cardNo) 
     && StringUtils.isNotBlank(this.otp) 
     && StringUtils.isNotBlank(this.password) 
     && StringUtils.isNotBlank(this.userid) 
     && StringUtils.isNotBlank(this.type) 
     && StringUtils.isNotBlank(this.walletMobileNo); 
} 

die Anzahl der bedingten Operatoren zu reduzieren, können Sie etwas tun können:

public boolean isVoNotNull(){ 
    Boolean[] condition = new Boolean[] { 
     StringUtils.isNotBlank(this.cardNo), 
     StringUtils.isNotBlank(this.otp), 
     StringUtils.isNotBlank(this.password), 
     StringUtils.isNotBlank(this.userid), 
     StringUtils.isNotBlank(this.type), 
     StringUtils.isNotBlank(this.walletMobileNo) 
    }; 
    return BooleanUtils.and(condition); 
} 

Vielleicht ist wenig schwierig, aber es funktioniert

3

Wie andere haben darauf hingewiesen, die null Überprüfung ist redundant wie isNotBlank überprüft dies auch.

Also, wenn Sie Apache StringUtils 3.2 oder höher verwenden, können Sie nur verwenden StringUtils.isNoneBlank(...)

public boolean isVoNotNull() { 
    return StringUtils.isNoneBlank(cardNo, otp, password, userid, type, walletMobileNo); 
} 

Wenn Sie eine frühere Version verwenden, könnte man leicht einen schreiben:

public static boolean isNoneBlank(CharSequence... seqs) { 
    for (CharSequence seq : seqs) { 
    if (StringUtils.isBlank(seq)) 
     return false; 
    } 
    return true; 
} 

Or in Java 8:

public static boolean isNoneBlank(CharSequence... seqs) { 
    return Stream.of(seqs).allMatch(StringUtils::isNotBlank); 
} 
Verwandte Themen