Ist ein Coding-Style-Prinzip - zB das Single-Exit-Prinzip - wirklich gut? Immer oder nur manchmal? Wie viel Unterschied macht es wirklich?
Was auch immer Ihre Meinung ist, dies sind offensichtlich subjektive Fragen. Oder sind Sie?
Hat jemand versucht, eine objektive, wissenschaftlich strenge Untersuchung der Prinzipien des Codierungsstils durchzuführen?
Ich kann mir nicht vorstellen, wie jemand eine Doppelblindstudie zur Lesbarkeit durchführen würde, aber vielleicht ist Doppelwissen möglich - verwenden Sie Studenten, die nicht über das Prinzip Bescheid wissen, das als Fächer behandelt wird, und Nicht-Programmierer, um die Studie durchzuführen.
coding-style
Steve314
quelle
quelle
single-exit principle
trifft das nicht wirklich auf C ++ zu, da RAIIbreak
und Weise ,goto
oderreturn
machen. IOW Single Exit ist in C ++ kein absolutes Muss, aber so sehe ich es in C und den meisten anderen Sprachen. Aber es ist immer noch relevant in einem nicht strengen Sinne.Antworten:
Ich wiederhole den Kommentar von deadalnix: lies Code Complete 2 . Der Autor (Steve McConnell) erörtert ausführlich den Codierungsstil und bezieht sich häufig auf Veröffentlichungen und Daten.
quelle
Ich bezweifle sehr, dass eine Studie zu diesem Thema zu objektiven Ergebnissen führen könnte, und ich werde skeptisch bleiben, bis mir überzeugende Forschungsergebnisse vorliegen.
Programmierer, die jahrelang Code gelesen und geschrieben haben, der einem bestimmten Codierungsstil folgte, werden ihn offensichtlich besser lesbar finden als einen perfekten Codierungsstil, den sie zum ersten Mal in ihrem Leben sehen würden.
Genau das gleiche gilt für das gängigste QWERTZ-Layout - es ist leicht zu beweisen, dass es in Bezug auf die Ergonomie nicht optimal ist. .
Verbesserte Alternativen wie Dvorak oder Colemak haben sich jedoch noch nie durchgesetzt und sind unwahrscheinlich. Und deshalb sind die Menschen mit ihnen nicht produktiver - Tatsache. Auch wenn sie abstrakt überlegen sind.
Es wäre auch schwierig, Probanden zu finden, die keiner vorherigen Programmieranwendung ausgesetzt waren (da dies das Ergebnis unserer Studie beeinträchtigen würde), ABER Programmierkenntnisse UND den Willen, über einen Zeitraum an einer Studie teilzunehmen, der ausreicht, um beides zu belegen -Zeitvorteile und Langzeitvorteile, damit sie gegeneinander abgewogen werden können ... (Ich weiß nicht, ob sie sich gegenseitig ausschließen, aber die Forscher konnten nicht einfach davon ausgehen, dass sie es niemals sind).
quelle
Die Antwort ist ein definitives NEIN! Sind "break" und "continue" schlechte Programmierpraktiken? ist eine Untergruppe dieser Frage, daher beginne ich mit einer kaum veränderten Antwort darauf ...
Sie können Programme ohne break-Anweisungen [neu] schreiben (oder aus der Mitte von Schleifen zurückkehren, die dasselbe tun). Dabei müssen Sie jedoch möglicherweise zusätzliche Variablen und / oder Codeduplizierungen einführen, die das Programm in der Regel schwerer verständlich machen. Pascal (die Programmiersprache der späten 1960er Jahre) war aus diesem Grund besonders für Anfängerprogrammierer sehr schlecht.
Es gibt ein Informatik-Ergebnis namens Kosarajus Hierarchie der Kontrollstrukturen, das aus dem Jahr 1973 stammt und das in Knuths (berühmterem) Aufsatz Structured Programming ( Strukturierte Programmierung) erwähnt wird . Was S. Rao Kosaraju 1973 bewies, ist, dass es nicht so ist Es ist möglich, alle Programme mit mehrstufigen Unterbrechungen der Tiefe n in Programme mit einer Unterbrechungstiefe von weniger als n umzuschreiben, ohne zusätzliche Variablen einzufügen. Aber sagen wir, das ist nur ein rein theoretisches Ergebnis. (Fügen Sie einfach ein paar zusätzliche Variablen hinzu ?! Sicher können Sie das tun, um sich in der Gruppe der 3K + -Benutzer auf stackexchange zu fühlen ...)
Was aus Sicht der Softwareentwicklung weitaus wichtiger ist, ist eine neuere Veröffentlichung von Eric S. Roberts aus dem Jahr 1995 mit dem Titel Loop-Exits und strukturierte Programmierung: Wiedereröffnung der Debatte (doi: 10.1145 / 199688.199815). Roberts fasst mehrere empirische Studien zusammen, die von anderen vor ihm durchgeführt wurden. Wenn beispielsweise eine Gruppe von Schülern vom Typ CS101 aufgefordert wurde, Code für eine Funktion zu schreiben, die eine sequentielle Suche in einem Array implementiert, sagte der Autor der Studie Folgendes zu den Schülern, die eine Unterbrechung / Rückkehr verwendeten, um die sequentielle Suche zu beenden Suchschleife genau dann, wenn das Element gefunden wurde:
Roberts sagt auch, dass:
Ja, Sie sind vielleicht erfahrener als CS101-Studenten, aber ohne die break-Anweisung (oder äquivalent return / goto from the middle of loops) zu verwenden, schreiben Sie irgendwann Code, der zwar nominell schön strukturiert ist, aber in Bezug auf zusätzliche Logik haarig genug ist Variablen und Codeduplizierung, die jemand, wahrscheinlich Sie selbst, mit Logikfehlern behebt, während er versucht, eine Passe-Idee für einen "korrekten" Codierungsstil zu verfolgen.
Neben den return / break-Anweisungen gibt es hier ein größeres Problem. Diese Frage ist also etwas weiter gefasst als die zu Pausen. Ausnahmebehandlungsmechanismen verletzen nach Ansicht einiger auch das Paradigma eines einzelnen Austrittspunkts
Grundsätzlich spricht sich jeder, der oben argumentiert hat, dass das Prinzip des einmaligen Ausstiegs auch heute noch nützlich ist, gegen das Paradigma der Ausnahmebehandlung aus, es sei denn, er wird in der in diesem letzten Link beschriebenen äußerst einschränkenden Weise verwendet. Diese Richtlinien beschränken grundsätzlich alle Ausnahmen aus einer Funktion auf throw (), dh die Weitergabe von Ausnahmen zwischen Funktionen ist überhaupt nicht zulässig. Genießen Sie Ihren neuen Pascal mit C ++ - ähnlicher Syntax.
Ich sehe, woher kam der Begriff "nur eine Rückkehr"?Da die vorherrschende Meinung auf dieser Website im Gegensatz zu meiner hier veröffentlichten Meinung steht, verstehe ich voll und ganz, warum ich bereits abgelehnt worden bin, obwohl ich hier die erste Antwort bin, die tatsächlich etwas liefert, nach dem die Frage gestellt wurde: Einige Informationen zu den aktuellen Usability-Tests konzentrierten sich auf das Problem des einmaligen Zugriffs. Ich denke, ich sollte nicht zulassen, dass Wissen Vorurteilen im Wege steht, insbesondere auf einer Gamification-Site. Ich werde mich ab sofort an die Bearbeitung von Wikipedia halten. Zumindest dort werden Informationen aus guten Quellen geschätzt und vage oder falsche Behauptungen, die so tun, als würden sie von Quellen gestützt, verdienen schließlich ein Verbot. Auf dieser Seite passiert genau das Gegenteil: Meinungen, die nicht durch Fakten untermauert sind, dominieren. Ich erwarte voll und ganz, dass ein Mod diesen letzten Teil löscht, aber zumindest der Typ wird wissen, warum du mich hier als Mitwirkenden für immer verloren hast.
quelle
http://dl.acm.org/citation.cfm?id=1241526
http://www.springerlink.com/content/n82qpt83n8735l7t/
http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=661092
[Ihre Fragen scheinen mit einem einzigen Wort "Ja" beantwortet zu sein. Mir wurde jedoch gesagt, dass das Bereitstellen kurzer Antworten die Frage "ablehnt". Wenn Sie der Meinung sind, dass ich abgewiesen wurde, markieren Sie die Antwort, damit ein Moderator sie löschen kann.]
quelle
Is a coding style principle - e.g. the single-exit principle - really a good thing?
- das gibt Kontext zu der Frage, die er stellt, über Codierungsstile. Darüber hinaus ist der Codierungsstil nicht mit der Programmiermethode identisch, insbesondere mit Entwurfsmethoden auf hoher Ebene, die im Mittelpunkt des IEEE-Artikels stehen (von den Autoren eindeutig angegeben). Deshalb sage ich "nein" - die Bereiche sind völlig unterschiedlich.Menschen, die immer noch daran interessiert sind, ob sie nur einen oder mehrere Ausgänge haben, stecken noch in den späten 1960er Jahren fest. Damals war eine solche Diskussion wichtig, da wir uns noch in den Kinderschuhen eines strukturierten Programmierers befanden, und es gab zahlreiche Lager, in denen behauptet wurde, dass die Ergebnisse des Bohm-Jacopini-Satzes für strukturierte Programme nicht für alle Programmierkonstrukte universell anwendbar sind.
Es ist etwas, das vor langer Zeit hätte beigelegt werden sollen. Nun, es wurde entschieden (beinahe vier Jahrzehnte, um genau zu sein, sowohl in der akademischen Welt als auch in der Industrie), aber die Leute (die absolut pro oder gegen sind) haben nicht aufgepasst.
Was den Rest meiner Antworten angeht, ist alles relativ (was ist nicht in der Software?):
Ja. Meistens für den allgemeinen Fall mit Vorbehalten, die für Randfälle und sprachspezifische Programmierkonstrukte spezifisch sind.
Meistens.
Hängt davon ab.
Lesbarer Code im Vergleich zu nicht lesbarem Code. Erhöhte Komplexität (die wir inzwischen kennen sollten, erhöht die Wahrscheinlichkeit, Fehler einzuführen) im Vergleich zu einfacherer Komplexität (und damit geringerer Wahrscheinlichkeit von Fehlern). Sprachen, deren Compiler keine implizite Rückgabe hinzufügen (z. B. Pascal, Java oder C #) Standardeinstellung ist int (C und C ++).
Am Ende ist es eine Fertigkeit, die mit Mannstunden hinter einer Tastatur geschliffen wurde. Manchmal ist es in Ordnung, mehrere return-Anweisungen zu haben, wie hier (in einigen Pascal'esque-Pseudocodes):
Die Absicht ist klar, und der Algorithmus ist klein genug und unkompliziert genug, um die Erstellung einer 'Flag'-Variablen nicht zu rechtfertigen, die den in einem einzelnen Rückgabepunkt verwendeten Rückgabewert enthält. Der Algorithmus könnte fehlerhaft sein, seine Struktur ist jedoch so einfach, dass der Aufwand zum Erkennen eines Fehlers (höchstwahrscheinlich) vernachlässigbar ist.
Manchmal ist es nicht so (hier mit einem C-ähnlichen Pseudocode):
Hier hat der Algorithmus keine einfache Struktur und die switch-Anweisung (eine C-artige) erlaubt Fall-Through-Schritte, die absichtlich als Teil des Algorithmus ausgeführt werden können oder nicht.
Vielleicht ist der Algorithmus korrekt, aber schlecht geschrieben.
Oder vielleicht, durch äußere Kräfte über die Fähigkeit des Programmierers, ist dies die tatsächliche (und richtig) Darstellung eines rechtmäßig benötigt Algorithmus.
Vielleicht ist es falsch.
Um die Wahrheit darüber herauszufinden, ist weitaus mehr Aufwand erforderlich als im vorherigen Beispiel. Und hierin liegt etwas, woran ich fest glaube (wohlgemerkt, dass ich keine formalen Studien habe, um dies zu belegen):
Angenommen, ein Codeausschnitt ist korrekt:
Mehrere return-Anweisungen erhöhen die Lesbarkeit und Einfachheit eines solchen Code-Snippets, wenn das Snippet einen einfachen Algorithmus mit einer von Natur aus einfachen Ablaufstruktur darstellt. Mit einfach meine ich nicht klein, sondern von Natur aus verständlich oder selbsterklärend , was keinen unverhältnismäßigen Leseaufwand erfordert (noch Menschen dazu bringen, sich zu übergeben, die Mutter von jemandem zu verfluchen oder eine Kugel zu schlucken, wenn sie sie lesen müssen). )
Eine einzelne return-Anweisung erhöht die Lesbarkeit und Einfachheit eines solchen Codes, wenn der Rückgabewert entweder während der Ausführung des Algorithmus berechnet wird oder wenn die Schritte des Algorithmus, die für die Berechnung verantwortlich sind, an einer Stelle in der Struktur des Algorithmus zusammengefasst werden können .
Eine einzelne return-Anweisung verringert die Lesbarkeit und Einfachheit eines solchen Codeteils, wenn Zuweisungen zu einer oder mehreren Flag-Variablen erforderlich sind, wobei die Positionen solcher Zuweisungen im gesamten Algorithmus nicht einheitlich sind.
Mehrere return-Anweisungen verringern die Lesbarkeit und Einfachheit eines solchen Codeteils, wenn die return-Anweisungen nicht gleichmäßig über den Algorithmus verteilt sind und wenn sie sich gegenseitig ausschließende Codeblöcke abgrenzen, deren Größe oder Struktur untereinander nicht einheitlich sind.
Dies hängt eng mit der Komplexität eines fraglichen Codeausschnitts zusammen. Und dies hängt wiederum mit zyklomatischen und Halbstandkomplexitätsmessungen zusammen. Daraus könnte man folgendes beobachten:
Je größer eine Subroutine oder eine Funktion ist, desto größer und komplexer ist ihre interne Kontrollflussstruktur und desto größer ist die Wahrscheinlichkeit, dass Sie vor der Frage stehen, ob mehrere oder einzelne return-Anweisungen verwendet werden sollen.
Das Fazit daraus ist: Halten Sie Ihre Funktionen klein und tun Sie nur eine Sache (und tun Sie es gut). Wenn sie nominell kleine zyklomatische und Halstead-Komplexitätsmetriken aufweisen, müssen sie nicht nur höchstwahrscheinlich korrekt sein und Aufgaben ausführen, die nachvollziehbar sind, sondern ihre inneren Strukturen sind auch relativ offensichtlich.
Dann, und nur dann, können Sie ganz einfach und ohne viel Schlafverlust entscheiden, ob Sie eine einzelne Rückgabe und mehrere Rückgaben verwenden möchten, ohne das Risiko einzugehen, dass bei beiden Entscheidungen Fehler auftreten.
Man könnte all dies auch betrachten und darauf hinweisen, dass Menschen, die mit dem Problem der einfachen oder mehrfachen Rückgabe zu kämpfen haben, entweder aufgrund von Unerfahrenheit, Dummheit oder mangelnder Arbeitsmoral keinen sauberen Code schreiben und dazu neigen, diesen zu schreiben monströse Funktionen unter völliger Nichtbeachtung von zyklomatischen und halbstaatlichen Maßnahmen.
quelle