Ich habe in den letzten Jahren hauptsächlich mit C # und SQL gearbeitet. Jeder Programmierer, mit dem ich in dieser Zeit zusammengearbeitet habe, pflegte die öffnende Klammer einer Funktions- oder Kontrollflussanweisung in eine neue Zeile zu setzen. Damit ...
public void MyFunction(string myArgument)
{
//do stuff
}
if(myBoolean == true)
{
//do something
}
else
{
//do something else
}
Es hat mich immer beeindruckt, wie viel Platz verschwendet wird, insbesondere bei if / else-Anweisungen. Und ich weiß, dass es in späteren Versionen von C # Alternativen gibt, wie zum Beispiel:
if(myBoolean == true)
//do something on one line of code
Aber kaum jemand hat sie benutzt. Alle machten die Sache mit der geschweiften Klammer auf der Newline.
Dann habe ich mich nach langer Abwesenheit wieder mit JavaScript beschäftigt. In meinem Gedächtnis haben JavaScript-Entwickler früher genau dasselbe getan wie geschweifte Klammern und Zeilenumbrüche, aber mit all den schick neuen Bibliotheken und Dingen haben die meisten Entwickler die öffnende Klammer nach der Deklaration eingefügt:
function MyJavaScriptFunction() {
//do something
}
Sie können den Sinn daran erkennen, dass die Verwendung von Closures und Funktionszeigern in JavaScript populär geworden ist. Dadurch wird viel Platz gespart und die Lesbarkeit verbessert. Also fragte ich mich, warum es in C # nicht als erledigt angesehen wurde. Wenn Sie das obige Konstrukt in Visual Studio 2013 ausprobieren, wird es tatsächlich für Sie neu formatiert und die öffnende Klammer in eine neue Zeile gesetzt!
Jetzt habe ich diese Frage in Code Review SE gesehen: https://codereview.stackexchange.com/questions/48035/questions-responses-let-me-tell-you-about-you In dem ich das in Java gelernt habe, a Sprache, mit der ich nicht allzu vertraut bin. Es wird als hinderlich angesehen, die geschweiften Klammern direkt nach der Deklaration in moderner JavaScript-Form zu öffnen.
Ich hatte immer verstanden, dass C # ursprünglich Java nachgebildet war und viele der gleichen basalen Codierungsstandards einhielt. Aber in diesem Fall scheint es nicht. Ich nehme also an, dass es einen guten Grund geben muss: Was ist der Grund? Warum erzwingen C # -Entwickler (und Visual Studio) das Öffnen von geschweiften Klammern in einer neuen Zeile?
quelle
if(myBoolean == true)
ergibt das für mich wenig Sinn. Während wir dabei sind, während nichtif ((myBoolean == true) == true)
? Nurif (myBoolean)
und das ist genug. Tut mir leid, mein Haustier.Antworten:
Die Klammer am Ende der Zeile ist der alte K & R C-Standard aus Brian Kernighans und Dennis Ritchies Buch The C Programming Language , das sie 1978 veröffentlichten, nachdem sie das UNIX-Betriebssystem und die C-Programmiersprache miterfunden hatten (ich glaube, C war es) meist von Ritchie entworfen), bei AT & T.
Früher gab es Flammenkriege um "den einen wahren Zahnspangenstil".
Ritchie erfand die C-Sprache und Kernighan schrieb das erste Tutorial, in dem Computerbildschirme nur wenige Textzeilen zeigten. Tatsächlich begann die Entwicklung von UNICS (später UNIX) auf einem DEC PDP-7, der eine Schreibmaschine, einen Drucker und ein Papierband als Benutzeroberfläche verwendete. UNIX und C wurden auf dem PDP-11 mit 24-Zeilen-Textterminals fertiggestellt. Der vertikale Raum war also in der Tat sehr knapp. Wir haben heute alle etwas bessere Displays und Drucker mit höherer Auflösung, oder? Ich meine, ich weiß nichts über dich, aber ich habe gerade drei (3) 24 "1080p-Displays vor mir. :-)
Außerdem handelt es sich bei so viel von diesem kleinen Buch, The C Programming Language, um Codebeispiele, bei denen die geschweiften Klammern an den Zeilenenden und nicht in den eigenen Zeilen angebracht wurden. Dies sparte angeblich eine beträchtliche Menge Geld beim Drucken.
Was wirklich wichtig ist, ist die Konsistenz während eines Projekts oder zumindest innerhalb einer bestimmten Quellcodedatei.
Es gibt auch wissenschaftliche Studien, die belegen, dass die geschweifte Klammer in einer eigenen Zeile (die tatsächlich auf der gleichen Ebene eingerückt ist wie der Code) das Codeverständnis verbessert, ungeachtet dessen, was die Leute von der Ästhetik halten. Es macht dem Leser visuell und instinktiv sehr deutlich, welcher Code in welchem Kontext abläuft.
C # hat es übrigens immer unterstützt, einen einzelnen Befehl nach einem Verzweigungsausdruck auszuwerten. Tatsächlich ist das das einzige, was es auch jetzt noch tut. Wenn Sie den Code nach einem Verzweigungsausdruck in geschweifte Klammern setzen, wird dieser Befehl nur zu einem Goto (der Compiler erstellt den Gültigkeitsbereich mithilfe von JMP-Anweisungen). C ++, Java, C # und JavaScript basieren größtenteils mehr oder weniger auf C mit denselben zugrunde liegenden Analyseregeln. In diesem Sinne basiert C # nicht auf Java.
Zusammengefasst, das ist ein bisschen eine religiöse / flame-war Thema. Es gibt jedoch Studien, die ziemlich deutlich machen, dass die Anordnung von Code in Blöcken das menschliche Verständnis verbessert . Dem Compiler ist das egal. Dies hängt aber auch damit zusammen, warum ich nach einer Verzweigung ohne geschweifte Klammern nie eine Codezeile einfüge - für mich oder einen anderen Programmierer ist es einfach zu einfach, später eine andere Codezeile einzufügen und darauf hinzuweisen, dass dies nicht der Fall ist im selben Kontext mit der Zeile direkt davor oder danach ausführen.
BEARBEITEN : Schauen Sie sich einfach den Apple-
goto fail
Fehler an, um ein perfektes Beispiel für genau dieses Problem zu finden, das schwerwiegende Konsequenzen für die reale Welt hatte.wird...
doSomethingElse()
Wird in diesem Fall immer ausgeführt, unabhängig vom Ergebnis des Tests. Da es jedoch auf der gleichen Ebene eingerückt ist wie diedoSomething()
Anweisung, kann es leicht übersehen werden. Das ist nicht wirklich fraglich. Studien belegen dies. Dies ist eine große Quelle von Fehlern, die während der Wartung in den Quellcode eingedrungen sind.Trotzdem gebe ich zu, dass die JavaScript-Schließungssyntax mit geschweiften Klammern in ihren eigenen Zeilen ein wenig albern aussieht ... ästhetisch. :-)
quelle
begin
undend
anstelle von geschweiften Klammern, was solche Fehler wirklich schwer zu übersehen macht, und es auch strenger in Bezug auf die Semikolon-Platzierung - aber mit Ausgaben 4 Tage im letzten Jahr, um ein Problem in Embedded C zu beheben, das letztendlich auf die fehlende Platzierung von geschweiften Klammern zurückzuführen war ..... Ich denke, es sollte eine Compiler-Option geben, die geschweifte Klammern für Steueranweisungen obligatorisch macht!Der Grund, warum C # -Entwickler dies tun, liegt darin, dass dies die Standardeinstellung des automatischen Formatierungsprogramms von Visual Studio ist. Diese Einstellung kann zwar geändert werden, die meisten Benutzer tun dies jedoch nicht. Daher müssen sich alle Entwickler in einem Team der Mehrheit anschließen.
Warum dies der Standard in Visual Studio ist, weiß ich nicht.
quelle
Wie ich in dieser Antwort hier vermutet habe - https://softwareengineering.stackexchange.com/a/159081/29029 -, könnte die Entscheidung, sich für Allman zu entscheiden, ein Zeichen der Pascal-Tradition sein, da Hejlsberg Delphi vor seinem Entwurf von C # erstellt hat. . Entspricht dem Pascal-Fall für Methodennamen.
Persönlich glaube ich daran, dem Sprichwort "in Rom zu tun, wie es die Römer tun" zu folgen. Ich verwende Allmans in C #, aber K & R in Java. Ich bin so daran gewöhnt, dass es mich nervt, die Konvention so oder so zu wechseln.
Ich bin der Meinung, dass eine gewisse Konventionsvielfalt für einen "mehrsprachigen" Entwickler tatsächlich von Vorteil ist, da er sich leichter merken kann, in welcher Sprache er gerade programmiert und verschiedene Gewohnheiten leicht unterscheiden kann. Es ist sozusagen ein mentales Äquivalent zum Muskelgedächtnis.
quelle
goto fail
ansehen, ist die Verwendung des Einzugs zur Steuerung des Programmflusses das, was Menschen natürlich tun möchten. Was Sie also sehen, ist das, was ausgeführt wird. Wenn es falsch eingerückt ist, funktioniert es nicht. Zu dekodieren, was diese Klammern bedeuten, ob sie tatsächlich den Einzug widerspiegeln, ist zusätzliche Arbeit, die über das Verstehen des Programms hinausgeht. Einrückung ist für geschweifte Klammern überflüssig. Warum wird sie von Programmierern verwendet, wenn die geschweiften Klammern nützlich sind? Deep Nesting ist in keiner Sprache verständlich. Jus 'sayin'.Die Konvention , dass Sie mit Java verbinden ist der K & R - Stil, oder der „einzig wahre Stütze Stil“ und stammt ursprünglich aus C. Dieser Seite indent-Stil aus der altehrwürdigen Jargon File zeigt , wie alt die Unterscheidung ist.
Ich habe immer gedacht, dass der Allman-Stil und seine Varianten die Einstellung der Autoren zum Code widerspiegeln und die Blocktrennzeichen auf die Ebene von Schlüsselwörtern heben, ähnlich wie einige Sprachen "Anfang" und "Ende" um Codeblöcke verwenden.
quelle