Gibt es eine optimale Anzahl von Codezeilen pro Funktion? [geschlossen]

18

Funktionen werden nicht nur verwendet, um die Doppelung von Code zu minimieren, sondern auch, um eine lange Funktion in kleinere Funktionen aufzuteilen, um die Lesbarkeit zu verbessern und um den Code selbst zu kommentieren. Diese Verstärkung ist jedoch nicht direkt umgekehrt proportional zur Anzahl der LOCs pro Funktion oder Methode. Andernfalls hätten wir Tonnen von Funktionen, die alle nur eine oder zwei Codezeilen enthalten.

Dies führte mich zu der Frage : Gibt es eine optimale Anzahl von LOCs pro Funktion? Wenn ja, was ist das und weicht es zwischen den Sprachen ab?

gablin
quelle
6
Siehe Code Complete Vol 2 von Mitch McConnell, Kapitel 7, Abschnitt 4 für eine gute Zeit.
Peter Turner
2
@ Peter - ich denke du meinst "Steve McConnell"
JohnFx
Ja, komisch, ich würde das schreiben, während ich mir das Buch anschaue ... Wasnt Mitch McConnell Pres. Bushs Stabschef?
Peter Turner
3
Die Anzahl variiert mit ziemlicher Sicherheit je nach Sprache: Ich wäre überrascht, eine 6-zeilige Prolog-Klausel zu sehen, während ich mit einer 20-zeiligen Delphi-Methode vollkommen einverstanden wäre. Meine Antwort lautet wie folgt für Smalltalk, bei dem die Umgebung verwendet wird, um kurze Methoden zu fördern.
Frank Shearar
1
@ Peter Turner: Hm ... S1 bis S15 und I1 bis I11. Klingt so, als würde er temporäre Variablen mit Registern verwechseln. ^^
gablin

Antworten:

33

Anstelle der Anzahl der Zeilen würde ich als Kriterium verwenden, dass jede Funktion nur eines tun sollte und es gut macht.

grokus
quelle
Ja, wenn wir eine Arbeitseinheit haben, möchte ich nicht zwischen 50 Funktionen wechseln müssen, um den Überblick über das Geschehen zu behalten. Wenn Sie Ihre Funktionen mit dieser Metrik entsprechend aufteilen, sollte ihre Größe fast selbstverständlich vernünftig sein.
ChaosPandion
2
@ChaosPandion: Ihre Arbeitseinheit kann jedoch wahrscheinlich als Folge von elementareren Schritten ausgedrückt werden. Wenn Sie die Funktion überprüfen, überprüfen Sie die Abfolge der Schritte und nicht den Code jedes einzelnen Schritts.
Wizard79
2
@Lorenzo - Wenn dies der Fall ist, wird jeder Schritt zur Arbeitseinheit. Die übergeordnete Funktion wird zu einer allgemeinen Übersicht über die Arbeitseinheiten.
ChaosPandion
1
Ja, das ist in der Tat sehr wahr. Hm, lassen Sie mich dann die Frage umformulieren: Gibt es eine optimale Anzahl von LOCs für Funktionen, die nur eines tun und das auch?
Gablin
@gablin, schwer zu sagen und auch LOCs sind sprachabhängig, aber wenn Sie sich an dieses Prinzip halten, landen Sie normalerweise in einem vernünftigen Bereich, etwa 1 ~ 50.
Grokus
21

Eine alte Faustregel besagt, dass eine Funktion ohne Scrollen vollständig auf dem Bildschirm sichtbar sein sollte.

Die Grundidee ist, dass, wenn Sie nicht die gesamte Funktion auf einmal betrachten können, die Funktion überkomplex ist und Sie sie in grundlegendere Teile aufteilen sollten.

Diese Regel ist zwar sehr praktisch und nützlich, die formale Regel lautet jedoch, dass Sie in einer Funktion nur einen einzigen logischen Schritt beibehalten sollten. Eine Funktion erledigt nur einen elementaren Job. Wenn Sie den Job in mehrere elementare Teile aufteilen können, muss die Funktion aufgeteilt werden.

Wizard79
quelle
21
Diese Metrik wird mit zunehmender durchschnittlicher Monitorgröße / Auflösung immer unbrauchbarer.
Adam Lear
2
Unser Programmierer hat dieses Beispiel
neulich
2
@Anna: Nun, mein Monitor ist hochauflösend, aber auch die Anzahl der Symbolleisten / Paletten / Bedienfelder hat zugenommen. Und dann, jetzt kann ich 14 pt Pitch Font verwenden! :)
Wizard79
4
Die Größe eines Terminals von 24 x 80 ändert sich normalerweise nicht.
Alternative
1
Unsinn, die Regel lautet: "Kannst du alles sehen, ohne zu scrollen?". Mit einem großen Monitor können Sie mehr in Ihrer Funktion haben, ohne gegen diese Regel zu verstoßen. Dies bedeutet jedoch nicht, dass große Monitore nur kleine Funktionen anzeigen dürfen. ))
gbjbaanb
15

Da ist gar nichts.

Bildschirme werden größer, Schriftgrößen kleiner. Faustregeln funktionieren nicht so gut, wenn Menschen unterschiedlich große Daumen haben.

Sei präzise. Wenn Ihre Funktion mehrere Aufgaben ausführt, ist es wahrscheinlich eine gute Idee, sie in kleinere aufzuteilen.

Josh K
quelle
Am wenigsten könnten Sie mir sagen, warum Sie denken, dass meine Antwort nicht nützlich ist.
Josh K
7
Ich denke, jemand wurde durch Ihre Verwendung des h1- Tags beleidigt .
ChaosPandion
@Chaos: Das ist die wesentliche Antwort.
Josh K
6
Vielleicht war ich etwas zu subtil, aber ich wollte damit andeuten, dass es keinen triftigen Grund gibt, Ihre Antwort abzustimmen. Wer auch immer die Tat tat, hatte einen zufälligen persönlichen Grund, dies zu tun. Sie denken vielleicht einfach, Josh sei ein schrecklicher Name.
ChaosPandion
6

Smalltalk hat eine etwas ungewöhnliche Art, die Größe von Methoden zu reduzieren. Wenn Sie Code schreiben, schreiben Sie ihn in einem Widget, das als Browser bezeichnet wird. Ein Browser besteht aus zwei Hauptteilen, die horizontal unterteilt sind. Ihr Code geht in die untere Hälfte.

Standardmäßig ist ein Browser nicht sehr groß. Sie können 5 oder 6 Zeilen einfügen, bevor Sie mit dem Scrollen beginnen müssen. Das Scrollen ist natürlich etwas irritierend.

In Smalltalk "fordert" die Umgebung Sie daher auf, kurze Methoden mit einer Länge von höchstens 6 Zeilen zu schreiben. (Das ist normalerweise genug; Smalltalk ist eine ziemlich knappe Sprache.)

Frank Shearar
quelle
2

Die ideale Anzahl von Codezeilen in einer Methode ist variabel. Grundsätzlich möchten Sie nur so viel Code schreiben, wie im Kontext der Funktionsdefinition erforderlich ist. Ich betrachte dies als eine Art Prinzip der Einzelverantwortung , das nur auf eine Methode anstatt auf eine Klasse angewendet wird.

Wenn eine Methode viel Logik und eine Reihe von Schritten zu erledigen hat, ist es sinnvoll, die Methode in mehrere einzelne Schritte aufzuteilen. Jeder dieser Schritte würde nach Bedarf in neue Methoden extrahiert.

"Sonst hätten wir Tonnen von Funktionen, die alle nur eine oder zwei Codezeilen enthalten."

Je weniger jede Methode verwendet wird, desto einfacher ist ihre Definition und desto einfacher ist das Verstehen und Verwalten. Es ist nichts falsch daran, Hunderte von Methoden zu haben, wenn Sie sie brauchen. In Übereinstimmung mit der SRP, die ich zuvor erwähnt habe, wird es auch einfacher, neue Klassen zu extrahieren, wenn die Methoden in kleinere und handlichere Teile zerlegt wurden.

S.Robins
quelle
1

Die Antwort ist natürlich 42 .

Wichtig zu beachten: Keine Funktion kann jemals die SRP verletzen , oder Sie müssen sich der spanischen Inquisition stellen .

Ein paar Tipps, wie Sie die Anzahl der Zeilen reduzieren können:

  • Gibt es Kommentare zu einzelnen Abschnitten? Diese Abschnitte sollten Funktionen sein.
  • Gibt es if-else-Ketten oder switch-Anweisungen außerhalb einer Fabrik / eines Herstellers? Ihr Entwurf benötigt möglicherweise einige bessere Entwurfsmuster, damit Sie die Zuständigkeiten aufteilen können.
  • Sind Ihre Funktionen einfach zu testen? Machen Sie Ihre Funktionen einfach zu testen, sie fallen auseinander.
  • Ist es komplex und nur kein Land in Sicht (1000 Linienmonster)? Refactoring von Schrott - das ist Refactor, und speichern Sie es nicht in der Hoffnung, sich über die Verantwortlichkeiten des Codes zu informieren.
Johannes
quelle
1
Nᴏʙᴏᴅʏ erwartet die Spanier ... ah Mist, ich bin hier ein bisschen spät dran .
linksum den
0

Hier sind einige Hinweise:

  • Wenn Sie Probleme beim Schreiben des Kommentars haben, in dem der Zweck und die Verwendung der Funktion erläutert werden, ist dieser zu lang.

  • Wenn Sie versucht sind, einen Kommentar zu verfassen, der die Aktivität eines Codeabschnitts in der Funktion erläutert, ist die Funktion zu lang.

  • Wenn Sie Code aus einer anderen Funktion einfügen, sind beide zu lang (extrahieren Sie diesen Code als separate Funktion).

  • Wenn Sie eine Codierungskonvention benötigen, um Klassendatenelemente von lokalen Variablen zu trennen, ist die Funktion zu lang und die Klasse hat zu viele Elemente.

  • Wenn Sie sich beim Lesen einer Funktion Notizen machen müssen, ist diese zu lang.

Es ist nicht unbedingt eine schlechte Sache, Tonnen von Funktionen zu haben, die jeweils nur eine oder zwei Zeilen lang sind. Ich stellte fest, dass diese kleinen Funktionen viel häufiger wiederverwendet wurden, als ich ursprünglich erwartet hatte.

Kevin Cline
quelle