Vor- und Nachteile der erzwungenen Code-Neuformatierung

19

Ich arbeite derzeit an einem Ort, an dem Entwickler möglicherweise gezwungen werden, beim Einchecken in die Versionskontrolle einen automatisierten Code-Formatierer zu verwenden. Ich bin auf der Suche nach Meinungen von Entwicklern zu den Vor- und Nachteilen, die dies mit sich bringt. Wie würden Entwickler davon profitieren oder behindern? In meinem speziellen Fall geht es um Java / JSPs, aber ich denke, die Frage könnte für jede Sprache gelten.

Nerdfest
quelle
JSP automatisch neu formatieren? Dazu gehören HTML / XML-Code und eine Neuformatierung, die die resultierende Ausgabe sehr leicht unterbrechen / ändern kann.
edA-qa mort-ora-y

Antworten:

23

Ich denke, es ist sehr wichtig, dies zu tun. Hier ist der Grund:

  • Dadurch werden in Ihren Quellcodeverwaltungsdifferenzen nur die tatsächlichen Codeänderungen angezeigt , und "Diff-Rauschen" aufgrund von Leerzeichen und anderen unbedeutenden Formatierungsoptionen wird nahezu eliminiert
  • Dadurch wird der gesamte Code ähnlicher, sodass Entwickler die Codebasen bequemer koppeln und gemeinsam nutzen können

Wenn Sie das tun, würde ich jedem empfehlen, den gesamten Code einzuchecken, dann eine Person, die eine Neuformatierung über die gesamte Codebasis durchführt, und dann alles wieder eincheckt, damit es eine "riesige" Änderung für die Formatierung gibt (die jeder ignorieren kann), aber Danach sind alle Unterschiede echte Code-Unterschiede.

Wenn Sie es Stück für Stück tun, werden Sie echte Codeänderungen mit Formatierungsänderungen mischen und die Dinge werden im Änderungsland unnötig chaotisch.

Bohemien
quelle
1
Ich stimme zu, dass es wirklich der beste Weg ist, die Kugel vor einem globalen Wandel zu beißen. erledige es und niemand muss sich jemals wieder darum kümmern.
Patrick Hughes
... bis Sie Ihre Stilkonvention ändern.
Nerdfest
1
@Nerdfest Dann wenden Sie Ihre neue Konvention auf Ihr gesamtes Projekt in einem einzigen Commit an. Das ist keine große Sache.
Gizmo
2
Ihr "diff" -Tool ist zum Kotzen, wenn es mit Whitespace-Änderungen nicht richtig umgehen kann.
edA-qa mort-ora-y
2
Es wird immer Ausnahmen geben, bei denen ein etwas anderes Format wahrscheinlich sauberer ist als der vorgeschriebene Stil. Die automatische Konvertierung kann daher häufig die Absicht bestimmter Codeblöcke verbergen, was praktisch genauso gut ist wie das Hinzufügen eines Fehlers zum Code.
edA-qa mort-ora-y
10

Ich werde meine eigene Antwort hier werfen, da die Leute nur Vorteile hinzuzufügen scheinen. Was ich als Nachteile sehe, sind:

  • Eliminiert die Fähigkeit, "besser" als der Auto-Formatierer zu sein ... es macht Ihre sauberere Formatierung rückgängig. Ein Beispiel hierfür wären spaltenbasierte Parameterdeklarationen, Listen diskreter Hinzufügungen von Objekten usw.
  • Erzeugt einen Widerstand gegen das Ändern von Stilkonventionen, da diese nun große irreführende Diff-Änderungen erzeugen.
  • Entfernt die Möglichkeit, Sonderfälle zu formatieren, bei denen ein alternatives Format den Code besser lesbar macht.
  • Es bindet Sie an die Verwendung von IDEs, die genau die Neuformatierungsfunktionen unterstützen , die Sie benötigen. In einer anderen IDE fehlt eine der Optionen, die Sie benötigen, es wird zumindest einige Probleme verursachen.
  • Es wird problematisch, ein beschreibbares Code-Repository für eine externe Gruppe freizugeben, es sei denn, sie verwenden genau die gleichen Formatkonventionen wie Ihre Gruppe (dies wird in der Regel, jedoch nicht immer der Fall sein).
  • Es wird immer Ausnahmen geben, bei denen ein etwas anderes Format wahrscheinlich sauberer ist als der vorgeschriebene Stil. Die automatische Konvertierung kann daher häufig die Absicht bestimmter Codeblöcke verbergen, was praktisch genauso gut ist wie das Hinzufügen eines Fehlers zum Code.

Einfach ausgedrückt, ein nicht automatisierter Satz von Konventionen legt minimale Anforderungen an Stil und Lesbarkeit fest, wobei automatisierte Konventionen ein Minimum und ein Maximum festlegen.

Ich erinnere mich, dass ich mir VB (vielleicht Version 5) angeschaut habe und eines der nervigsten Dinge dabei war, dass es meinen Code gewaltsam neu formatierte und Dinge entfernte, die über seine grundlegende Formatierung hinausgingen.

Nerdfest
quelle
Eine Formierungskonvention gegenüber einer anderen bringt selten Vorteile, wenn dies auf Kosten der Konsistenz geht. Man gewöhnt sich daran. Befolgen Sie die Anweisungen von Bohemian und legen Sie eine Schonfrist fest, um die Formatierungsstile zu bestimmen. Das Ändern des Formats sollte sowieso nicht leicht genommen werden.
JeffO
3
@ Jeff, ich glaube nicht, dass er eine inkonsistente Code-Formatierung befürwortet, sondern eine konsistente Code-Formatierung, die schwer zu automatisieren ist. Beispielsweise legen viele Codierungsstile das ästhetische Ausrichten von Spalten fest, wenn mehrere Zeilen zusammengehöriger Daten vorhanden sind. Dies verbessert die Lesbarkeit erheblich, es ist jedoch sehr schwierig, Definitionen von "ästhetisch" oder "verwandt" zu automatisieren. Dies ist der Grund, warum einige Code-Formatierer unter bestimmten Umständen das Überschreiben der manuellen Formatierung zulassen.
Karl Bielefeldt
1
Es ist weitaus besser, 99,9% der Zeit ein konsistentes Format zu haben und sich mit dem einen oder anderen Teil abzufinden, den Sie persönlich nicht mögen, als sich mit einem undisziplinierten Missverhältnis abzufinden. Ich hänge wahrscheinlich davon ab, wie diszipliniert die Mannschaft ist, in der das Gleichgewicht liegt. Wenn Sie sich an die festgelegten Normen für eine Sprache halten, können alle anständigen Redakteure / IDEs auf diese Weise formatieren. Wenn Sie darauf bestehen, von den Normen abzuweichen, werden Sie Schwierigkeiten haben.
Mattnz
3

Ich finde, dass erzwungene Code-Formatierung großartig ist. Es ermöglicht einem Entwickler, den gesamten Code-Korpus zu durchlaufen, ohne dass seine Augen überall aufspringen. Auch wenn dieser Standard vorhanden ist, können unerfahrene Entwickler schlechte Gewohnheiten brechen.

Woot4Moo
quelle
3

Der Hauptnachteil ist der Verlust der benutzerdefinierten Formatierung, wenn es darauf ankommt.

Stellen Sie sich eine typische Überprüfung vor, wenn () fehlschlägt, wenn eine der spezifischen Bedingungen vorliegt, aber nicht erfüllt ist ...

  if(
      (user.id == TEST_ID)
    ||(
         (user.id == UserID)
       &&( 
             ( user.type == HUMAN_USER && user.name.size() >= MIN_NAME )
           ||( user.type == EMULATION && input.source != SOURCE_INTERNAL ))
       && ( user.email == NULL || emailValidator.isValid(user.email))
       && ( (user.phone == NULL) == (user.type == EMULATION) )

       // several more lines like this.)
    ){ /* handle results */ }

Dies ist dank vernünftiger Einrückung nach der logischen Struktur der Bedingungen lesbar.

Jetzt hat Ihr automatisiertes Tool keine Ahnung mehr über die logische Trennung verschiedener Bedingungen in verwandte Zeilen. Es sieht keinen Grund, warum jeweils 3-4 Bedingungen in einer Zeile zusammengefasst und die nächste Bedingung in zwei Hälften geteilt werden. Oder es wird aufgeteilt, ein Vergleichsausdruck pro Zeile. Es mag auf dem Bildschirm noch hübscher aussehen, aber die Logik geht verloren.

SF.
quelle
Das ist Chaos, mein Positronenhirn ist gerade geschmolzen. So viel Inkonsistenz mit Leerzeichen um (und). Genau deshalb brauchen wir Maschinen, um den Code zu formatieren. Und Sie können immer einen einzeiligen Kommentar vor / nach (abhängig von Ihrer Konvention) einfügen, um die Gruppierung von Bedingungen zu erzwingen. Es wäre auch hilfreich, dem Leser die Geschäftsregeln zu erklären, die hinter diesen Bedingungen stehen - direkt in diesen einzeiligen Kommentaren.
Stefan Oravec
@ ŠtefanOravec: Führen Sie dies durch einen Autoformatierer und wenden Sie diese Kommentare an. Sehen Sie, ob es besser lesbar ist. Testbenutzer - immer. Benutzer mit gültigen Benutzernamen. Emulierte Benutzer - nur externe Quellen. E-Mail, falls vorhanden, muss gültig sein. Benutzer müssen eine Telefonnummer haben. emuliert - muss nicht. Sehen Sie, wie Ihre einzeiligen Kommentare mit dem automatisch formatierten Code übereinstimmen.
SF.
2

Ich habe eine Antwort mit Nachteilen hinzugefügt, und ich werde auch das einbringen, was ich für einen großen Vorteil halte.

Wenn Sie beim Festschreiben eine automatisierte Code-Neuformatierung verwenden, besteht tatsächlich die Möglichkeit, dass die persönlichen Präferenzen variieren, ohne dass dies den üblichen Effekt hat, dass Ihre Präferenzen anderen zugefügt werden. Sie können Ihren IDE-Formatcode nach einem gemeinsamen Standard für das Festschreiben festlegen, ihn jedoch in Ihrem bevorzugten Format anzeigen, ohne andere zu beeinträchtigen.

Für mich ist dies fast der heilige Gral des konventionellen Codierens. Sie erhalten die Vorteile eines gemeinsamen Codeformats, können aber trotzdem persönliche Präferenzen ohne Konflikte unterstützen.

Nerdfest
quelle
0

Es hängt von Ihren Bedürfnissen ab, aber einige Einschränkungen sind sehr hilfreich, z. B. sollte hinter jedem if () eine geschweifte Klammer stehen, da es beim Refactoring recht einfach ist, ein solches wenn falsch zu verstehen.

Betrachten Sie diesen Fall:

if( x == 0 ) 
   return foo;
//do something else
return bar;

Wenn Sie jetzt etwas Protokollierung zum if-Fall hinzufügen möchten, schreiben Sie möglicherweise versehentlich:

if( x == 0 ) 
  log.info("x was 0");
  return foo;
//do something else
return bar;

Und plötzlich kehrt Ihre Methode immer zurück foo.

Bearbeiten: Dies ist keine automatische Formatierung, sondern eine Stilüberprüfung. Tut mir leid, wenn diese Antwort ebenfalls nicht zum Thema gehörte. :)

Thomas
quelle
Das ist eher eine Code-Sache, keine Formatierungssache. Dafür gibt es Build-Tools.
@ Bohemian, du hast recht, ich habe die Frage falsch verstanden. Das Build-Tool unserer Wahl ist übrigens checkstyle. :)
Thomas
0

Es ist sehr hilfreich, den Code im Unternehmen zu vereinheitlichen, und dank dessen erzielen Sie im Allgemeinen eine leichter verständliche und leichter zu wartende Struktur für Ihr Produkt.

talnicolas
quelle
0

Nun, die Vorteile sind dieselben wie bei jedem Code-Formatierer, wie Standardisierung des Codes, Semantik zwischen Entwicklern usw. Die einzigen möglichen Nachteile, die ich sehe, sind das Fehlen eines menschlichen Auges nach der Formatierung, um einige Ausnahmen hinzuzufügen usw.
Also ich Vermutlich ist ein IDE-Formatierer besser als ein Formatierer für die Eincheckzeit.

Bluefoot
quelle
0

Nach meiner Erfahrung ist es eine gute Sache. Ohne eins zeigen Code-Vergleiche oft ein Durcheinander der Whitespace-Formatierung und können tatsächliche Codeänderungen verbergen. Meiner Erfahrung nach ist es keine Sünde, mit der Formatierung einer Person herumzuspielen, vor allem was die potenziellen Vorteile der Konsistenz im gesamten Team angeht.


quelle