Ich hasse es, auf Paywall-Inhalte zu verweisen, aber dieses Video zeigt genau, wovon ich spreche. Genau 12 Minuten in Robert Martin sieht das so aus:
Und sagt: "Eine meiner Lieblingsbeschäftigungen ist es, nutzlose Zahnspangen loszuwerden."
Vor langer Zeit, in einer weit entfernten Ausbildung, wurde mir beigebracht, dies nicht zu tun, weil es einfach ist, einen Fehler einzuführen, indem eine weitere eingerückte Zeile hinzugefügt wird, die denkt, dass sie durch das gesteuert wird, if
wenn es nicht ist.
Um Onkel Bob gegenüber fair zu sein, überarbeitet er eine lange Java-Methode auf winzige kleine Funktionen, die, da stimme ich zu, weitaus besser lesbar sind. Wenn er es geändert hat (22.18), sieht es so aus:
Ich frage mich, ob das das Entfernen der Zahnspangen bestätigen soll. Ich bin bereits mit der Best Practice vertraut . Kann Onkel Bob in diesem Punkt herausgefordert werden? Hat Onkel Bob die Idee verteidigt?
quelle
if
Block immer nur eine Zeile ist, spielt es keine Rolle. Wenn Sie mehr Zeilen hinzufügen müssen, sollte es eine andere Funktion sein, die denif
Block zurück auf eine Zeile reduziert (der Funktionsaufruf). Wenn Sie sich daran halten, spielen Zahnspangen einfach keine Rolle - überhaupt nicht .return (page==null) ? "" : includePage(mode,page);
wenn er so sehr darauf aus ist, knapp zu werden. Ich fand es cool, wenn man keine Klammer benutzt, bis ich anfing, Apps professionell zu entwickeln. Diff Noise, mögliche Tippfehler usw. Die Klammern, die die ganze Zeit da sind, sparen Ihnen Zeit und Overhead, die Sie später benötigen würden, um sie einzuführen.Antworten:
Lesbarkeit ist keine Kleinigkeit.
Ich bin gemischter Meinung, wenn es um Zahnspangen geht, die eine einzige Methode umfassen. Ich persönlich entferne sie für Dinge wie einzeilige Return-Anweisungen, aber das Weglassen solcher Klammern hat uns an der letzten Stelle, an der ich gearbeitet habe, wirklich sehr gebissen. Jemand fügte einer
if
Anweisung eine Codezeile hinzu, ohne die erforderlichen geschweiften Klammern einzufügen, und da es sich um C handelte, stürzte das System ohne Vorwarnung ab.Ich fordere niemanden heraus, der religiös ist, nach diesem kleinen Fiasko immer Zahnspangen zu tragen.
Ich sehe also den Vorteil der Lesbarkeit, bin mir aber der Probleme sehr bewusst, die auftreten können, wenn Sie diese Klammern weglassen.
Ich würde nicht versuchen, eine Studie oder eine veröffentlichte Meinung von jemandem zu finden. Jeder hat eine (das heißt eine Meinung), und da es sich um eine stilistische Frage handelt, ist eine Meinung so gut wie jede andere. Denken Sie selbst über das Problem nach, bewerten Sie die Vor- und Nachteile und entscheiden Sie sich selbst. Wenn der Shop, für den Sie arbeiten, einen Kodierungsstandard hat, der dieses Problem abdeckt, befolgen Sie diesen einfach.
quelle
-Wmisleading-indentation
.Sie finden hier oder hier oder überall dort, wo Fahrradschuppen lackiert sind, mehrere veröffentlichte Werbeaktionen oder Ablehnungen von No-Brace-Modellen .
Erinnern Sie sich an den großen OS X / iOS SSL-Fehler von 2014, als Sie sich vom Fahrradschuppen verabschiedeten ?
Ja, "verursacht" durch nicht geschweifte Blöcke https://www.imperialviolet.org/2014/02/22/applebug.html
Die Einstellungen hängen möglicherweise vom Stil der geschweiften Klammer ab. Wenn ich schreiben müsste
Ich könnte auch geneigt sein, Platz zu sparen. Aber
Verwendet nur eine "zusätzliche" Zeile.
Ich weiß, dass Sie nicht gefragt haben, aber wenn ich alleine arbeite, bin ich ein Ketzer. Wenn ich Klammern entferne, bevorzuge ich
Es hat nicht das gleiche visuelle Problem wie der Fehler im SSL-Stil von iOS, spart jedoch noch mehr "unnötige" Zeilen als Onkel Bob;) Liest gut, wenn Sie daran gewöhnt sind, und verwendet den Mainstream in Ruby (
includePage(mode, suiteSetup) unless suiteSetup.nil?
). Na ja, wisst einfach, dass es viele Meinungen gibt.quelle
} else[if(...)] {
, werden keine zusätzlichen Zeilen hinzugefügt, sodass das Ganze nur um eine Zeile länger ist.Onkel Bob hat viele Abwehrmechanismen gegen einen solchen Fehler, der nicht alltäglich war, als "immer geschweifte Klammern verwenden" die vorherrschende Weisheit war:
Ich denke, wenn jemand eine Herausforderung an Onkel Bob veröffentlichen würde, hätte er eine ziemlich gute Gegenargumentation zu den oben genannten Punkten. Dies ist einer der einfachsten Fehler, die man früh fangen kann.
quelle
while(true);{break;}
. Wenn es wirklich einen gültigen Kontext dafür gibt, werde ich eine Weile brauchen, um darüber hinwegzukommen.includePage()
die kein schlecht geschriebenes Makro mit mehr als einer Anweisung ist?Meistens ist dies eine persönliche Präferenz, es gibt jedoch einige Dinge zu beachten.
Mögliche Bugs
Während es kann argumentiert werden , dass durch Vergessen verursacht Bugs Klammern selten sind Add-in, von dem, was ich habe gesehen , dass sie es passieren gelegentlich (nicht das berühmte zu vergessen IOS gehe fehl Fehler). Ich denke, dies sollte ein Faktor sein, wenn Sie Ihren Codestil berücksichtigen (einige Tools warnen vor irreführenden Einrückungen , daher hängt dies auch von Ihrer Toolkette ab) .
Gültige - Code (das heißt , wie es könnte ein Fehler sein)
Auch Ihr Projekt unter der Annahme nicht von einem solchen Fehler leiden, wenn Codelese können Sie einige Code - Blöcke sehen , dass sie aussehen könnten Fehler sein - aber nicht, einige Ihrer mentalen Zyklen nehmen.
Wir beginnen mit:
Ein Entwickler fügt einen nützlichen Kommentar hinzu.
Später erweitert ein Entwickler es.
Oder fügt einen verschachtelten Block hinzu:
Oder benutzt ein Makro:
"... Da Makros möglicherweise mehrere Codezeilen definieren, wird das Makro
do {...} while (0)
für mehrere Zeilen verwendet? Es sollte, weil es in unserem Style-Guide steht, aber ich überprüfe es besser nur für den Fall!"Die obigen Beispiele sind alle gültiger Code. Je mehr Inhalt der Codeblock enthält, desto mehr muss gelesen werden, um sicherzustellen, dass keine Fehler vorliegen.
Vielleicht definiert Ihr Codestil, dass mehrzeilige Blöcke eine geschweifte Klammer erfordern (egal, ob sie Code sind oder nicht) , aber ich habe gesehen, dass diese Art von Kommentaren im Produktionscode hinzugefügt wurde. Wenn Sie es lesen, gibt es einen kleinen Zweifel, dass derjenige, der diese Zeilen zuletzt bearbeitet hat, vergessen hat, eine geschweifte Klammer hinzuzufügen. Manchmal habe ich das Gefühl, dass die Überprüfung wie beabsichtigt funktioniert (insbesondere, wenn ein Fehler in diesem Bereich des Codes untersucht wird) .
Diff Noise
Ein praktischer Grund für die Verwendung von geschweiften Klammern für einzelne Linien ist die Reduzierung des Diff-Rauschens .
Das heißt, ändern:
Zu:
... bewirkt, dass die bedingte Zeile in einem Diff als geändert angezeigt wird. Dies fügt einen kleinen, aber unnötigen Overhead hinzu.
Allerdings unterstützen nicht alle Werkzeuge das wortbasierte Vergleichen. Diff (svn, git, hg ... etc) wird so angezeigt, als ob sich die gesamte Zeile geändert hätte, selbst mit ausgefallenen Werkzeugen. Manchmal müssen Sie schnell über eine einfache Zeile schauen -basiertes Diff, um zu sehen, was sich geändert hat.
git blame
) zeigen die Linie als geändert an, wodurch die Verfolgung des Ursprungs einer Linie mehr Schritte erfordert, um die tatsächliche Änderung zu ermitteln.Diese sind beide klein und hängen davon ab, wie viel Zeit Sie für die Codeüberprüfung oder -verfolgung aufwenden, um geänderte Codezeilen festzuschreiben.
Eine spürbarere Schwierigkeit besteht darin, dass zusätzliche Zeilen in einem Diff geändert werden. Die höhere Wahrscheinlichkeit, dass sich der Code ändert, führt zu Konflikten, die zusammengeführt werden und manuell gelöst werden müssen .
Es gibt eine Ausnahme für Code-Basen, die
{
eine eigene Zeile haben - es ist kein Problem.Das diff noise- Argument gilt nicht, wenn Sie in diesem Stil schreiben:
Dies ist jedoch keine so verbreitete Konvention, weshalb der Vollständigkeit halber hauptsächlich auf die Antwort verwiesen wird (es wird nicht vorgeschlagen, dass Projekte diesen Stil verwenden sollten) .
quelle
{
on-its-own-Line-Stils nicht in Betracht gezogen . Ich hasse diesen Stil wirklich und mag es nicht, an Projekten zu arbeiten, bei denen dieser Stil erforderlich ist. Vielleicht finde ich es in diesem Sinne weniger frustrierend, so codieren zu müssen. Codedichte ist wichtig. Wenn Sie alle Funktionen Ihres Monitors auf einmal sehen können, können Sie das Ganze einfacher fassen. Ich mag es, Leerzeilen zwischen separaten Codeblöcken in einer Funktion zur besseren Lesbarkeit zu lassen (um verwandte Anweisungen zu gruppieren), und wenn ich gezwungen bin, an anderen Stellen Platz zu verschwenden, werden die beabsichtigten Pausen schwächer.{
-on-its-own-line-Stil, bezog es nur aus Gründen der Vollständigkeit der Antworten mit ein. Wie für Makros zu vertrauen zu verwendendo{}while(0)
, finde ich das Problem dabei ist , Sie können ihm vertrauen fast die ganze Zeit. Das Problem ist, dass es zu Unfällen kommen kann, Fehler durch Codeüberprüfung auftreten können ... und Fehler auftreten können, die sonst nicht aufgetreten wären.Vor Jahren wurde ich dazu gebracht, C-Code zu debuggen. Der Fehler war verrückt, schwer zu finden, aber irgendwann kam es zu einer Aussage wie:
Und es stellte sich heraus, dass die Person, die es geschrieben hatte,
foo
ein Makro definiert hatte . Ein Makro mit zwei Codezeilen. Und natürlich unterlag nur die erste dieser beiden Zeilen derif
. (Die zweite Zeile wurde also bedingungslos ausgeführt.)Dies mag absolut einzigartig für C und seinen Präprozessor sein - der vor dem Kompilieren Substitutionen ausführt - aber ich habe es nie vergessen. Diese Art von Dingen hinterlässt Spuren bei Ihnen und warum gehen Sie nicht auf Nummer sicher - besonders wenn Sie eine Vielzahl von Sprachen und Werkzeugketten verwenden und nicht sicher sein können, dass solche Spielereien anderswo nicht möglich sind?
Jetzt rücke ich ein und benutze Klammern anscheinend anders als alle anderen. Für eine einzelne Zeile
if
würde ich Folgendes tun:Daher sind keine zusätzlichen Zeilen erforderlich, um die geschweiften Klammern einzufügen.
quelle
do { ... } while(0)
Schleife einschließen muss . Dies stellt nicht nur sicher, dassif()
Anweisungen immer korrekt behandelt werden , sondern auch, dass das Semikolon am Ende der Anweisung korrekt verschluckt wird. Wer solche einfachen Regeln nicht kennt, sollte einfach keine Präprozessor-Makros schreiben. Die Verteidigung am aufrufenden Standort ist der falsche Ort für die Verteidigung."Onkel Bob" darf seine Meinung haben, Sie dürfen Ihre Meinung haben. Keine Notwendigkeit, ihn herauszufordern.
Wenn Sie sich an die Behörde wenden möchten, nehmen Sie Chris Lattner. In Swift, wenn Anweisungen ihre Klammern verlieren, aber immer mit geschweiften Klammern kommen. Keine Diskussion, es ist Teil der Sprache. Wenn also "Onkel Bob" anfängt, geschweifte Klammern zu entfernen, wird der Code nicht mehr kompiliert.
Es ist eine schlechte Angewohnheit, den Code eines anderen zu durchgehen und "nutzlose Klammern loszuwerden". Verursacht nur dann zusätzliche Arbeit, wenn der Code überprüft werden muss und unnötig Konflikte entstehen. Vielleicht ist "Onkel Bob" ein so unglaublich guter Programmierer, dass er keine Code-Reviews benötigt? Ich habe eine Woche meines Lebens verschwendet, weil ein Top-Programmierer "if (p! = NULL)" in "if (! P)" geändert hat, ohne eine Codeüberprüfung durchzuführen, die an der schlechtesten Stelle versteckt war.
Dies ist meist eine harmlose Stildebatte. Klammern haben den Vorteil, dass Sie eine weitere Codezeile einfügen können, ohne Klammern hinzuzufügen. Wie eine Protokollierungsanweisung oder ein Kommentar (wenn ein Kommentar gefolgt von einer Anweisung folgt, ist das einfach schrecklich). Aussage in der gleichen Zeile, als hätte sie den praktischen Nachteil, dass Sie Probleme mit vielen Debuggern haben. Aber mach was du willst.
quelle
Meine Gründe dafür, keine Zahnspange zu entfernen, sind:
Entscheidungsermüdung reduzieren. Wenn Sie immer Zahnspangen verwenden, müssen Sie sich nie entscheiden, ob Sie Zahnspangen benötigen oder nicht.
Entwicklung Widerstand verringern: auch wenn Sie danach streben, schließlich alle mehrzeiligen Logik Methoden zu extrahieren, eine ohne Verspannung , wenn zu einer verspannten umwandeln zu müssen , wenn hinzufügen Logik ist eine lästige bisschen Entwicklung ziehen. Sie müssen also die geschweiften Klammern entfernen und sie erneut hinzufügen, wenn Sie mehr Code benötigen. Winzig, aber nervig.
quelle
Ein junger Mitarbeiter hat gesagt, dass die Zahnspangen, die wir für überflüssig und überflüssig halten, ihm tatsächlich helfen. Ich erinnere mich nicht genau, warum, aber wenn es ihm erlaubt, besseren Code schneller zu schreiben, ist das allein ein Grund, sie zu behalten.
Fwiw, wir haben uns auf einen Kompromiss geeinigt, der besagt, dass es für mich keine so kurzen Voraussetzungen gibt, die nicht lesbar / ablenkend sind. Z.B
Ich weise auch darauf hin, dass diese einleitenden Voraussetzungen häufig Kontrollfluss-Anweisungen für den Körper sind (z. B. a
return
), sodass die Angst, eine zweite Anweisung hinzuzufügen, die unter derselben Bedingung stehen soll, und das Vergessen, geschweifte Klammern zu schreiben, umstritten ist. Eine zweite Aussage unter der Bedingung wäre sowieso toter Code und nicht sinnvoll.Ich vermute, dass die fließende Lesefunktion darauf zurückzuführen ist, dass der Gehirnanalysator der Person so verdrahtet ist, dass er die geschweiften Klammern als Teil der bedingten Anweisung enthält. Dies ist keine exakte Darstellung der Grammatik von C ++, könnte jedoch ein Nebeneffekt beim Erlernen bestimmter anderer Sprachen sein, wenn dies der Fall ist.
quelle
Nachdem ich das Video gerade gesehen hatte, bemerkte ich, dass das Eliminieren von geschweiften Klammern es einfacher macht zu erkennen, wo Code noch überarbeitet werden muss. Wenn Sie geschweifte Klammern benötigen, kann Ihr Code möglicherweise etwas sauberer sein.
Wenn Sie jedoch in einem Team sind, wird das Eliminieren von Zahnspangen wahrscheinlich eines Tages zu unerwartetem Verhalten führen. Ich sage, behalte sie, und du ersparst dir viele Kopfschmerzen, wenn etwas schief geht.
quelle
Wenn Ihr Code gut Unit-getestet ist , würde diese Art von "Fehler" im Gesicht explodieren.
Das Bereinigen des Codes durch Vermeiden nutzloser und hässlicher Klammern ist eine Praxis, der ich folge.
quelle