Reduzierung der zyklomatischen Komplexität einer Java-Methode

8

Ich habe die folgende Methode:

%Vor%

12 weitere if-Anweisungen werden in ähnlicher Weise verwendet. Der einzige Unterschied ist ein anderer Setter-Methodenname und ein anderer Parameter. Jetzt, da das gleiche Muster immer wieder wiederholt wird, gibt es eine Möglichkeit, die Komplexität des Codes zu reduzieren?

    
Akeshwar Jha 22.10.2015, 15:09
quelle

6 Antworten

2

Nicht einfach und nicht ohne Reflektion.

Mit Reflection können Sie die Werteliste durchlaufen und die entsprechende Methode im Client-Objekt aufrufen. Das würde die Komplexität beseitigen und sauberer / robuster sein. Allerdings würde es auch langsamer funktionieren.

Grundsätzlich, obwohl Sie den Fall haben, wo Sie fast, aber nicht ganz die gleiche Operation immer und immer wieder tun, das ist immer schwierig.

    
Tim B 22.10.2015 15:11
quelle
1

Sie können dies mit Java 8-Funktionsschnittstellen tun. Es wird zumindest die wiederholten bedingten Anweisungen loswerden.

%Vor%     
ThatOneCloud 22.10.2015 15:28
quelle
1

Nicht sicher, ob dies tatsächlich die zyklomatische Komplexität reduziert, aber es macht den Code hübscher. Dies ist mit Java 8 einfacher.

%Vor%

Wenn Sie möchten, können Sie Map<String, Consumer<?>> eingeben, um wiederholte Anrufe zu vermeiden.

    
Eric Galluzzo 22.10.2015 15:35
quelle
0

Angenommen, die Felder von Client können auf null gesetzt werden, wenn die Karte keine Eigenschaft enthält, können Sie eine Klasse erstellen:

%Vor%

Und dann

%Vor%

Wenn es jedoch erforderlich ist, die Felder von Client so zu belassen, wie sie sind, wenn es keinen entsprechenden Schlüssel in der Karte gibt, hilft Ihnen das nicht.

    
biziclop 22.10.2015 15:26
quelle
0

Ich würde ein enum verwenden, um den Setter mit dem Schlüssel der Karte zu verbinden, indem ich name().toLowercase() als Schlüssel verwende.

%Vor%     
OldCurmudgeon 22.10.2015 15:24
quelle
0

Nur als Übung zum Beantworten der OP-Frage würde ich ein Map erstellen, das die Eigenschaften einer Setter-Schnittstelle zuordnet:

%Vor%

Iteriere über die verfügbaren Eigenschaften und rufe die set -Methode für jede in der setters -Karte verfügbare Karte auf:

%Vor%

PS: Offensichtlich wird dies nicht für den Produktionscode vorgeschlagen. Das Kopieren aller Elemente einer Sammlung in eine Liste zum Überschneiden der beiden Mengen - um Bedingungen im getesteten / geschriebenen Code zu verhindern - ist ziemlich teuer.

    
bhlangonijr 18.09.2016 02:08
quelle