Wäre es eine schlechte Idee, regelmäßig Code-Formatierer in einem Repository auszuführen?

68

Ich denke darüber nach, einen Cron-Job zu erstellen, der Code auscheckt, Code-Formatierer darauf ausführt und, wenn sich etwas ändert, die Änderungen festschreibt und zurückschiebt.

Bei den meisten Projekten, die Autoformatierer verwenden, werden diese in einen Git-Hook eingefügt. Wenn Sie dies jedoch alle paar Stunden automatisch tun, müssen die Entwickler den Git-Hook nicht mehr installieren.

Ich würde dennoch jeden ermutigen, sauberen, gut formatierten Code zu schreiben, und vielleicht kann ich das System veranlassen, Entwickler automatisch anzupingen, wenn der von ihnen geschriebene Code neu formatiert wird, damit sie wissen, was sie in Zukunft tun sollen.

großblind
quelle
105
Hier liegt ein logischer Fehler vor. Diese Methode würde die Leute nicht ermutigen, gut formatierten Code zu schreiben. Vielmehr würde es die Leute dazu ermutigen , stattdessen nicht auf das System zu formatieren und sich darauf zu verlassen! Wenn Sie befürchten, dass die Codebasis kohärent ist, ist das in Ordnung. Es ist Ihr Ziel, Programmierer darin zu schulen, sauber zu schreiben. Es ist ein riesiger Fehler.
Kilian Foth
52
Unter Berücksichtigung der Auswirkungen, die dies auf Funktionen wie "Schuld" hat - insbesondere wenn der Formatierer viele Änderungen vornimmt und die meisten Zeilen in der Datei als vom Formatierer geändert markiert werden, geht ein Teil des Werts verloren.
Neil P
13
Ich hatte Probleme mit einem Autoformatierer, der nicht richtig aktualisiert wurde und meinen Code beschädigte. Etwas zu beachten.
Isaacg
22
Wenn es Ihnen so wichtig ist, können Sie den Build fehlschlagen, wenn der Code nicht richtig formatiert ist. Das ist ein bisschen hart, aber ein richtiges Peer Review würde mehr oder weniger dasselbe tun.
Erno
18
Dies ist eine hervorragende Idee, wenn Sie Menschen dazu bringen möchten, Sie zu hassen. Es erreicht sehr wenig, wird aber sicherlich unvorhergesehene Probleme verursachen.
TonyK

Antworten:

130

Klingt nett, aber ich würde es vorziehen, Leute zu haben, die für Codeänderungen verantwortlich sind, nicht Bots.

Außerdem möchten Sie unbedingt sicherstellen, dass diese Änderungen nichts kaputt machen. Zum Beispiel haben wir eine Regel, die Eigenschaften und Methoden alphabetisch sortiert. Dies kann Auswirkungen auf die Funktionalität haben , z. B. auf die Reihenfolge der Daten und Methoden in WSDL-Dateien von WCF-Verträgen.

Marcel
quelle
50
Auch es bricht irgendwie das VCS. Sie werden nicht in der Lage sein zu wissen, wer eine Zeile mit Schuld leicht geschrieben hat, und wenn es einen Konflikt gibt, wird Ihr VCS nicht in der Lage sein zu wissen, dass die Änderungen des Werkzeugs nur dem Stil dienen und jedes Mal verworfen werden sollten.
Pierre.Sassoulas
2
Ein tangential verwandtes Thema ist das Erzwingen bestimmter "Speicheraktionen" in einer IDE, z. B. das Finalisieren von Feldern, wenn dies möglich ist. Dies ist ein Problem, da (zumindest in Java) viele Frameworks sie durch Reflektion festlegen (z. B. Spring und Hibernate).
Captain Man
20
@JeffO git blameist nicht nur zu finden, wessen Fehler ein Fehler ist, sondern es ist auch das Festschreiben zu finden, wenn etwas hinzugefügt / entfernt wurde, was aus einer Reihe von Gründen nützlich sein kann.
Pokechu22
2
"Wir haben eine Regel, die Eigenschaften und Methoden alphabetisch ordnet" Junge, das klingt schrecklich! Sie müssten ständig in der ganzen Datei
Alexander
1
Auch für Java macht es die Kombination eines Stilprüfers, der nach Ableitungen des vereinbarten Stils sucht (möglicherweise sogar zu einer Kompilierungswarnung macht), und einer IDE, die zum Formatieren des vereinbarten Stils konfiguriert ist, sehr einfach zu erkennen und zu beheben. Es ist wichtig, dass sich Code (aus Mangel an einem besseren Wort) einpendelt, wenn er tatsächlich die Funktionalität ändert - nicht, wenn ein Bot ihn neu formatiert.
Thorbjørn Ravn Andersen
72

Ich würde stattdessen versuchen, es jedem im Team wirklich leicht zu machen, die automatische Code-Formatierung gemäß dem Standard Ihres Teams direkt in Ihrem Editor oder Ihrer IDE auf die aktuelle Quellcode-Datei (oder ausgewählte Teile davon) anzuwenden . Dies gibt Ihren Teammitgliedern mehr Kontrolle darüber, wie und wann die Formatierung erfolgt. Lassen Sie sie den Code untersuchen, bevor er im endgültigen Formular festgeschrieben wird, und testen Sie ihn nach der Formatierung , nicht zuvor.

Wenn alle oder die meisten Ihrer Teammitglieder denselben Editor verwenden, sollte dies nicht zu schwierig sein. Wenn jeder einen anderen Ansatz verwendet, ist Ihr Ansatz möglicherweise die zweitbeste Lösung, sofern das Team dies unterstützt. Ich empfehle Ihnen jedoch, zusätzliche Sicherheitsmaßnahmen zu installieren, z. B. nächtliche Builds und automatisierte Tests, die nach jeder automatischen Codeänderung ausgeführt werden.

Doc Brown
quelle
7
"Ein Formatierer zur Hand, bei dem Sie zu 100% sicher sind, dass er nichts kaputt macht" - Wann sind Sie jemals auf einen Code gestoßen, von dem Sie ehrlich gesagt zu 100% sicher waren, dass er niemals kaputt gehen würde?
Zibbobz
2
@Zibbobz: Jedes Tool, mit dem wir Code bearbeiten, kompilieren und verknüpfen, und auch das VCS können Fehler aufweisen, die uns jedoch nicht davon abhalten, Arbeitsprogramme zu entwickeln.
Doc Brown
Ich bin mit der Bearbeitung einverstanden - schon deshalb, weil eine zusätzliche Unze Vorsicht ein Pfund Debugging wert ist. ;)
Zibbobz
@ Zibbobz Sehr oft! Beachten Sie, dass eine 100% ige Gewissheit nicht bedeutet, dass die Wahrscheinlichkeit, dass etwas wahr ist, bei 100% liegt.
user253751
@immibis: Möglicherweise haben Sie versäumt, dass sich der Kommentar auf einen Satz bezieht, den ich vor einigen Tagen aus meiner Antwort entfernt habe.
Doc Brown
37

Das ist eine schlechte Idee, nicht nur, weil es die Leute davon abhält, anständigen Code zu schreiben, sondern auch, weil die Neuformatierung als Codeänderung in Ihrem VCS angezeigt wird (Sie verwenden hoffentlich eine) und den historischen Fluss der Codeentwicklung maskiert. Schlimmer noch, jede Code-Formatierungsaktion (in der Tat jede Änderung am Code überhaupt) hat die Möglichkeit, Fehler einzuführen, sei es manuell oder automatisiert. Ihr Formatierer kann nun Fehler in Ihren Code einfügen, die möglicherweise erst Monate später Codeüberprüfungen, Komponententests, Integrationstests usw. durchlaufen.

jwenting
quelle
10
Ich denke, wenn er davon spricht, dass ein Bot Dinge in einem Repository ein- und auscheckt, ist VCS eine Selbstverständlichkeit?
StarWeaver
11
@StarWeaver, wie Sie denken würden. Aber ich habe an Orten gearbeitet, an denen das "Code-Repository" ein abgeschirmtes Verzeichnis war, auf das nur eine Software zugreifen konnte, die unter ihrem eigenen Benutzerkonto ausgeführt wurde. Es gab keinerlei Versionskontrolle außer einer wöchentlichen Sicherung des Verzeichnisses unter einem Verzeichnisnamen mit Zeitstempel.
Jwenting
14
Das ist ... ich werde jetzt Alpträume haben.
StarWeaver
7
@StarWeaver, warum, glaubst du, erinnere ich mich noch an diese Umgebung 14 Jahre später
?
28

Ich würde eher glauben, dass es eine gute Idee ist (automatisch Code-Formatierer auszuführen), aber das ist nur meine Meinung.

Ich werde sie nicht regelmäßig ausführen, aber wenn möglich, bevor die Versionskontrolle festgeschrieben wird.

Bei git wäre ein Pre-Commit-Hook sinnvoll. In vielen C- oder C ++ - Projekten, die mit Makefile erstellt wurden , füge ich ein indentZiel hinzu (das in geeigneter Weise Code-Formatierer wie indentoder ausführt astyle) und erwarte, dass Mitwirkende make indentregelmäßig ausgeführt werden. Übrigens können Sie sogar einige makeRegeln hinzufügen , um sicherzustellen, dass die Git-Hooks installiert wurden (oder um sie zu installieren).

Aber eigentlich ist es eher ein soziales als ein technisches Problem . Sie möchten, dass Ihr Team sauberen und gut formatierten Code schreibt, und das ist eine soziale Regel Ihres Projekts. (Es gibt nicht immer eine technische Antwort auf jedes soziale Problem).

Die Versionskontrolle ist meistens ein Hilfsmittel für die Kommunikation zwischen menschlichen Entwicklern (einschließlich Ihres eigenen Selbst in einigen Monaten). Ihre Software benötigt keine VC oder Formatierung, Ihr Team jedoch.

Übrigens haben verschiedene Communities und verschiedene Programmiersprachen unterschiedliche Ansichten zur Code-Formatierung. Zum Beispiel hat Go nur einen Code-Formatierungsstil, aber C oder C ++ haben viele davon.

Basile Starynkevitch
quelle
Richtig, aber das bedeutet, dass jeder Entwickler den Commit-Hook installieren muss.
Bigblind
17
Ja, aber das ist eine soziale Regel, und Sie brauchen mehrere davon. Sie können nicht für jedes soziale Problem eine technische Lösung finden. Sie müssen die Leute überzeugen. Außerdem muss jeder Entwickler einen Compiler und das Versionskontrollsystem selbst installieren.
Basile Starynkevitch
Richtig, Sie sagen also, die soziale Regel, einen Git-Hook installieren zu müssen, ist besser als ein automatisiertes System, das dies tut? (ernsthafte Frage, nicht als eine rhetorische gemeint, Ton ist schwer im Internet zu vermitteln :))
bigblind
15
Ja, das sage ich.
Basile Starynkevitch
17

Ich halte das für eine schlechte Idee. Viele der Antworten deckten bereits ab, dass es die Geschichte beschmutzt, indem es es schwierig macht, herauszufinden, wer tatsächlich eine Zeile hinzugefügt hat, und dass es die Leute ermutigt, einfach alles zu begehen, und der Format-Bot wird damit umgehen.

Ein besserer Ansatz wäre es, einen Format-Checker in Ihr Build-Tool zu integrieren. (In Java gibt es Checkstyle. ) Erlauben Sie den Benutzern dann nur, ihre Zweige mit dem Hauptzweig zusammenzuführen, wenn der Build erfolgreich ist (einschließlich der Formatierung).

Wenn Sie zulassen, dass Benutzer direkt in den Hauptzweig übertragen (z. B. in Subversion), müssen Sie weiterhin sicherstellen, dass alle Benutzer die Disziplin haben, nur formatierten Code zu übertragen (oder dass der Server die Übertragungen erst akzeptiert, nachdem einige Überprüfungen durchgeführt wurden) ).

Captain Man
quelle
2
Aber stellen Sie sicher, dass der Style Checker vernünftig ist und keine seltsamen Dinge erzwingt, die einer akzeptierten (und akzeptablen) Praxis zuwiderlaufen (und ja, ich habe solche gesehen). Sie können dann auch den Build-Server veranlassen, dass der automatische Build fehlschlägt, wenn die Stilprüfung (neue) Fehler ausgibt.
Jwenting
2
Ich habe viele Fälle gesehen, in denen die automatische Formatierung unlesbaren Code erzeugt. Besonders für viele schließende Parens (es ist sinnvoll, einige davon in separaten Zeilen zu belassen, aber der Roboter kümmert sich nicht darum). Ein weiteres Beispiel ist die automatische Aufteilung langer Java-Zeichenfolgen (sie sind lang, weil sie SQL-Abfragen enthalten, aber der Roboter hat keine Ahnung.).
18446744073709551615
@ 18446744073709551615 Ich schlage keine automatische Formatierung vor, sondern eine automatische Überprüfung . Ihre Regeln könnten diese Dinge erlauben.
Captain Man
16

Im Allgemeinen halte ich es für eine schlechte Idee. Im Prinzip ist es eine gültige Idee, aber in der Realität kann es problematisch sein. Wenn der Code-Formatierer Ihren Code kaputt macht, ist dies eine echte Möglichkeit, und es dauert nur einen Formatierungslauf, bis Ihre Entwickler mit (wahrscheinlich gerechtfertigter) Feindseligkeit reagieren (z. B. "Ihr mieser Code-Formatierer hat den Build gebrochen, schalten Sie ihn jetzt aus! " ).

Entsprechend der Empfehlung von @ BasileStarynkevitch verwenden wir serverseitige Post-Receive-Hooks von Git, um "Beratungs-E-Mails" über den Codestil zu senden.

Wenn ich ein Commit übermittele, das Stilverstöße enthält, sendet mir der Git-Ursprungsserver eine E-Mail, in der ich darüber informiert werde, dass ich gegen die Stilrichtlinien verstoßen habe, und empfiehlt, dass ich meinen Code korrigiere. Dies wird jedoch nicht erzwungen, da es möglicherweise triftige Gründe für einen Bruch des House-Stils gibt (z. B. lange Zeichenfolgen, die die maximale Zeilenlänge überschreiten).

Wenn es sich um ein systembedingtes Problem handelt, das die Codebasis schädigt, ist es möglicherweise an der Zeit, Codestilprobleme in Codeüberprüfungen zur Sprache zu bringen. Ein schlechter Codestil kann Fehler maskieren und das Lesen des Codes erschweren, sodass es sich möglicherweise um ein gültiges Problem bei der Codeüberprüfung handelt.

Um den Aspekt des "sozialen Problems" der Dinge zu ergänzen, kann es sich lohnen, die Menschen zu ermutigen, kosmetische und stilistische Mängel zu beheben, sobald sie sie finden. Wir haben die Standard-Festschreibungsmeldung "Cosmetic". Korrekturen im Codestil, von denen andere Entwickler wissen, dass sie keine wesentlichen Änderungen enthalten.

Wie @DocBrown sagt, besteht eine andere Option darin, den Codestil in Ihrer IDE zu erzwingen. Wir verwenden CodeMaid mit Visual Studio, um viele häufig auftretende Stilfehler zu korrigieren. Es wird beim Speichern der Codedateien ausgeführt, was bedeutet, dass schlecht gestalteter Code niemals in das Repository gelangen sollte ... theoretisch :-).

Karl Nicoll
quelle
Ich habe dieses Update positiv bewertet, da es beide Seiten direkt anspricht (Wunsch nach besserem Code + Sicherheit vor dem Abbruch des Builds). Nachdem sich die Codebasis in einem wirklich guten Zustand befindet, würde ich "schlechte Idee" als eine ziemlich starke Formulierung für die Automatisierung zukünftiger Änderungen ansehen.
donjuedo
10

Ja, ich denke es ist eine schlechte Idee. Versteht mich nicht falsch, der Grund dafür klingt großartig, aber das Ergebnis könnte immer noch schrecklich sein.

Sie werden Zusammenführungskonflikte haben, wenn Sie einen verfolgten Zweig ziehen, zumindest fürchte ich, dass dies der Fall ist, aber ich könnte mich irren.

Ich möchte es im Moment nicht bei der Arbeit testen, aber Sie sollten es selbst ausprobieren.

Tatsächlich können Sie einfach einen aktuellen Commit auschecken. Erstelle eine neue Filiale, lege etwas Kleinliches fest, wähle etwas aus oder verschmelze ohne Autocommit.

Führen Sie dann Ihr Skript aus, ziehen Sie und wenn Ihr Ergebnis ein schreckliches Zusammenführungs-Durcheinander ist, sollten Sie dies definitiv nicht bei Tageslicht tun.

Stattdessen können Sie möglicherweise einen nächtlichen oder einen wöchentlichen Build erstellen.

Aber auch ein nächtlicher könnte eine schlechte Idee sein.

Sie können es entweder wöchentlich ausführen, wenn Sie sicher sind, dass keine Zusammenführungskonflikte auftreten, da alles am Montag beendet ist.

Andernfalls führen Sie es 1-2 Mal pro Jahr in der Ferienzeit aus, wenn keine Zusammenführungskonflikte auftreten.

Die Lösung hängt jedoch möglicherweise von Ihrer Priorität für den Codestil ab.

Ich denke, dass ein Setup-Skript, das automatisch das Git-Repository erstellt und die Haken für das Projekt setzt, besser wäre.

Oder Sie fügen das Hook-Setup-Skript in einen Ordner für Ihre Entwickler im Projekt ein und checken es einfach in git ein.

Hoffentlich hilfreich
quelle
7

Was ich nicht erwähnt habe, ist die Tatsache, dass es manchmal legitime Gründe gibt, etwas nicht gemäß einer Reihe von Regeln zu formatieren. Manchmal wird die Klarheit des Codes verbessert, indem man gegen eine vorgegebene Richtlinie verstößt, die in 99% der Fälle sinnvoll ist. Die Menschen müssen diesen Anruf tätigen. In diesen Fällen würde die automatische Code-Formatierung dazu führen, dass die Inhalte weniger lesbar werden.

Andy Lester
quelle
Stimme voll und ganz zu. Beispiel: Sie richten Variablenbezeichner links, alle Gleichheitszeichen in einer einzelnen Spalte und alle Werte rechts von Gleichheitszeichen aus. Ein Formatierer würde in diesem Fall die Lesbarkeit beeinträchtigen, indem er die Tabulatoren / Leerzeichen jeweils auf ein einzelnes Leerzeichen reduziert. Natürlich könnten Formatierungsregeln geschrieben werden, um dies zu verhindern, aber dann benötigen Sie einen Entwickler, der nur für das Schreiben des Code-Formatierungsprogramms zuständig ist. Scheint eine schlechte Idee zu sein. Treffen Sie bessere interne Konventionen und setzen Sie diese bei der Codeüberprüfung durch.
ThisClark
7

Das ist eine schreckliche Idee.

Wenn einer meiner Entwicklerkollegen unentgeltlich Änderungen an den Quelldateien vornimmt, besteht er keine Codeüberprüfung. Es macht einfach das Leben für alle schwerer. Ändern Sie den Code, der geändert werden muss, sonst nichts. Sinnlose Änderungen führen zu Zusammenführungskonflikten, die zu Fehlern führen können, und verursachen nur sinnlose Arbeit.

Wenn Sie dies regelmäßig tun möchten, ist das einfach schrecklich.

Und dann ist da noch die Frage, welche Art von Änderungen der Code-Formatierer vornimmt. Ich verwende die automatische Formatierung in meinem Editor, sie funktioniert recht gut und ich kann Dinge verbessern, wenn die automatische Formatierung nicht perfekt ist. Wenn Sie einen Code-Formatierer verwenden, der darüber hinausgeht, werden Sie den Code nicht verbessern, sondern ihn verschlimmern.

Und dann ist da noch das soziale Problem. Es gibt Leute, die jeden dazu zwingen wollen, ihren Codestil zu verwenden, und es gibt flexiblere Leute. So etwas würde wahrscheinlich der Entwickler-Typ "Grammer-Nazi" vorschlagen, der seinen Stil allen anderen aufzwingen will. Erwarten Sie eine Gegenreaktion und erwarten Sie, dass die flexiblen, normalerweise unkomplizierten Entwickler ihren Fuß nach unten setzen.

gnasher729
quelle
4

Sie erwähnen das von Ihnen verwendete VCS nicht, aber abhängig davon besteht eine andere Option darin, einen serverseitigen Hook zu haben. Ein VCS wie git unterstützt das. Sie können einen Server-Hook installieren, der den Formatierer für die gepushte Version ausführt und dann die formatierte Datei mit der gepushten Version vergleicht. Wenn sie sich unterscheiden, hat der Entwickler nicht die richtige Formatierung verwendet und der Server kann den Push ablehnen. Dies würde Ihre Entwickler dazu zwingen, nur Code mit der gewünschten Formatierung zu pushen, was sie dazu ermutigt, sauberen Code von Anfang an zu schreiben. Dies würde die Entwickler dafür verantwortlich machen, den korrekt formatierten Code getestet zu haben und Ihre Entwickler von der manuellen Installation einer Clientseite befreien Haken.

Sigy
quelle
Dies ist zum Beispiel die Aufgabe von Go, mit Ausnahme von Mercurial. Das Verschieben von nicht invarianten Elementen go fmtwird automatisch abgelehnt.
Jörg W Mittag
1

Es ist ein Kompromiss zwischen einem saubereren Code-Format und einer genaueren und besser verständlichen Git-Geschichte. Hängt von der Art Ihres Projekts ab und davon, wie oft Sie in die Git-Geschichte eintauchen oder die Schuld dafür geben, dass Sie verstehen, was los ist. Wenn Sie an etwas Neuem arbeiten und nicht auf Abwärtskompatibilität achten müssen, spielt die Historie normalerweise keine so wichtige Rolle.

Max Yankov
quelle
1

Diese Idee ähnelt einigen anderen Antworten, aber ich kann meine Vorschläge nicht kommentieren.

Eine Möglichkeit besteht darin, einen Alias ​​(oder Hook oder was auch immer) für die Festschreibungsfunktion festzulegen, mit der der Code-Formatierer für den zu festschreibenden Code ausgeführt wird, bevor er festgeschrieben wird.

Es kann 2 (oder mehr) Ergebnisse geben:

1) Zeigen Sie dem Benutzer die vorgeschlagenen Änderungen und bitten Sie ihn um Zustimmung, um die Änderungen zu übernehmen und zu übernehmen.

2) Ignorieren Sie die vorgeschlagenen Änderungen und übernehmen Sie den ursprünglichen Code.

Sie können diesen Optionen auch mehr Flexibilität verleihen, z. B. die Möglichkeit, die in Option 1 vorgeschlagenen Änderungen zu bearbeiten. Eine weitere Idee (je nachdem, wie sehr Sie diese Codierungsstandards vorantreiben möchten) besteht darin, dass das System Ihnen einen Bericht sendet, wenn Option 2 ist ausgewählt.

Dies kann eine gute Balance sein, um den gesamten Code nach Belieben automatisch zu überprüfen und den Entwicklern dennoch die Flexibilität zu geben, ihre Anforderungen zu erfüllen. Es erlaubt auch die Option, Code mit Formatierungsunterschieden, wie in anderen Antworten erwähnt, nicht automatisch abzulehnen. Mit 'Ich habe automatische Formatierungskorrekturen überprüft und genehmigt; Commit-Option, die persönliche Verantwortung für die Arbeit der einzelnen Entwickler bleibt erhalten

MadisonCooper
quelle
0

Ich mache es nicht im Repository, aber ich mache es beim Speichern, wenn das Tool es unterstützt. Eclipse ist eine und zusätzlich würde ich die Codebereinigung einschließlich der Sortierung durchführen.

Das Schöne ist, dass es Teil des Projekts ist, so dass jeder Entwickler es für sein Projekt bekommen wird.

Als zusätzlichen Bonus würden Zusammenlegungen erheblich vereinfacht, da die Dinge nicht herumspringen werden.

Code-Überprüfungen verhindern fehlerhafte.

Ein anderer Ort, an dem ich es tun würde, ist, es Teil des Builds zu haben. In meinem Fall habe ich es so, dass maven builds das XML neu formatiert und pom-Dateien aufräumt und den Code neu formatiert.

Auf diese Weise werden alle Entwickler, die zum Push bereit sind, für ihre Pull-Anforderung bereinigt.

Archimedes Trajano
quelle