Sollten geschweifte Klammern in einer eigenen Linie erscheinen? [geschlossen]
On Februar 14, 2021 by adminKommentare
- Ich finde die " == true " ablenkender als die Wahl der Platzierung der Zahnspange.
- @Dan: Ich denke, dass es immer zur Klarheit beiträgt, den bedingten Ausdruck immer zu erläutern.
- Der einzige Grund dafür Materie wäre, wenn Ihr IDE / Editor ' unterstützt keine übereinstimmende Erkennung von geschweiften Klammern.
- @ leeand00: Einige von uns drucken immer noch komplexen komplexen / unbekannten Code aus um es zu studieren / zu kommentieren. Ein guter hübscher Drucker mildert jedoch die meisten Probleme.
- Leider ist die Frage geschlossen. Nach einiger Zeit der Verwendung von einrückungsbasierter Syntax wechselte ich zu einer anderen (möglicherweise seltsamen) Klammerstruktur. Wie Ihre erste, aber schließende Klammer in der letzten Blockzeile. (nach der Codezeile)
Antwort
Als ich ein Student war, habe ich immer geschweifte Klammern darauf gesetzt Zeile, sodass weniger Zeilen vorhanden sind und der Code auf weniger Seiten gedruckt wird. Es ist ärgerlich, ein einzelnes Klammerzeichen zu betrachten, das als einziges Element in einer Zeile gedruckt ist. (Umgebung, Papierverschwendung)
Beim Codieren großer Anwendungen ist es jedoch erschwinglich, einige Zeilen mit nur geschweiften Klammern zuzulassen, wenn man das Gefühl der „Gruppierung“ berücksichtigt.
Welchen Stil Sie auch wählen Seien Sie konsistent , damit es für Ihr eigenes Gehirn nicht zu einem Aufwand wird, mehrere Stile in verwandte Codeteile . In verschiedenen Szenarien (wie oben) würde ich sagen, dass es in Ordnung ist, verschiedene Stile zu verwenden. Es ist einfacher, den Kontext auf hoher Ebene zu wechseln.
Kommentare
- Andererseits ist die Klammer in der neuen Zeile ein ANSI-STANDARD, K & R nicht. Aber das Schöne an Standards ist, dass es so viele gibt verschiedene (siehe auch uncyclopedia.wikia.com/wiki/AAAAAAAAA ! in uncyclopedia).
- " Es gibt weniger Zeilen " Ich habe Terabyte Speicherplatz und viele Pixel. Warum sollte ich mehr Zeilen verwenden?
- @ 12431234123412341234123: I. Ich denke, er meint, weil einige Leute den Code zur Codeüberprüfung ausdrucken. Und jede nicht unbedingt notwendige neue Zeile ist Papierverschwendung oder ein km ² Wald, der im Maßstab verschwendet wird. Wenn Sie jedoch ' drucken Sie es nicht aus (ich ' t), dann ist ANSI viel besser als K & R. Außerdem sollte jeder, der drucken möchte, wahrscheinlich einen automatisierten Code-Formatierer verwenden. Dies sollte also eine Frage des Werkzeugs und nicht des Codierungsstils sein.
- Ich stimme zu, dass Sie konsistent bleiben sollten, I ' Ich verwende seit Jahren geschweifte Klammern in neuen Zeilen, aber ich muss meinen Code auf andere Weise mischen, z. B. beim Aufrufen von Funktionen, anonymen Funktionen, Objektliteralen usw. Alle ausdrucksbasierten Sprachen / Anonymer Code erleichtert Klammern in derselben Zeile erheblich.
Antwort
Sie sollten niemals die 3. Methode ausführen.
Wenn Sie beim Klammern sparen, sparen Sie möglicherweise beim ersten Mal ein paar Tastenanschläge, aber beim nächsten Codierer, der kommt Fügt Ihrer else-Klausel etwas hinzu, ohne zu bemerken, dass der Block fehlt. Klammern werden eine Menge Schmerzen bereiten.
Schreiben Sie Ihren Code für andere Personen.
Kommentare
- Ich wünschte, ich wüsste, woher dieses kleine bisschen Weisheit stammt. Da das Schreiben Ihres Codes für Personen, die ' nicht lesen möchten, so sinnlos wie möglich ist …
- Der zweite Programmierer kann seinen eigenen hinzufügen Klammern, wenn er etwas hinzufügt. Er ' ist nicht dumm, und in einer Codierungskonvention, die dazu ermutigt, Klammern für einfache Dinge wie diese wegzulassen, wird er ' wissen, wie er aussehen muss.
- Optionale Klammern sind nicht optional. Es gibt nur wenige schlechtere Entwurfsentscheidungen, die in C getroffen und auf seine Nachkommen übertragen wurden. Dass es in einer Sprache weiterlebt, die so neu wie C # ist, macht mich wütend.
- Es spielt keine Rolle ', wie schlau Sie sind oder wie tief der Codierungsstandard für einzeilig ausgelassene Locken verwurzelt ist: wenn Sie ' Wenn Sie ein Problem oder einen Fehler lösen möchten, werden Sie wahrscheinlich übersehen, dass die Locken weggelassen wurden. Und für insgesamt 2 Sekunden Arbeit ist es wirklich so schlimm, explizit zu sein?
- Es gibt ' einen Vorteil für Stil 3, den Sie ' fehlt alles: Sie erhalten sofort mehr Code auf Ihrem Bildschirm.
Antwort
Lange Zeit habe ich argumentiert, dass sie gleichwertig sind, oder so sehr nahe daran, gleich zu sein Der mögliche Gewinn durch die richtige Wahl lag weit unter den Kosten, um darüber zu streiten.
konsistent zu sein ist jedoch wichtig . Also sagte ich, wir werfen eine Münze und schreiben Code.
Ich habe schon früher gesehen, wie Programmierer sich solchen Änderungen widersetzten. Komm darüber hinweg! Ich habe in meiner Karriere viele Male gewechselt. Ich verwende in meinem C # sogar andere Stile als in meiner PowerShell.
Vor einigen Jahren arbeitete ich in einem Team (~ 20 Entwickler), das sich entschied, danach zu fragen Geben Sie ein und treffen Sie dann eine Entscheidung und setzen Sie diese dann in der gesamten Codebasis durch. Wir hätten 1 Woche Zeit, um zu entscheiden.
Viel Stöhnen & eye -Rollen. Viele „Ich mag meinen Weg, weil er“ besser „ist, aber keine Substanz.
Als wir die Feinheiten der Frage studierten, fragte jemand, wie man mit diesem Problem in Klammern umgeht -same-line-Stil:
void MyFunction( int parameterOne, int parameterTwo) { int localOne, int localTwo }
Beachten Sie, dass nicht sofort ersichtlich ist, wo die Parameterliste endet und der Textkörper beginnt. Vergleichen Sie mit:
void MyFunction( int parameterOne, int parameterTwo) { int localOne, int localTwo }
Wir haben gelesen, wie Menschen auf der ganzen Welt mit diesem Problem umgegangen sind, und das Muster gefunden, nach dem Öffnen eine leere Zeile hinzuzufügen Klammer:
void MyFunction( int parameterOne, int parameterTwo) { int localOne, int localTwo }
Wenn Sie eine visuelle Unterbrechung machen, können Sie dies auch mit einer Klammer tun. Dann werden auch Ihre visuellen Unterbrechungen konsistent
Bearbeiten : Zwei Alternativen zur Lösung „extra leere Zeile“ bei Verwendung von K & R:
1 / Einrücken der Funktionsargumente anders als im Funktionskörper
2 / Setzen Sie das erste Argument in dieselbe Zeile wie den Funktionsnamen und richten Sie weitere Argumente in neuen Zeilen an diesem ersten Argument aus.
Beispiele:
1 /
void MyFunction( int parameterOne, int parameterTwo) { int localOne, int localTwo }
2 /
void MyFunction(int parameterOne, int parameterTwo) { int localOne, int localTwo }
/ Bearbeiten Sie
Ich argumentiere immer noch, dass Konsistenz wichtiger ist als andere Überlegungen, aber wenn wir keine Präzedenzfall , dann ist die Klammer in der nächsten Zeile der richtige Weg.
Kommentare
- Zu Ihrer Information, ich mag wie eine vernünftige Person klingen, aber ich ' bin eigentlich eine Nuss. Für einfache einzeilige Blöcke verwende ich weder geschweifte Klammern noch Zeilenumbrüche, sodass ' if (foo) bar () ' alle eins sind Linie. Ich bemühe mich, meinen Code so einfach zu gestalten, dass er ' kein Problem darstellt.
- Kam hierher, um genau dies zu posten. Unzählige Personen, die die öffnende Klammer in derselben Zeile halten, folgen eine leere Zeile (insbesondere zu Beginn von Klassen und Methoden), da sie ansonsten ' Es ist schwierig, den Klassen- / Methodenheader vom Body zu trennen. Wenn Sie ' ohnehin eine zusätzliche Zeile verwenden, können Sie die Klammer auch dort platzieren und den zusätzlichen Vorteil nutzen, dass die Einrückung leichter zu erkennen ist.
- Ich ' habe die Leerzeile nicht gesehen – Ich ' bin mit dem doppelten Einzug der Parameter für MyFunction () besser vertraut, wenn Sie verirren sich in eine andere Zeile.
- Das Aufteilen der Parameter in mehrere Zeilen ist verrückt.
- Der Funktionsparameter " " Argument ist ein roter Hering. Offensichtlich sollten die Argumente doppelt beabsichtigt sein. Kein Problem, es vom folgenden Code zu unterscheiden.
Antwort
Die Grundregeln lauten:
- Befolgen Sie den vorhandenen Codierungsstandard des Projekts.
- Wenn es keinen Codierungsstandard gibt und Sie eine vorhandene Codebasis bearbeiten, die jemand anderem gehört, müssen Sie dem Stil des Projekts entsprechen vorhandener Code, egal wie sehr Sie ihn mögen / nicht mögen.
- Wenn Sie an einem Green-Field-Projekt arbeiten, diskutieren Sie mit anderen Teammitgliedern und kommen Sie zu einem Konsens über einen formellen oder informellen Codierungsstandard.
- Wenn Sie als einziger Entwickler an einem Green-Field-Projekt arbeiten, entscheiden Sie sich selbst und seien Sie dann rücksichtslos konsistent .
Auch wenn Sie keine externen Einschränkungen haben, ist es (IMO) am besten, nach einem vorhandenen (weit verbreiteten) Codierungsstandard oder einer Stilrichtlinie zu suchen und diese zu befolgen. Wenn Sie Ihren eigenen Stil verwenden, besteht eine gute Chance, dass Sie ihn in einigen Jahren bereuen werden.
Schließlich ist ein Stil, der mit vorhandenen Stilprüfern und Code-Formatierern implementiert / implementiert werden kann, besser als Eine, die manuell „erzwungen“ werden muss.
Kommentare
- Diese Antwort verdient mehr Stimmen.
- Konsistenz ist der Schlüssel
Antwort
Der Vorteil der ersten Methode besteht darin, dass sie vertikal kompakter ist Sie können also mehr Code auf Ihren Bildschirm einfügen, und deshalb bevorzuge ich ihn. Das einzige Argument, das ich für die zweite Methode gehört habe, ist, dass es einfacher ist, öffnende und schließende Klammern zu koppeln, aber die meisten IDEs haben eine Tastaturkürzel dafür, und es ist eigentlich eine falsche Aussage – anstatt eine öffnende Klammer mit einer schließenden Klammer zu koppeln, können Sie eine schließende Klammer mit dem Ausdruck „Blockanfang“ (wenn, sonst, für, während) auf derselben koppeln Einrückungsstufe, daher ist es genauso einfach zu bestimmen wo der Anfang des Blocks ist.
Ich sehe keinen Grund, eine ganze Zeile nur für eine Klammer zu verschwenden, wenn das vorhergehende Konstrukt für / while / if bereits visuell den Beginn eines Blocks anzeigt.
Trotzdem glaube ich, dass die schließende Klammer in einer eigenen Zeile stehen sollte, da wir etwas brauchen, um das Ende eines Blocks und seine Einrückungsstruktur sichtbar anzuzeigen.
Kommentare
- Nein … Ich ' sage, warum ich die Menge an Code reduzieren kann, die dies kann Passen Sie auf Ihren Bildschirm, indem Sie etwas tun, das nicht ' zum Code ' Klarheit hinzufügt?
- Wann ich Ich begann mit dem Codieren. Ich mochte jede Klammer in einer eigenen Zeile. Jetzt bevorzuge ich die erste Methode.
- Es gibt eine Vielzahl von Untersuchungen, die bis in die frühe Steam-Zeit zurückreichen (Weinberg, " Psychologie der Computerprogrammierung ") zeigt, dass das Verständnis des Programmierers DRAMATISCH abnimmt, wenn die Menge an Code, die angezeigt werden muss, größer ist als sichtbar einmal (dh eine Bildschirm-, eine Druckerseite). Dieses Phänomen spricht STARK dafür, dass der vertikale Raum als wertvolle Ressource betrachtet wird, die nicht unentgeltlich verschwendet werden darf. Daher wird die erste Methode bevorzugt.
- LOL @ " Verschwendung eines GESAMTE Zeile ". OH MEIN GOTT! Nicht das!! = P
- @Julio Im College habe ich Methode 1 stark bevorzugt und konnte ' nicht ertragen, Methode 2 zu lesen. Nachdem ich bei einem Unternehmen gearbeitet habe, das C # verwendet , wo der Standard Methode 2 ist, habe ich ' das genauso gut gemocht. Ich kann jetzt entweder lesen oder verwenden; keiner stört mich. Menschen, die stark abgeneigt auf das eine oder andere reagieren, reagieren im Allgemeinen überreagiert auf etwas, mit dem sie nicht vertraut sind.
Antwort
Ich bevorzuge
if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); }
gegenüber
if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); }
, da die Zeile you.postAnswer();
ist auf den ersten Blick viel einfacher zu lesen und zu finden. Auf die zweite Weise wird es mit der darüber liegenden Linie (you.hasAnswer()
) verschmolzen, sodass meine Augen sich mehr konzentrieren müssen, um es zu lesen.
Kommentare
- Dies gilt so lange, bis Ihr Programm die Höhe Ihres Bildschirms überschreitet. 😉
- @ weberc2 Ich denke, wenn Ihr Programm die Höhe des Bildschirms überschreitet, werden sich zwei Zeilen weniger ' nicht viel ändern.
- Ich konnte nie verstehen, warum ich diese Methode bevorzugt habe, aber sie ' s für genau das.
- @Mageek Dies ist verspätet, aber es ' sind nicht 2 Zeilen, es ' s 2 Zeilen für jeden Bereich. Das ' ist O (N), nicht O (1). Ich fühle ' nicht so stark darüber; ' ist wichtiger, dass Sie einen Stil auswählen, der lange Parameterlisten lesbar macht.
or 10 Jahren hätte ich mich auf den Bildschirmplatz geeinigt. Heute benutze ich einen 1920 * 1200 Bildschirm. Es passt zu einer Menge Code, mehr als mein Gehirn gleichzeitig verarbeiten kann. Die erste Methode ermöglicht es mir, die verschiedenen Bereiche zu öffnen und zu schließen, ohne sie lesen zu müssen.
Antwort
Ich bevorzuge die erste Methode. Zahnspangen sind keine separate Zeile wert.
Die Sache ist, dass Zahnspangen nicht wichtig sind. Sie sind nur syntaktischer Papierkorb , was absolut unnötig ist, um zu verstehen, wofür Code ist, für welchen Zweck und für welchen Zweck Sie sind nur eine Hommage an C-ähnliche Sprachen alten Stils, in denen eine visuelle Gruppierung von Operatoren aufgrund des geringen verfügbaren Bildschirmplatzes nicht möglich war.
Es gibt Sprachen (Python, Haskell, Ruby), die ohne geschweifte Klammern in Ordnung sind. Dies bestätigt nur, dass geschweifte Klammern Papierkorb sind und nach Möglichkeit keine Zeile für sie verdienen sollten:
if (you.hasAnswer()){ you.postAnswer(); }else{ you.doSomething(); }
Kommentare
- Ich weiß ' nicht über Haskell oder Ruby Bescheid, aber Python ist Whitespace-empfindlich, weshalb es nicht ' erforderlich ist Klammern oder andere Trennzeichen zur Bezeichnung von Blöcken. Die Klammern sind nicht nur syntaktisches Rauschen; Sie dienen einem tatsächlichen Zweck.
- @Robert, In C müssen Sie sowohl Leerzeichen als auch geschweifte Klammern verwenden. In Python sollten Sie nur Leerzeichen verwenden. Was ist besser?
- @Pavel, in C ' müssen Sie ' kein Leerzeichen machen.
- @ KenBloom C-Programme ohne Leerzeichen sind nicht lesbar. Sie müssen sie also trotzdem ausführen.
- Unabhängig davon, ob geschweifte Klammern eine gute Idee sind oder nicht, die bloße Existenz von Sprachen, die sie nicht ' verwenden ' scheint kein Argument für oder gegen sie zu sein. Es deutet nur darauf hin, dass es möglich ist, eine Sprache ohne sie zu haben, nicht dass es sich um ein gutes oder schlechtes Sprachdesign handelt.
Antwort
Verwenden Sie Python und umgehen Sie das Argument vollständig.
Kommentare
- +1
SyntaxError: not a chance
- Dies ist einfach keine Option für die überwiegende Mehrheit der Projekte. Außerdem hat die Einrückung zum Gruppieren den Anteil der Probleme '.
- @Bryan, mir ist klar, dass dies nicht ' t sehr praktisch. Ich dachte nur, es sei ein Standpunkt, der da draußen sein muss, stärker als nur ein Kommentar. Und ich ' bin nie auf die Probleme gestoßen, die durch Einrückungen verursacht werden, die Sie implizieren, wahrscheinlich weil ich ' Tabulatoren und Leerzeichen nicht mische.
- Verwenden Sie Go und umgehen Sie das Argument vollständig (plus statische Eingabe, Geschwindigkeit und einen Compiler!) 🙂
- Drücken Sie dann die Leertaste zu oft und beobachten Sie, wie der Compiler / Interpreter lacht bei dir. Dies wird ' in den meisten geschweiften Sprachen nicht vorkommen.
Antwort
Die Position von geschweiften Klammern sollte
Metadaten
konfigurierbar sein in der IDE vom Programmierer. Auf diese Weise sehen diese lästigen Klammern im gesamten Code unabhängig vom Autor gleich aus.
Kommentare
- Stimmen voll und ganz zu. ' ist eine Präsentation und keine Daten.
- Das Problem ist, dass die Dinge sehr schnell chaotisch werden, wenn Commits ausgeführt werden.
- @Andy: Da ' genau der Punkt ist, ändert die IDE ihr Aussehen, aber nur in der IDE! Die eigentliche Quelle wird nicht berührt. Zur Versionskontrolle können Sie Hooks hinzufügen, die die Einstellung für geschweifte Klammern in eine häufige Situation übersetzen, sodass jeder den Code auf die gleiche Weise auscheckt.
- @klaar Jede moderne IDE i ' ve verwendet Tabulatoren in Leerzeichen und verschiebt geschweifte Klammern in ihre eigene Zeile oder an das Ende der " Öffnung " Linie; Ich ' bin mir nicht sicher, warum die Quelle Ihrer Meinung nach in diesen Fällen nicht ' berührt wird, und das ist der Grund für meinen Kommentar. Es wird normalerweise von den IDEs abhängig von den Entwicklereinstellungen geändert, was bedeutet, dass ich während eines Commits ' viele Änderungen sehe, die nur Rauschen sind, wenn die geschweiften Klammern in ihre eigene Zeile verschoben werden. Auf diese Weise wird die IST-Änderung ausgeblendet, die jemand vorgenommen hat.
- @Andy: Ist ' nicht die Möglichkeit, Hooks zu verwenden, die diese Diskrepanzen in Bezug auf Leerzeichen und Klammern in einen einheitlichen Standard umwandeln uppon commit, um das von Ihnen beschriebene Lärmproblem zu umgehen? In jedem Fall sollte ein ordnungsgemäßes Versionsverwaltungssystem über Kleinigkeiten wie Leerzeichen oder andere unsinnige Dinge hinausgehen.
Antwort
Ich bevorzuge die erste, weil es für mich schwieriger ist, den Fehler in diesem Beispiel zu erkennen.
if (value > maximum); { dosomething(); }
als in diesem Beispiel
if (value > maximum); { dosomething(); }
Die ; {
sieht für mich nur falscher aus als eine Zeile, die mit ;
also werde ich es eher bemerken.
Kommentare
- Sie machen ein gutes Argument, aber persönlich hat dies nur jemals ist mir einmal in meiner 5-jährigen Programmierung passiert. Ich konnte ' nicht herausfinden, warum es nicht ' ausgeführt wurde, habe es auf SO und gepostet Jemand hat mich schnell auf das Semikolon hingewiesen. Jedes Mal, wenn es komprimiert wird, um diese 1 Zeile weniger zu verwenden, fällt es mir jedoch schwerer zu lesen.
- Die "; {" sieht aus wie a Art zwinkerndes mürrisches Gesicht oder vielleicht eine Person mit einem Schnurrbart.
- +1 Tolles Beispiel als Antwort: sehr subtiler Fehler, leicht zu übersehen. Auch das Layout, das dies anzeigt, regt zum Nachdenken an.
- Natürlich kennzeichnet jede anständige IDE die leere Steueranweisung und jeder anständige Compiler gibt eine Warnung aus.
- @Dunk Der einzige Fehler in Ihrem Das Argument (dem ich entschieden zustimme) ist, dass heutzutage so viele Menschen interpretierte Sprachen verwenden (JavaScript, PHP, et al.), dass viele " Programmierer " würde ' einen Compiler nicht von einem Double Latte kennen.
Antwort
Es kommt darauf an.
Wenn ich in Javascript oder jQuery codiere, verwende ich die erste Form:
jQuery(function($) { if ($ instanceOf jQuery) { alert("$ is the jQuery object!"); } });
Wenn ich jedoch in C # codiere, verwende ich die zweite Form, da dies die kanonische Methode in C # ist.
public int CalculateAge(DateTime birthDate, DateTime now) { int age = now.Year - birthDate.Year; if (now.Month < birthDate.Month || (now.Month == birthDate.Month && now.Day < birthDate.Day)) age--; return age; }
Beachten Sie dies Ihr Beispiel kann
if (you.hasAnswer()) you.postAnswer(); else you.doSomething();
in C # geschrieben werden.
Kommentare
- Es kann in vielen solchen Sprachen geschrieben werden, weil eine Block-Anweisung ist eine Aussage. Hinzufügen! 🙂
- Gemäß den " Framework-Designrichtlinien " ist die " kanonisch " besteht darin, die öffnende Klammer in derselben Zeile (dh in der ersten Form) zu platzieren. Sagen Sie einfach ' …
- @Uwe: Vielleicht. Microsoft hat jedoch für alle MSDN C # -Beispiele den " ausgerichteten geschweiften Klammern " verwendet und ' ist in Visual Studio eingebrannt, also …
- @Uwe: Das ' ist Cwalina ' s Buch und es ' ist schrecklich benannt, da es viel mehr als das ist. Die FDG auf MSDN hat dazu nichts zu sagen. Ich frage mich auch, warum die Framework Design -Richtlinien etwas über die C # Codierungspraxis aussagen?
n der Tat sollten Sie in Javascript geschweifte Klammern in dieselbe Zeile setzen. Sie können Fehler verursachen, wenn sich geschweifte Klammern in einer eigenen Linie befinden. Siehe beispielsweise encosia.com/…
Antwort
Ich bevorzuge eine leichte Variante von 1)
if (you.hasAnswer()) { you.postAnswer(); } // note the break here else { you.doSomething(); }
Warum?
-
Ich denke, immer das Setzen von geschweiften Klammern in die eigene Zeile verringert die Lesbarkeit. Ich kann nur eine bestimmte Menge Quellcode auf meinen Bildschirm passen. Bracket-Stil 2) macht Heave-Algorithmen mit vielen verschachtelten Schleifen und Bedingungen schmerzhaft lang.
-
Ich möchte jedoch, dass
else
gestartet wird in einer neuen Zeile, weilif
undelse
visuell zusammengehören. Wenn sich vor demelse
eine Klammer befindet, ist es viel schwieriger zu erkennen, was zu was gehört. -
3 ) disqualifiziert sich. Wir alle wissen, was schlimmes passieren kann, wenn Sie die Klammern weglassen und es vergessen.
Kommentare
- Ich habe diesen hier gesehen, wo ich arbeite. Es ist ' interessant.
- Ich mag diesen Stil auch besser, da ich damit einen Kommentar über
else
Zeile bei Bedarf und / oder Leerzeichen zwischen dem if-Block und dem else-Block einfügen, damit die Dinge weniger voll aussehen. Bracket-Stil Nr. 2 bewirkt nichts anderes, als die Aktionen von den Bedingungen zu distanzieren. Vor diesem Hintergrund ist mein Favorit definitiv Python ' ohne Klammer 🙂 - Wenn es wichtig ist, die Anzahl der Codezeilen auf dem Bildschirm zu maximieren, entfernen Sie diese einfach mit Zeilenumbrüchen insgesamt. Sie ' können viele Zeilen auf einem Bildschirm abrufen. Ich ziehe es vor, nichts zu haben, was mich beim Lesen innehalten und nachdenken lässt, dh. meine Definition von besser lesbar. Mit den Zahnspangen ignoriert mein Verstand sie. Ohne die Klammern muss mein Verstand die Steuerblöcke anhalten und ausrichten. Keine lange Pause, aber dennoch eine Pause.
- Ja, wenn und sonst zusammengehören, ABER {und} und as} in einer separaten Zeile stehen, {sollte in einer separaten Zeile stehen Linie auch. " Ich kann nur eine bestimmte Menge Quellcode auf meinen Bildschirm bringen. " Und das ' s genau, warum das Sagen von 3) " ist, sich selbst zu disqualifizieren " ist überhaupt keine Option. Nach einem Jahrzehnt der Arbeit mit 3) habe ich das Hinzufügen von Klammern beim Hinzufügen einer neuen Codezeile nie vergessen, noch kenne ich jemanden, der jemals hatte. Wenn ich Code an Personen anpassen muss, wer kann dann ' nicht richtig lesen, wo endet er? Beenden Sie die Verwendung bestimmter Sprachfunktionen, weil einige der Codeleser sie möglicherweise nicht verstehen?
Antwort
Ich habe irgendwo gelesen, dass die Autoren eines Buches wollten, dass ihr Code wie folgt formatiert wird:
if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); }
Aufgrund der Platzbeschränkungen ihres Herausgebers mussten sie jedoch Folgendes verwenden:
if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); }
Jetzt weiß ich nicht, ob das stimmt (da ich es nicht mehr finden kann), aber der letztere Stil ist in Büchern sehr verbreitet.
Auf persönlicher Ebene bevorzuge ich die Klammern auf a separate Zeile als:
a) Sie geben einen neuen Bereich an.
b) Es ist einfacher zu erkennen, wenn Sie eine Nichtübereinstimmung haben (obwohl dies in einer IDE, die Fehler hervorhebt, weniger problematisch ist für Sie).
Kommentare
- … Die zweite Option erleichtert auch Ihre beiden Punkte (wobei nur die Einrückung dem Zweck der Klammer dient /). Einrückungskombination). 🙂
Antwort
Ah, die One True Brace Style .
Es hat alles, was für ein heiliges W benötigt wird ay – sogar ein Prophet (Richard „mein Weg oder die Autobahn“ Stallman).
Der Typ hat sich in so vielen Dingen so geirrt, aber GNU ist genau richtig, wenn es um Zahnspangen geht.
[Update] Ich habe das Licht gesehen und verehre jetzt Allman
Kommentare
- Ich sehe ' den Sinn des GNU-Stils nicht, außer dass er Lisp-Code modelliert. Scheint viel Arbeit für wenig Nutzen zu sein.
- Ich kenne niemanden, der den GNU-Stil verwendet. 1 TB auf dem ganzen Weg.
- Sie können ' nicht schlechter als zwei Einrückungsstufen pro Block machen, außer natürlich für den Lisp-Stil, das versteht sich von selbst.
- +1 für den Link zu Klammerstilen. Es zeigt, dass unabhängig von Ihrem Stil viele großartige Leute nicht mit Ihnen übereinstimmen.
- @RobertHarvey Es gibt keine zusätzliche Arbeit. Wenn dies der Fall ist, verwenden Sie die ' nicht Das richtige Werkzeug, um Code zu schreiben oder ihn richtig zu konfigurieren. Der Vorteil ist ein viel besser lesbarer Code. Sie sehen jeden Fehler in der Klammer sehr schnell und können einfach nur den Code lesen, während Sie Unterblöcke ignorieren.
Antwort
Zweites Beispiel: Die Lesbarkeit ist mir sehr wichtig. Ich kann es nicht ertragen, zu prüfen, ob Blöcke auf andere Weise blockiert werden = (
Kommentare
- Nachforschungen haben ergeben, dass ' das Lesen von kompaktem Code einfacher ist, sobald eine Codebasis die Höhe des Bildschirms überschreitet.
- @ weberc2 Könnten Sie DOIs für dieses Forschungspapier bereitstellen?
Antwort
Einfache Antwort: Was ist einfacher zu debuggen?
// Case 1: void dummyFunction() { for (i = 0; i != 10; ++i) { if (i <= 10) std::cout << "i is: " << i << "\n"; std::cout << 10 - i << " steps remaining\n"; // Some hard work here // which is really hard // and does take some screen estate } else std::cout << "We"ll never get there"; } } // COMPILER ERROR HERE // Case 2: void dummyFunction() { for (i = 0; i != 10; ++i) if (i <= 10) { std::cout << "i is: " << i << "\n"; std::cout << 10 - i << " steps remaining\n"; // Some hard work here // which is really hard // and does take some screen estate } else std::cout << "We"ll never get there\n"; } } // COMPILER ERROR HERE
In welchem Fall haben Sie das Problem zuerst diagnostiziert?
Persönliche Vorlieben interessieren mich nicht besonders (es gibt viele andere) Stile, einschließlich Whitesmith und al.) und es ist mir egal … solange es meine Fähigkeit, den Code zu lesen und debug it.
A. s zum Argument „Waste Space“ kaufe ich es nicht: Ich neige sowieso dazu, Leerzeilen zwischen logischen Gruppen hinzuzufügen, um das Programm klarer zu machen …
Kommentare
- Sie sind beide so einfach zu debuggen, hauptsächlich weil ' ein kurzer Codeblock ist. Die Einrückung ist konsistent und erleichtert die Visualisierung der tatsächlichen Codeblöcke.
- @Htbaa: in der Tat 🙂 Warum also die Mühe machen?
- @MatthieuM. Der erste Block ist für mich sinnvoller, da die Zeilenumbrüche (im zweiten Block) zwischen der Funktionssignatur, der for-Anweisung und der if-Anweisung mich glauben lassen, dass sie nicht miteinander zusammenhängen, aber eindeutig nicht t. Leerzeilen dienen zum Trennen nicht verwandter Codebits. Code, der ' in der Nähe anderer Codezeilen liegt, bedeutet, dass sie tatsächlich miteinander verbunden sind. Das ist natürlich alles ' imo ', aber ich habe mich gefragt, was Sie damit meinen. BEARBEITEN: Auch jede richtige IDE wird feststellen, dass eine Klammer fehlt, und Ihnen bei der Interpretation Ihres Codes einige Fehler geben.
- Ich möchte darauf hinweisen, dass diese beiden Codeabschnitte völlig unterschiedlich sind. Sie würden Compilerfehler an verschiedenen Stellen im Code haben. Der erste hat einen Compilerfehler bei " else " und dem letzten Curly. Der zweite hat nur einen Compilerfehler beim letzten Curly.
Antwort
Nicht dass es jemand bemerken würde, Aus diesem Grund gehören geschweifte Klammern in die gleiche Zeile wie die Bedingung (mit Ausnahme sehr langer Bedingungen, aber das ist eine Kante case):
In C ist dies ein gültiges Konstrukt:
while(true); { char c; getchar(); //Wait for input }
Schnell! Was macht dieser Code? Wenn Sie geantwortet haben “ Endlosschleife fragt nach Eingabe „, Sie liegen falsch! Es kommt nicht einmal zur Eingabe. Es wird bei while(true)
abgefangen. Beachten Sie das Semikolon am Ende.Dieses Muster ist tatsächlich häufiger als es scheint; In C müssen Sie Ihre Variablen am Anfang eines Blocks deklarieren, weshalb eine neue gestartet wurde.
Eine Codezeile ist ein Gedanke. Klammern sind ein Teil des Gedankens, der die Bedingung oder Schleife enthält. Daher gehören sie in die gleiche Zeile .
Kommentare
- Dies ist bei weitem das beste Argument für K & R-Stil, den ich gesehen habe, der Rest ist mit dem heutigen ' s IDE-Systeme mit Code-Folding-Unterstützung. Dies gilt nur für Sprachen im C-Stil, die
;
-Blockenden unterstützen. Dies ist auch der Grund, warum ich dieses Blockendsystem verachte, das meiner Meinung nach veraltet ist und die Go-Sprache es beweist. Ich habe dieses Problem oft gesehen, obwohl nicht in diesem Szenario. Es passiert normalerweise, wenn sie beabsichtigen, der Anweisung etwas hinzuzufügen und dies zu vergessen.
Antwort
Ich mag das erste Methode. Es scheint ordentlicher IMO, und es ist kompakter, was ich mag.
EDIT: Ah, ein Drittel. Ich mag dieses am besten, wenn es möglich ist, da es noch kleiner / ordentlicher ist.
Antwort
Sie könnten es schreiben:
you.hasAnswer() ? you.postAnswer() : you.doSomething();
To beantworte die Frage; Früher bevorzugte ich geschweifte Klammern in der eigenen Zeile, aber um nicht über Fehler beim automatischen Einfügen von Semikolons in Browsern nachdenken zu müssen, begann ich, den ägyptischen Stil für Javascript zu verwenden. Und als ich Java in Eclipse codierte, hatte ich kein Interesse daran, den Standard-Klammerstil zu bekämpfen (oder zu konfigurieren), also habe ich mich auch in diesem Fall für Egyptian entschieden. Jetzt bin ich mit beiden in Ordnung.
Kommentare
- , die so verwendet werden sollen,
postAnswer()
unddoSomething()
sollte einen Wert für den ternären Operator zurückgeben, was häufig nicht der Fall ist: Sie können sehr gut void (kein Wert) und auch (zumindest in c #) das Ergebnis von?:
sollte einer Variablen zugewiesen werden
Antwort
Fast alle Antworten Hier finden Sie eine Variation von „Was auch immer Sie tun, bleiben Sie bei einem oder zwei“.
Also dachte ich einen Moment darüber nach und musste zugeben, dass ich es einfach nicht als so wichtig betrachte . Kann mir jemand ehrlich sagen, dass das Folgende schwer zu befolgen ist?
int foo(int a, Bar b) { int c = 0; while(a != c) { if(b.value[a] == c) { c = CONST_A; } c++; } return c; }
Ich bin mir über niemanden sicher … aber ich habe mental absolut keine Probleme Ich habe einige Momente gebraucht, um herauszufinden, was der Code bewirkt hat, aber das ist das Ergebnis, dass ich nur zufällig eine C-ähnliche Syntax eingegeben habe. 🙂
Meiner nicht ganz so bescheidenen Meinung nach sind öffnende Klammern für die Lesbarkeit des Codes fast völlig irrelevant. Es gibt einige Eckfälle, in denen der eine oder andere Stil einen Unterschied macht, aber zum größten Teil wird dies durch die umsichtige Verwendung von Leerzeilen behoben.
FWIW, unsere Codierungsstile bei der Arbeit verwenden einen geringfügigen strukturiertere Form 1 und eine modifizierte Form 3. (C ++)
// blank line is required here if (x) { //This blank line is required y = z; } // blank line is required here too, unless this line is only another "}" if (x) y = z; //allowed if (x) y = z; // forbidden
Ich bin gespannt, ob diejenigen, die Form 2 stark bevorzugen, diese Version von Form 1 finden würden Besser, nur weil die leere Zeile eine stärkere visuelle Trennung ergibt.
Kommentare
- Wie Ihr Beispiel zeigt, ist die Einrückung für die Lesbarkeit so wichtig wie Klammern In der Tat machen einige Sprachen Einrückungen zur einzigen Möglichkeit, Anweisungen zu verschachteln!
- Ok, ich finde Sie ehrlich gesagt inkonsistentes Beispiel schwer zu lesen. Nicht WIRKLICH schwer, aber schwerer als wenn es war konsistent.
- Ich stimme Almo zu. Es ist kein Fall von " ist es wirklich schwer " Bei " ist es definitiv schwieriger, ", auch wenn nicht schwer. Warum also die Dinge schwieriger machen? In den " Spielzeug " Beispielen, die die Leute geben, gibt es natürlich wenig Unterschied. Nach meiner Erfahrung ist es ziemlich häufig erforderlich, wenn ich bösen Code von jemand anderem erbe und dieser Methode 1 verwendet, ihn in Methode 2 umzuwandeln, um der Logik folgen zu können. Wegen der Tatsache, dass es häufig notwendig wird; Es beantwortet automatisch die Frage, welche Methode besser und leichter zu verstehen ist.
- @Dunk: Ich kann keinen Code ergründen, der durch das Austauschen derart irrelevanter Details spürbar verbessert würde.
- @jkerian – Anscheinend haben Sie ' nicht viel Code von anderen geerbt, die das Projekt oder die Firma schon lange verlassen haben. Ich kann ' nicht verstehen, dass jemand mit langjähriger Erfahrung nicht in diese Situation gerät. Andererseits ist die Arbeitssituation jedes ' anders. Wenn Sie " formale " Codeüberprüfungen durchführen müssen, macht die Formatierung einen großen Unterschied. Es ist sehr wichtig, den Code natürlich lesen zu können.Sicher kann ich innehalten und darüber nachdenken, Zahnspangen zusammenzubringen, aber das verlangsamt den Prozess. Ein Weg erfordert keine Pause, die anderen. Das ' ist der Grund, warum ich ' nicht sehe, warum eine andere Wahl empfohlen werden könnte.
Antwort
Ich bin überrascht, dass dies noch nicht angesprochen wurde. Ich bevorzuge den zweiten Ansatz, weil Sie damit den Block einfacher auswählen können.
Wenn die geschweiften Klammern in derselben Spalte und in ihrer eigenen Zeile beginnen und enden, können Sie am Rand oder mit dem Cursor auf Spalte 0 auswählen. Dies entspricht im Allgemeinen einem großzügigeren Bereich mit Mausauswahl oder weniger Tastenanschläge mit Tastaturauswahl.
Ich habe ursprünglich mit geschweiften Klammern in derselben Zeile wie die Bedingung gearbeitet, aber als ich wechselte, stellte ich fest, dass dies die Arbeitsgeschwindigkeit beschleunigte. Es ist natürlich nicht Tag und Nacht, aber es ist etwas, das Sie etwas verlangsamt, wenn Sie mit Klammern neben Ihren Bedingungen arbeiten.
Kommentare
- Oldtimer wie ich verwenden drei Tastenanschläge, um den Block auszuwählen, egal wo sich die verdammten Klammern befinden.
Antwort
Ich persönlich mag den zweiten Weg.
Die Art und Weise, wie ich demonstrieren werde, ist meiner Meinung nach am besten, weil sie zu größter Arbeitsplatzsicherheit führt! Ein Kommilitone von meiner Universität bat mich um Hilfe bei seinen Hausaufgaben und so sah sein Code aus. Das ganze Programm sah aus wie ein einziger Block. Das Interessante ist, dass 95% der Fehler in dem Programm, das er gemacht hat, von nicht übereinstimmenden Zahnspangen stammten. Die anderen 5% waren offensichtlich, sobald die Klammern übereinstimmten.
while(1){ i=0; printf("Enter coded text:\n"); while((s=getchar())!="\n"){ if(i%1==0){ start=(char*)realloc(input,(i+1)*sizeof(char)); if(start==NULL){ printf("Memory allocation failed!"); exit(1);} input=start;} input[i++]=s;} start=(char*)realloc(input,(i+1)*sizeof(char)); if(start==NULL){ printf("Memory allocation failed!!!"); exit(1);} input=start; input[i]="\0"; puts(input);
Kommentare
- Schlecht, schlecht Ich meine schreckliches, schreckliches Beispiel. Das Problem sind nicht die Zahnspangen! ' ist die verrückte Einrückung!
- @Martinho Fernandes Ich dachte, dass das Platzieren von Klammern und Einrückungen zusammenpassen …
- nicht unbedingt. Wenn Sie die obigen Punkte richtig einrücken und dann die Klammerstile nach dem Zufallsprinzip wechseln, werden Sie ' feststellen, dass ' verständlich ist.
- Tatsächlich hat das Nachdenken darüber meine eigene Antwort auf diese Frage motiviert.
- " 95% der Fehler in dem Programm, das er gemacht hat, stammten von Nicht übereinstimmende geschweifte Klammern " – nur in interpretierten Sprachen, nicht kompiliert.
Antwort
Ich persönlich bevorzuge die erste Methode, wahrscheinlich weil ich auf diese Weise PHP zum ersten Mal gelernt habe.
Für einzeilige if
-Anweisungen Ich werde
if (you.hasAnswer()) you.postAnswer();
verwenden, wenn es nicht you.postAnswer();
ist, sondern etwas a viel länger, wie you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);
Ich werde wahrscheinlich auf die fi zurückgreifen Erster Typ:
if (you.hasAnswer) { you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType); }
Ich werde niemals einen Zeilenumbruch verwenden, und ich werde diese Methode niemals verwenden, wenn es auch eine Anweisung.
if (you.hasAnswer()) you.postAnswer(); else you.doSomething()
ist eine theoretische Möglichkeit, aber keine, die ich jemals verwenden würde. Dies müsste in
if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); }
Antwort
umgewandelt werden. erste Methode für mich.
Wenn ich mir die zweite anschaue, fühlt es sich aufgrund der nicht verwendeten Linien (die nur Klammern haben, außer der allerletzten schließenden Klammer) an, als würde sie die Kontinuität von brechen der Code. Ich kann es nicht so schnell lesen, weil ich besonders auf leere Zeilen achten muss, die normalerweise eine Trennung im Codezweck oder ähnliches bedeuten, aber auf keinen Fall „gehört diese Zeile zu einer geschweiften Klammer“ (die nur die Bedeutung wiederholt) Einrückung).
Wie beim Schreiben von Text … ist das Hinzufügen einer Einrückung am Anfang eines Absatzes überflüssig, wenn davor eine Leerzeile steht (doppeltes Vorzeichen der Absatzänderung) Es ist nicht erforderlich, Zeilen für geschweifte Klammern zu verschwenden, wenn wir richtig einrücken.
Außerdem können, wie bereits erwähnt, mehr Code in den Bildschirm eingefügt werden, was ansonsten etwas kontraproduktiv ist.
Antwort
Dies hängt von der Plattform / Sprache / Konventionen ab.
In Java:
void someMethod() { if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); } }
In C #
void someMethod() { if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); } }
In C:
void someMethod() { if (you_hasAnswer()) { you.postAnswer(); } else { you_doSomething(); } }
Ich hasse es, wenn Java-Leute ihren Stil in C # -Code verwenden und umgekehrt.
Kommentare
- Der C-Stil al Wege ärgerten mich. Seien Sie konsequent!
Antwort
Ich kann nur sagen, wenn Sie ein Fan von Methode 3 sind Sie werden von jedem IDE-Code-Formatierer auf der Erde verfolgt.
Antwort
Ich verwende die erste Methode einfach, weil Es ist kompakter und ermöglicht mehr Code auf dem Bildschirm. Ich selbst hatte noch nie ein Problem mit dem Koppeln von geschweiften Klammern (ich schreibe sie immer zusammen mit der Anweisung if
aus, bevor ich die Bedingung hinzufüge In den meisten Umgebungen können Sie zur passenden Klammer springen.
Wenn Sie Klammern visuell koppeln müssten, würde ich die zweite Methode bevorzugen. Dies ermöglicht jedoch weniger Code gleichzeitig, sodass Sie mehr scrollen müssen. Und das hat zumindest für mich einen größeren Einfluss auf das Lesen von Code als ordentlich ausgerichtete Klammern. Ich hasse es zu scrollen. Wenn Sie jedoch über eine einzelne if
-Anweisung scrollen müssen, ist diese höchstwahrscheinlich zu groß und muss überarbeitet werden.
Aber; Das Wichtigste ist die Konsistenz. Verwenden Sie das eine oder das andere – niemals beides!
Antwort
Als ich mit 12 das erste Mal Programmieren lernte, zog ich die Klammern an die nächste Zeile, weil die Microsoft-Codierungs-Tutorials so sind. Zu dieser Zeit habe ich auch mit 4-Leerzeichen-TABS eingerückt.
Nach einigen Jahren lernte ich Java und JavaScript und sah mehr Klammern in derselben Zeile, also änderte ich mich. Ich begann auch mit Leerzeichen mit zwei Leerzeichen einzurücken.
Kommentare
- +1, -1. Warum sollten Sie NICHT mit Tabulatoren einrücken, da jeder Editor die Tabulatorlänge an Ihre beliebige Länge anpassen kann? Andernfalls führen Sie viele von uns, die echte Einrückungen bei 8 mögen, dazu, Ihren Code zu verfluchen.
Antwort
Es gibt eine vierte Option, die die geschweiften Klammern ausrichtet, aber keinen Platz verschwendet:
if (you.hasAnswer()) { you.postAnswer(); i.readAnswer(); } else { you.doSomething(); }
Das einzige Problem ist, dass die meisten Autoformatierer der IDE daran ersticken.
Kommentare
- … wie auch die meisten Programmierer, die daran ersticken würden.
- Das scheint schrecklich Sie müssen sich zusätzliche Mühe geben, wenn Sie eine Zeile oben einfügen oder die obere Zeile entfernen möchten. Sie können ' nicht einfach die Zeile löschen und fortfahren, Sie müssen sich daran erinnern um die geschweifte Klammer wieder einzufügen.
- lol das ist großartig! 🙂 besser als der erste Stil!
- Anscheinend hat es sogar einen Namen. Der Horstman Syyle wird in Wikipedia erwähnt. Ich ' habe mit einer Codebasis wie gearbeitet Dies ist ' wirklich nicht schlecht Verwenden Sie.
Antwort
Es hängt alles von Ihnen ab, solange Sie nicht an einem Projekt arbeiten, in dem einige arbeiten Der Projektmanager hat Codierungsbeschränkungen oder einige Standards festgelegt, denen alle Programmierer, die an diesem Projekt arbeiten, beim Codieren folgen müssen.
Ich persönlich würde die 1. Methode bevorzugen.
Außerdem habe ich nicht verstanden, was Sie mit der 3. Methode zeigen möchten?
Ist das nicht ein falscher Weg? Stellen Sie sich zum Beispiel eine Situation wie folgt vor:
if (you.hasAnswer()) you.postAnswer(); else you.doSomething();
Was ist nun, wenn jemand weitere Anweisungen in die if block?
In diesem Fall gibt der Compiler bei Verwendung der dritten Methode den Syntaxfehler aus.
if (you.hasAnswer()) you.postAnswer1(); you.postAnswer2(); else you.doSomething();
Kommentare
- Noch schlimmer wäre es, wenn jemand mitkam und tat: if (you.hasAnswer ()) you.postAnswer (); sonst you.doSomething (); you.doSomethingElse (); – ' ist ein Rezept für subtile Fehler, über die das Auge leicht hinwegrutschen kann, und der Compiler wird ' nicht helfen,
- @FinnNk: Genau!
- Wenn jemand eine weitere Anweisung hinzufügen möchte, kann er die Klammern selbst einfügen. Jeder Programmierer, der sein Geld wert ist, sollte das wirklich herausfinden können.
- Ich wollte sagen, dass seine dritte Methode falsch ist.
- @Robert Harvey, I ' Ich habe gesehen, dass sehr erfahrene Programmierer beim Ändern des vorhandenen Codes das Hinzufügen der geschweiften Klammern übersehen haben. Ich denke, das Problem ist, dass Einrückungen ein viel stärkerer Hinweis auf die Bedeutung sind als geschweifte Klammern (zumal es mehrere Klammerstile gibt), so dass es ' ziemlich einfach ist, die fehlende Klammer zu übersehen, wenn die Einrückung sieht so aus, wie Sie es erwarten.
Schreibe einen Kommentar