Gibt es wissenschaftlich fundierte Studien zu Kodierungsprinzipien? [geschlossen]

25

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.

Steve314
quelle
5
Möglicherweise möchten Sie den Code vollständig lesen. Alles ist nicht messbar, aber vieles ist es und Sie finden in diesem Buch einen guten Überblick mit Rohdaten oder Quellen.
Deadalnix
Es hängt auch stark von der Sprache ab, einige Prinzipien gelten für bestimmte Sprachen und nicht für andere. Zum Beispiel single-exit principletrifft das nicht wirklich auf C ++ zu, da RAII
Martin York
@Loki - Ich musste darüber nachdenken und bin mir nicht sicher, ob ich damit einverstanden bin. Es ist richtig, dass RAII zu einem großen Teil für die Bewältigung von Ausnahmen ausgelegt ist, die alternative Ausstiegspunkte darstellen, aber (zumindest für einige Leute) als alternative alternative Ausstiegspunkte gelten - und nicht wirklich gegen das Prinzip des einmaligen Ausstiegs in der Art breakund Weise , gotooder returnmachen. 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.
Steve314
1
@ Steve314, der Artikel ist zumindest in weiter Ferne relevant - er skizziert einen Entwurf für eine Methodik eines solchen Experiments, was aufgrund eines offensichtlichen Mangels an ordnungsgemäß aufgezeichneten experimentellen Beweisen in diesem Bereich sehr wichtig ist.
SK-logic

Antworten:

11

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.

M. Dudley
quelle
Grundlegender und gut dargestellter Überblick über die professionelle Softwareentwicklung, hoffe, dass ich eines Tages einen ähnlichen Überblick über die Qualitätssicherung finde. Besonders hilfreich für mich waren die Kapitel Defensive Programming und Pseudocode Programming. Das Kapitel über kollaborative Entwicklungspraktiken scheint das überzeugendste zu sein, das ich bisher zu diesen Themen gelesen habe.
gnat
Ich habe dieses Buch nicht gelesen und sollte es vielleicht auch, aber sind diese referenzierten Artikel - basierend auf den Kommentaren in der Antwort der Mücken - wirklich wissenschaftlich streng und objektiv? Wenn die Antwort "so viel wie möglich" ist, welche Kompromisse waren notwendig? War es, wie ich in der Frage angedeutet habe, notwendig, den Doppelblind durch einen schwächeren Standard zu ersetzen?
Steve314
@ Steve314: Ich weiß nicht, ich habe die Quellen nicht überprüft! Es ist jedoch nicht immer wissenschaftliche Genauigkeit erforderlich, um Best Practices zu etablieren. Eine Diskussion der Vor- und Nachteile ist manchmal ausreichend.
M. Dudley
@emddudley - absolut wahr, aber nicht wirklich worum es bei dieser Frage ging.
Steve314
@ Steve314: Code Complete wäre ein guter Ausgangspunkt für Sie, und ich bin zuversichtlich, dass sich einige seiner Referenzen mit dem Thema der wissenschaftlichen Analyse des Codierungsstils befassen.
M. Dudley
12

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).

Konrad Morawski
quelle
1
Cool, ich hatte noch nie von Colemak gehört
CaffGeek
1
@Chad noch weniger bekannt ist Carpal X, mit dem ich eine Weile gespielt habe. Ich fand es schöner als Colemak (ich erreichte 90-100 wpm mit Carpalx). Auch wenn Sie nicht beabsichtigen, auf exotische Layouts umzusteigen, ist die carpalx-Website äußerst interessant, wenn es darum geht, Tastaturlayouts zu bewerten und zu optimieren und genetische Algorithmen für diese Kategorie von Problemen zu verwenden. Siehe mkweb.bcgsc.ca/carpalx
Konrad Morawski
1
Manchmal ist der marginale Nutzen eines alternativen Ansatzes groß genug, um die Kosten für die Übernahme zu rechtfertigen. sonst würden wir alle noch Assembler und Fortran programmieren. Diese Antwort beantwortet nicht wirklich die ursprüngliche Frage, ob es tatsächlich marginale Vorteile gibt oder nicht. Im Dvorak-Beispiel gibt es zweifellos und es wurde bewiesen, aber sie sind nicht groß genug, um das Lernen von Dvorak zu rechtfertigen.
Jeremy
@ Jeremy "Diese Antwort beantwortet nicht wirklich die ursprüngliche Frage, ob es tatsächlich marginale Vorteile gibt oder nicht" - das OP fragte nicht direkt nach den Ergebnissen solcher Studien und fragte, ob jemand versucht habe, solche Studien durchzuführen. Das ist eher eine offene Frage. Ich antwortete mit ein paar logischen Gründen, warum dies technisch schwierig sein würde und warum die Ergebnisse einer solchen Studie wahrscheinlich erheblich durch statistisches Rauschen verunreinigt wären. Wenn meine Antwort aus den von Ihnen angegebenen Gründen als nicht nützlich erachtet wurde, wurde ich meiner Meinung nach zu Unrecht abgelehnt.
Konrad Morawski
1
@Jeremy der Kern dieser Adoptionskosten ist, dass die Leute mit einem minderwertigen Werkzeug eine bessere Leistung erbringen, solange sie mehr Übung damit hatten. Und genau dies würde sich in jeder Studie zeigen, die versucht zu untersuchen, wie gut ihre Probanden mit unterschiedlichen Codierungsstilen umgehen. Das Rauschen, das durch ihre vorherige Vertrautheit / Unvertrautheit mit den Codierungsstilen verursacht wird, die sie verwenden würden, würde die Auswirkungen angeborener Eigenschaften dieser Stile in den Schatten stellen. Es sei denn, Sie haben den Spielplatz geebnet, indem Sie komplette Anfänger aufgenommen haben. Dies ist jedoch eine praktische Schwierigkeit, wie ich im letzten Absatz meiner Antwort ausgeführt habe.
Konrad Morawski
4

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:

Ich habe noch keine Person gefunden, die versucht hat, ein Programm mit [diesem Stil] zu erstellen, das eine falsche Lösung hervorgebracht hat.

Roberts sagt auch, dass:

Schüler, die versuchten, das Problem zu lösen, ohne eine explizite Rückkehr aus der for-Schleife zu verwenden, schnitten viel weniger gut ab: Nur sieben der 42 Schüler, die diese Strategie versuchten, schafften es, korrekte Lösungen zu generieren. Diese Zahl entspricht einer Erfolgsquote von weniger als 20%.

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.

Fizz
quelle
Ich habe dies nicht abgelehnt, aber auf Ihrem "Aber dabei müssen Sie möglicherweise zusätzliche Variablen und / oder Codeduplizierungen einführen, die das Programm normalerweise schwieriger zu verstehen machen." Punkt, das ist eine subjektive Behauptung. Ich bin damit einverstanden, dass das Hinzufügen einer Variablen oder einer Codevervielfältigung das Verstehen erschwert, das Hinzufügen eines Goto jedoch auch das Verstehen erschwert. Außerdem kann der durch das Vervielfältigen verursachte Schaden möglicherweise dadurch verringert werden, dass der vervielfältigte Code in eine Funktion zerlegt wird (obwohl sich IMO bewegt) Komplexität im Aufrufdiagramm beseitigt es nicht automatisch.
Steve314
Ich habe Ihren Standpunkt zum Papier von 1995 erst nach diesem letzten Kommentar gesehen und mich dazu entschlossen, diesen interessanten Punkt zu unterstützen. Ich denke, Ihre Ablehnung ist möglicherweise größer, weil Ihr Beitrag lang ist und mit einem subjektiven Punkt beginnt. Daher hat der Ablehnende wahrscheinlich nicht alles gelesen (das gleiche wie ich zuerst). Grundsätzlich ist es eine gute Idee, Ihren wahren Punkt frühzeitig vorzustellen.
Steve314
Wie dem auch sei, ich denke , eine Menge Leute , von Ausnahmen als eine Art denken alternative alternative Ausstiegspunkte - weil sie für Fehlerfälle gemeint sind (Art) sie nicht wirklich zählen. Ich verstehe aber, dass das ein bisschen sprachkulturell ist. In einigen Sprachen ist "Ausnahme" mehr als der Name - ein außergewöhnlicher Erfolgsfall ist gültig (und IIRC Stroustrup hat so etwas über C ++ gesagt und einen philosophischen Punkt darüber aufgeworfen, ob ein Fehler ein Fehler ist, wenn er behandelt wird). Einige sagen sogar, dass Ausnahmen nur ein weiterer Kontrollfluss sind, der verwendet werden kann, wenn er den von Ihnen benötigten Kontrollfluss liefert.
Steve314
1
@ Steve314 "Außerdem kann der Schaden, der durch die Vervielfältigung entstanden ist, möglicherweise dadurch verringert werden, dass der vervielfältigte Code in eine Funktion zerlegt wird." Außer Kontrolle geratener und nicht sichtbarer Teil einer Funktionslogik, ein Teil, der keinen Sinn ergibt. Erschwert das Verständnis der Funktionslogik.
neugierig
1
@curiousguy - ja, das ist wahr und wahrscheinlich Teil der Absicht meines Punktes "Komplexität in den Aufrufgraphen verschieben". Meine Religion ist, dass jede Entscheidung, die Sie treffen, ein Kompromiss ist. Seien Sie sich also aller plausiblen Optionen und ihrer Vor- und Nachteile bewusst. Es ist wichtig, die allgemeinen Abhilfemaßnahmen zu kennen, aber seien Sie vorsichtig, wenn die Heilung schlimmer ist als die Krankheit. Außer natürlich, dass dieser Teil des Kompromisses darin besteht, wie viel Zeit Sie damit verbringen (oder verschwenden), sich mit Dingen zu beschäftigen.
Steve314
1

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.]

S.Lott
quelle
1
@ luis.espinal: Gegen welches Ende? Welche Informationen würde der Text enthalten? Die Frage schwirrt ein bisschen herum. Welcher Teil der Frage sollte mit einem Text behandelt werden?
S.Lott
1
Aus Gründen des Stils und vielleicht um mehr Informationen zu liefern, die die Zusammenfassungen der Links liefern können (wenn man bedenkt, dass wir nicht wissen, ob das OP ein zahlendes ACM / IEEE / Springer Verlag-Mitglied ist, das Zugang zu den vollständigen Artikeln hat und Antworten auf diese Fragen findet) seine Fragen.) Zum Beispiel erwähnt die Zusammenfassung des ACM-Artikels nicht den Codierungsstil. Allenfalls geht es darum, den Satz des strukturierten Programms zu bekräftigen (der selbst nicht auf das Problem der einfachen oder mehrfachen Rückgabe eingeht). Sie hätten also erklären können, warum dieser Link relevant ist.
Luis.espinal
1
Der dritte Artikel (zum Glück habe ich Zugang zu IEEE Xplore) scheint nicht mit dem zu tun zu haben, wonach das OP fragt, soweit ich das beurteilen kann. Es ist wohlgemerkt ein wunderbarer Artikel, den ich zu einem späteren Zeitpunkt drucke, um ihn genauer zu lesen. Vielleicht hätten Sie auch erklären können, wie dieser Artikel dem OP hilft, seine Frage zu beantworten. Insgesamt scheint es, dass Sie einfach eine Reihe von Links zusammengeschmissen haben. Es ist keine Art, abzulehnen (es sei denn, das war Ihre Absicht), aber ich verstehe auch nicht, wie dies dem OP geholfen hat. Aus diesem Grund sollte ein Poster einen Text entlang seiner Links einfügen. Jetzt wissen Sie also, warum ich es gesagt habe;)
Luis.espinal
1
aus dem Mund des OP 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.
Luis.espinal
1
Ich vermute, wo das OP herkommt. Er gibt eindeutig Codierungsstile (nicht Methoden) an, und insbesondere einzelne vs. mehrfache Rückgaben. Ich musste mich ein paarmal damit abfinden, dass gut geschriebener, inhärent selbstverständlicher Code mit mehreren return-Anweisungen mithilfe von single-returns (insbesondere in großen bürokratischen Organisationen) * as in komplexere Versionen umgeschrieben wurde pro "der prozess". Und man wundert sich (und stellt Beweise in Frage) über die Gültigkeit, Verwendbarkeit und Wirtschaftlichkeit solcher willkürlichen Mandate. Menschen, die solche Mandate erzwingen, leben noch in den 60er Jahren: /
Luis.espinal
1

Ist ein Kodierungsprinzip - zB das Single-Exit-Prinzip

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?):

  • Wirklich eine gute Sache?

Ja. Meistens für den allgemeinen Fall mit Vorbehalten, die für Randfälle und sprachspezifische Programmierkonstrukte spezifisch sind.

Immer oder nur manchmal?

Meistens.

Wie viel Unterschied macht es wirklich?

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):

function foo() : someType
  begin
  if( test1 == true )
  then
    return x;
  end
  doSomethignElseThatShouldnHappenIfTest1IsTrue();
  return somethingElse();
end;

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):

switch(someVal)
{
case v1 : return x1;
case v2 : return x2:
case v3 : doSomething(); // fall-through
case v4: // fall-through
case v5: // fall-through
case v6: return someXthingie;
...
...
default:
   doSomething(); // no return statement yet
}

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:

  1. 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). )

  2. 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 .

  3. 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.

  4. 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.

luis.espinal
quelle
1
Der C ++ - Rückgabetyp ist nicht standardmäßig int: Es gibt keinen Standardrückgabetyp, daher muss er in allen Fällen angegeben werden.
Sjoerd
Bevor ich diese Frage schrieb - programmers.stackexchange.com/questions/58237/… . Grundsätzlich befürworte ich das Bewusstsein für das Prinzip, aber halte mich nicht strikt daran - wenn alle Austrittspunkte offensichtlich sind, bin ich glücklich. Mein Punkt hier - nur weil ich ein Prinzip als Beispiel erwähne, heißt das nicht, dass ich dieses Prinzip befürworte, und schon gar nicht in seiner strengen Form. Meine subjektive Meinung ist jedoch nur das - vielleicht gibt es ein stärkeres Argument für meine Ansicht, oder vielleicht gibt es ein starkes Argument, dass ich falsch liege.
Steve314
Worum geht es bei "default to int"?
neugierig
Ich meine zu sagen, und ich hätte es qualifizieren sollen, dass die meisten Compiler einfach den Wert eines Akkumulatorregisters als Rückgabewert "verschieben", wenn der Code zufällig einen Ausführungszweig ohne expliziten Rückgabewert hat. Das bedeutet in der Tat, dass das Ergebnis der letzten arithmetischen Operation (welcher Müll auch immer) in int-Form zurückgegeben wird. Und das wäre sicherlich Müll (und damit undefiniertes Verhalten), unabhängig davon, was die Funktion eigentlich vorhatte. C und C ++ können Sie warnen, aber beim Kompilieren können Sie kompilieren, es sei denn, Sie verwenden -Werror oder ähnliches.
Luis.espinal