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.
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% 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.
... erzeugt:
%Vor%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%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.
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%Hier ist eine Lösung, die auf der Berechnung eines Index in einem kartesischen Produkt basiert:
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.
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%Tags und Links java