Verringerung der kognitiven Komplexität des kartesischen Sechs-Wege-Produkts

8

Ich habe ein Stück Code, das Cognitive Complexity von 21

hat %Vor%

Unser Linter gibt eine maximale kognitive Komplexität von 15 an, also sollte ich dies nach den Standards, denen wir gefolgt sind, reduzieren.

Kann jemand eine alternative Lösung für diesen Code vorschlagen? Oder lässt es das trotz der zu hohen Komplexität akzeptabel?

Ich weiß, dass dies eine persönliche Meinung sein könnte, aber ich suche nach echten Lösungen oder Antworten von Leuten, die vorher ähnliche Situationen hatten.

EDIT: Ich kann nicht viele Bibliotheken und Pakete von dem Dev-Rechner, an dem ich gerade arbeite, aufrufen. Ich habe Zugriff auf einige (zu viele, um sie aufzulisten), also bitte beachten Sie dies, bevor Sie einen vorschlagen.

    
Josh Gordon 24.01.2018, 14:54
quelle

6 Antworten

3

Sie können eine rekursive Lösung wählen. Es ist wohl weniger lesbar, hat aber eine viel kleinere Verschachtelungstiefe, was das Komplexitätsmaß reduziert:

%Vor%

Der erste Aufruf sieht so aus:

%Vor%     
dasblinkenlight 24.01.2018 14:58
quelle
2

Google Guava Lösung

Sobald Ihre Daten in List<List<String>> gepackt sind, können Sie das n-ary kartesische Produkt verwenden, um die in Google Guava implementierte Reihenfolge der Elemente (lexikografisch) beizubehalten.

%Vor%

... erzeugt:

%Vor%

Reine Java-Halblösung

Hier ist eine schnelle Lösung mit fest codierten Werten für 3 Listen, die möglicherweise verallgemeinert werden könnten, ohne zu viel Komplexität zu verursachen. Es macht im Grunde einige ordentliche (aka schwer zu folgen ) Indexberechnungen.

%Vor%

Messdiskussion

Die pure Java-Lösung ist ein perfektes Beispiel dafür, dass wir, um die Metrik zufriedenzustellen, die Komplexität und Wartbarkeit tatsächlich erhöht haben.

Diese ganze Indexberechnung ist ziemlich schrecklich und hat nur wenige Versuche in Anspruch genommen. Es wird wahrscheinlich sowieso eine Strafe in der allgemeinen Lösung kosten, da Iteration erforderlich sein wird. Andere Lösungen, die ich im Web gefunden habe (einschließlich rekursiv und funktional) sind nicht klarer als die Menge der verschachtelten Schleifen.

Hier erfunden Kartesische Produktroutinen werden IMO komplexer (auch wenn sie geringere Komplexität aufweisen) zu verstehen sein.

Software muss auf Abstraktionen aufbauen, und die Verwendung einer offenen, gut gestalteten Abhängigkeit von Drittanbietern lässt das ganze Problem gut verschwinden.

    
diginoise 24.01.2018 16:01
quelle
2

Hier ist eine Iterator-basierte Lösung.

%Vor% Mit

können Sie Cross-Produkte nach Bedarf erstellen

%Vor%

jetzt mit dualer Iterable / Iterator-Schnittstelle kann alternativ als

verwendet werden %Vor%     
karakfa 24.01.2018 19:01
quelle
0

Ich wollte meinen Kommentar mit einem funktionierenden Code weiterverfolgen. Ich erkannte dann, dass die rekursiven Teile sehr ähnlich wie @dasblinkenlight sind (ich versichere Ihnen, dass das nicht beabsichtigt ist), also zögere ich, dies zu veröffentlichen (nur auf sein). Dies ist jedoch etwas generischer. Ich rufe @dasblinkenlight auf.

%Vor%

Produziert:

%Vor%     
Ian Mc 24.01.2018 17:07
quelle
0

Hier ist eine Lösung, die auf der Berechnung eines Index in einem kartesischen Produkt basiert:

  • Berechnen Sie die Größe jedes Unterraums, indem Sie die Größe des nächsten Unterraums mit der Größe des aktuellen Vektors multiplizieren; Die Größe eines "Punktraums" ist 1.
  • Iterate über alle Indizes im Space. Der Index im Raum i kann berechnet werden, indem man durch die Größe des Unterraums dividiert und das Ergebnis mit der Größe des Vektors modifiziert.

Hier ist eine Implementierung:

%Vor%

Diese Lösung ist ziemlich "flach", aber es erfordert eine Menge quantitativer Fähigkeiten, um sie zu verstehen.

Demo.

    
dasblinkenlight 24.01.2018 17:58
quelle
-1

Ich befürworte diesen Ansatz nicht, aber ich denke, er würde (a) die Warnung unterdrücken und (b) könnte Ihnen einen Weg geben, darüber nachzudenken, wie Sie den Code ausreißen können, damit er sinnvoller wird. Ich finde das nicht klarer oder lesbarer als das Original, aber abhängig davon, was alle Begriffe in Ihrem Kontext bedeuten, könnte es nützliche neue Richtungen vorschlagen.

%Vor%     
Carl Manaster 24.01.2018 16:13
quelle

Tags und Links