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?
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.
Sie können dies mit Java 8-Funktionsschnittstellen tun. Es wird zumindest die wiederholten bedingten Anweisungen loswerden.
%Vor%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.
Angenommen, die Felder von Client
können auf null
gesetzt werden, wenn die Karte keine Eigenschaft enthält, können Sie eine Klasse erstellen:
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.
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.
Nur als Übung zum Beantworten der OP-Frage würde ich ein Map
erstellen, das die Eigenschaften einer Setter-Schnittstelle zuordnet:
Iteriere über die verfügbaren Eigenschaften und rufe die set
-Methode für jede in der setters
-Karte verfügbare Karte auf:
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.
Tags und Links java sonarqube if-statement cyclomatic-complexity