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.
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)
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
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 .
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
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.
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.
Tags und Links java sonarqube formatting