fügt automatisch alle geschweiften Klammern zu if / else / for / while usw. in einer Java-Codebasis hinzu

8

Ich möchte die Anzahl der Sonarverletzungen in einer großen Legacy-Java-Codebasis reduzieren, und es scheint ein "schneller Gewinn" zu sein, alle diese bedingten Anweisungen auf geschweifte Klammern zu setzen. Dies scheint eine einfache Sache zu sein und ich kann nicht verstehen, warum es nicht einfach automatisierbar wäre.

Kennt jemand ein Werkzeug, das eine Massenoperation so durchführen könnte? Oder warum so etwas zu tun, ist vielleicht eine schlechte Idee, bevor ich die Zeit damit verbringe, selbst etwas zu schreiben? Wenn ich selbst einen schreiben würde, welche wären die besten Werkzeuge? Im Idealfall etwas, das Java-Sprache bewusst ist, so dass ich mich nicht mit der Formatierung von Ecken und dergleichen beschäftigen muss.

Die Regel ist übrigens nicht verhandelbar, also ist dies wirklich der beste Ansatz.

    
robert 11.11.2012, 22:46
quelle

7 Antworten

7

Am einfachsten wäre es, Eclipse zu verwenden und im gesamten Projekt auf Clean-up zu klicken. In Clean-up Profilkonfiguration wählen Sie Code style tab. Dort können Sie Use blocks in if/while/for/do statements als Always auswählen.

    
ShyJ 11.11.2012, 22:50
quelle
11

Aktivieren Sie zuerst Control flow statement without braces in den Inspektionseinstellungen.

IntelliJ Idee - & gt; Code-Inspektion ausführen - & gt; Quick Fix (funktioniert mindestens in der kommerziellen Version)

    
Christian Kuetbach 11.11.2012 22:55
quelle
3

Obwohl es ratsam ist, mit Legacy-Code vorsichtig zu sein, ist es auch eine gute Sache, Bugs in Legacy-Code zu entdecken ... oder zumindest die Bugs leichter zu erkennen.

Betrachten wir Brian Agnews schwierige Fälle:

%Vor%

Was den JLS und den Java-Compiler angeht, bedeutet dies

%Vor%

Wenn also der Transformator den Code neu schreibt:

%Vor%

Es ändert nicht die Bedeutung des Codes, aber es korrigiert ein Problem, das dazu führt, dass jemand den Code falsch liest und einen potenziellen Fehler das ist schon im Code ; d. h. wenn der zweite Anruf bedingt sein soll ...

%Vor%

Noch einmal, wenn das neu geschrieben wird, sollten Sie erhalten:

%Vor%

bedeutet dasselbe wie das Original. Darüber hinaus spiegelt dies höchstwahrscheinlich die Absicht des Programmierers wider ... ob der Einrückung zu glauben ist. Aber bedenke das:

%Vor%

Wenn wir das als

umschreiben %Vor%

Die tatsächliche Bedeutung des Codes ändert sich nicht, und der falsche Einzug wird nicht mehr in die Irre führen. Wenn der Programmierer entscheidet, den ersten Anruf auskommentieren, erkennt er möglicherweise nicht, dass das vorherige Auskommentieren eine unbeabsichtigte Konsequenz hatte. (Der Beweis war in der ursprünglichen Einrückung, die wir "fixiert" haben.) Aber es gibt eine mögliche Lösung; siehe unten.

Wenn wir davon ausgehen, dass das Code-Transformationstool mit einem korrekten Verständnis der Syntax und Semantik von Java arbeitet, dann wird es nichts brechen, was nicht bereits gebrochen wurde, und es wird (bis zu einem gewissen Grad) eine vorhandene Zerbrochenheit mehr machen offensichtlich für jemanden, der den Code liest. Für mich ist das ein Null-Risiko-Gewinn, sogar für Legacy-Code.

Wenn wir jetzt den Transformator schlauer machen, könnte er erkennen einige der Fälle, in denen die ursprüngliche Einrückung auf einen möglichen Fehler hinweist (wie die Fälle # 1 und # 2a oben) und sie für eine genauere Code-Prüfung kennzeichnen .

    
Stephen C 12.11.2012 00:04
quelle
2

Das erscheint mir als potentiell ziemlich gefährlich. Verfügen Sie über eine umfassende Testabdeckung?

Ich kann einige sofort schwierige Fälle sehen, z. B.

%Vor%

und

%Vor%

sind zwei, die mir in den Sinn kommen und nicht gehandhabt werden können (Sie sollten sprachbewusst sein, um diese anzugehen). Ich würde nicht versuchen, eine solche Aufgabe zu automatisieren, es sei denn, Sie haben ein sprachbewusstes und zuverlässiges Werkzeug, sondern erzwingen eine Richtlinie, die Sie Code ändern, wenn Sie es aus anderen Gründen ändern, und kann zu diesem Zeitpunkt die Codeabdeckung durch Komponententests bestätigen vor dem Ändern des Codes.

    
Brian Agnew 11.11.2012 22:51
quelle
2

Robert sagte in einem Kommentar: "@ira, ich wäre auch daran interessiert, von diesem wirklich sprachbewussten Werkzeug zu hören!"

Entschuldigung für die Neckerei. Für die Ursache der Neckerei, überprüfen Sie meine Bio.

Untease: Siehe Ссылка als Basis-Engine und Ссылка . Das Paar macht ein vollständig sprachbewusstes Source-to-Source-Programmprogramm-Transformationssystem.

Man würde diese Aufgabe mit DMS mit zwei Quell-zu-Quell-Transformationsregeln erledigen:

%Vor%

Dies funktioniert zuverlässig, weil DMS vollständig von einer formalen Grammatik gesteuert wird (in diesem Fall für Java) und nicht mit Rohtext arbeitet, sondern mit abstrakten Syntaxbäumen; Dies macht auch unabhängig vom Layout. (Es ist wahrscheinlich nützlich, die Regeln zu verstehen, dass "Blockieren", "Ausdruck" und "Aussage" nichtterminale Grammatik sind.

    
Ira Baxter 12.11.2012 13:56
quelle
1

Während es ein schneller Sonar-Gewinn sein kann, machst du einige gefährliche Sachen. Der empfohlene Ansatz besteht darin, nur Legacy-Code zu reparieren, wenn dieser Code erneut aufgerufen werden muss. Diese pauschalen Ansätze werden möglicherweise sehr subtile Fehler verursachen. Da sich die Richtlinien geändert haben, muss Ihr Management-Team verstehen, dass dies ein gewaltiges Unterfangen ist und garantieren sollte, dass der gesamte zukünftige Code dem Standard entspricht.

    
Woot4Moo 11.11.2012 22:53
quelle
0

Intellij 2017 unterstützt dies mit Reformat Code , wenn Sie zuerst den richtigen Codierungsstil in den Editor-Einstellungen festlegen.

%Vor%

    
Marcus 04.08.2017 13:45
quelle

Tags und Links