Was ist nachweislich eine gute maximale Länge einer Funktion? [geschlossen]

43

Beeinträchtigt die Funktionslänge die Produktivität eines Programmierers? Wenn ja, wie hoch ist die maximale Anzahl von Zeilen, um Produktivitätsverluste zu vermeiden?

Da dies ein Thema ist, das von großer Meinung ist, sollten Sie den Anspruch mit einigen Daten untermauern.

Peter Mortensen
quelle
6
Die Länge sollte nicht in LOC gemessen werden, sondern in der Zeit, die erforderlich ist, um genau zu verstehen, was es tut. Und diese Länge sollte nicht mehr als eine Minute betragen. Wenn ich es nicht in ein paar Sekunden herausfinden kann, tut es wahrscheinlich zu viel ... nach einer Minute ist es definitiv.
CaffGeek
13
Die maximale Länge sollte 17 sein.
ThomasX
1
Denken Sie an S in SOLID.
Kris Krause
1
@CaffGeek Oder vielleicht macht die Funktion einfach etwas nicht Triviales. Ich habe Funktionen gesehen, deren vollständiges Verstehen Tage in Anspruch nehmen würde. Sogar Funktionen, bei denen ich alle beteiligten Konzepte verstehe, können eine halbe Stunde dauern, um die Details durchzuarbeiten. Während es schön ist, triviale Funktionen zu haben, sind viele Probleme einfach von Natur aus schwierig.
CodesInChaos

Antworten:

46

Da ich auf diesem verrückten Schläger im Jahr 1970 in Angriff genommen, habe ich gesehen , genau ein Modul , das wirklich benötigte mehr als eine gedruckte Seite zu sein (ca. 60 Zeilen). Ich habe viele Module gesehen, die länger waren.

Im Übrigen habe ich Module geschrieben, die länger waren, aber normalerweise waren sie große Zustandsautomaten, die als große switch-Anweisungen geschrieben wurden.

Ein Teil des Problems scheint darin zu liegen, dass Programmierer heutzutage nicht in der Lage sind, Dinge zu modularisieren.

Codierungsstandards, die die Verschwendung von vertikalem Raum maximieren, scheinen ebenfalls Teil des Problems zu sein. (Ich habe noch keinen Softwaremanager getroffen, der Gerald Weinbergs " Psychology of Computer Programming " gelesen hat . Weinberg weist darauf hin, dass mehrere Studien gezeigt haben, dass das Verständnis von Programmierern im Wesentlichen auf das beschränkt ist, was der Programmierer zu einem bestimmten Zeitpunkt sehen kann Programmierer müssen blättern oder eine Seite umblättern, ihr Verständnis sinkt erheblich: sie müssen sich erinnern und abstrahieren.)

Ich bin nach wie vor davon überzeugt, dass ein Großteil der gut dokumentierten Produktivitätssteigerungen für Programmierer von FORTH auf das FORTH-Blocksystem für Quellcode zurückzuführen ist: Module waren auf ein absolutes Maximum von 16 Zeilen mit 64 Zeichen beschränkt. Sie könnten unendlich faktorisieren, aber Sie könnten unter keinen Umständen eine Routine mit 17 Zeilen schreiben.

John R. Strohm
quelle
3
Die gesamte Philosophie von FORTH war darauf ausgelegt, dies zu fördern ... Sie wollten Ihren eigenen Wortschatz entwerfen, indem Sie Ihr Programm unerbittlich in immer kleinere Teile aufteilen und so weniger ein Skript als ein Wörterbuch erhalten. Längenbeschränkungen alleine reichen nicht aus - Sie werden eine Routine sehen, die in beliebige Teile aufgeteilt ist, um einen Codierungsstandard zu erfüllen. Ich denke, Sie haben absolut Recht damit, dass Programmierer einfach "nicht in der Lage sind, Dinge zu modularisieren"; Dies hätte einer der großen Siege von OOP sein sollen, aber aus verschiedenen Gründen wird es oft als Ziel für sich selbst herabgesetzt.
Shog9
1
@Herr. CRT: Die Längenbegrenzungen in den blockorientierten FORTH-Implementierungen forcierten die Modularisierung. Der interaktive Charakter der meisten FORTHs hilft, indem er kleine Module anregt und diese Module schnell testet. D85, ein dateibasiertes FORTH, erzwang keine Modularisierung, und ich sah, dass Jungs, die mit D85 spielten, eine Menge lauffähiger Module mit Programmiererbewusstsein für immer damit schrieben. Daher meine Überzeugung. (Liz Rather ist meiner Meinung nach anderer Meinung. Sie glaubt, dass es hauptsächlich die Interaktivität ist, die FORTH den Produktivitätsschub verleiht.)
John R. Strohm
2
+1 um mir das großartige Buch "Psychology of Computer Programming"
Samuel
30

Was ist die richtige Größe, wirklich?

Kommt auf die Sprache an, die du benutzt, aber im Allgemeinen (und für meinen persönlichen Geschmack):

  • Idealerweise weniger als 25 Zeilen.
  • Akzeptabel weniger als 35 Zeilen.

Wenn es mehr ist, dann ist es etwas, worauf ich später zurückkommen und es überarbeiten muss.

Aber realistisch ist , dass jede Größe, die benötigt wird, um etwas auszuliefern, und dass es im Moment sinnvoller ist, sie so auszuspucken, es für jemanden manchmal noch einfacher macht, sie vor dem Versand zu überprüfen. (aber später noch zurück).

(Vor kurzem hat mein Team ein Programm auf unserer Codebasis ausgeführt: Wir fanden Klasse mit 197 Methoden und eine andere mit nur 3 Methoden, aber eine davon bestand aus 600 Zeilen. Süßes Spiel: Was ist das Schlimmste der 2 Übel?)


Jetzt noch eine Antwort auf die Frage nach Zen ... Im Allgemeinen wird es als gute Praxis angesehen, einen oder zwei großartige Männer zu zitieren.

Alles sollte so einfach wie möglich gemacht werden, aber nicht einfacher. - A. Einstein

Perfektion wird schließlich nicht erreicht, wenn es nichts mehr hinzuzufügen gibt, sondern wenn es nichts mehr zum Mitnehmen gibt. - A. de Saint Exupéry


Nachtrag zu Kommentarstilen

Als Ergänzung dazu sollten Ihre Funktionen eindeutige Namen haben, die ihre Absicht erklären. In Bezug auf Kommentare kommentiere ich normalerweise nicht innerhalb einer Funktion:

  • Kommentare sagen "warum?" ,
  • Code sagt "wie?" .

Ein Kommentarblock am Anfang jeder Funktion (der eine Erklärung erfordert) ist ausreichend. Wenn Ihre Funktion klein ist und Funktionsnamen explizit genug sind, müssen Sie nur sagen, was Sie erreichen möchten und warum. Ich verwende Inline-Kommentare nur für Felder in einigen Sprachen oder für Blockstarts für Funktionen, die gegen die 25-35-Zeilenregeln verstoßen, wenn die Absicht unklar ist. Ich verwende einen Blockkommentar im Code, wenn eine Ausnahmesituation eintritt (ein Catch-Block, in dem Sie nichts tun müssen oder wollen, sollte beispielsweise einen Kommentar enthalten, in dem angegeben ist, warum).

Für weitere Informationen lesen Sie bitte meine Antwort auf Stil und Empfehlungen zum Kommentieren von Code

Haylem
quelle
@ Haylem Ich denke, dies ist Programmierversion von Freddy vs Jason :-)
Gaurav
Ich stimme zu, aber ich würde hinzufügen, dass es in der Größe einer Bildschirmseite sein sollte. Wenn Sie 72 Zeilen auf einer Bildschirmseite haben, sollte die Funktion 72 Zeilen nicht überschreiten.
Anzeigename
@ Es muss sichergestellt werden, dass eine einzelne Funktion auch auf einer Bildschirmseite angezeigt wird, um nicht zu scrollen, aber das ist normalerweise nicht mein Hauptanliegen. Mein Anliegen ist die Zeit, die zum Verarbeiten von Informationen benötigt wird, wenn eine Funktion gelesen wird, und es ist beinahe augenblicklich, wenn es sich um eine klar geschriebene Funktion in 25 Zeilen handelt. Es geht nur noch darum, den Funktionsaufrufen zu folgen. 72 ist viel zu groß für mich (plus, was ist, wenn Sie geteilte Bildschirme haben? Und das wäre abhängig von der Schriftart. Aber ich stimme dem historischen Wert der Empfehlung zu)
Haylem
1
Natürlich haben Sie manchmal Funktionen, bei denen Sie nur 70 verschiedene Felder an 70 verschiedene Stellen kopieren. Ich benutze ttes meistens , um diese zu generieren, aber manchmal steckt man mit einer Long-Ass-Funktion (oder einer Long-Ass-Funktion) fest, die sowieso nichts von Interesse macht, also kein wirkliches Problem ist.
Konfigurator
1
Wenn die Funktion z. B. Map(x => x.Property1); Map(x => x.Property2); Map(x => x.Property3);so ist, ist klar, dass alles ziemlich gleich ist. (Beachten Sie, dass dies nur ein Beispiel ist. Diese Art von Funktion wird von Zeit zu Zeit
Konfigurator
12

Meiner Meinung nach sollte jede Funktion so klein wie möglich sein. Jede Funktion sollte nur eines tun und es gut machen. Das beantwortet nicht wirklich die Frage nach der maximalen Länge, aber es sind eher meine Gefühle bezüglich der Länge von Funktionen.

Um die Worte von Onkel Bob zu verwenden: "Extrahieren, bis Sie einfach nicht mehr extrahieren können. Extrahieren, bis Sie fallen."

Jason
quelle
2
Was meinst du mit so klein wie möglich? Wäre es nicht so klein wie möglich, wenn jede Funktion nur zwei Zeilen hätte: eine für eine einzelne Operation und eine andere, die eine Funktion für den Rest aufruft?
Kelmikra
Wieder Onkel Bob. Denke selbst. Hör nicht auf Onkel. Sie führen dich in die Irre.
gnasher729
10

Was sollte die maximale Höhe eines Gebäudes sein? Hängt davon ab, wo sich der Build befindet oder wie hoch er sein soll.
Möglicherweise erhalten Sie unterschiedliche Antworten von verschiedenen Personen aus verschiedenen Städten.
Einige Skriptfunktionen und Kernel-Interrupt-Handler sind sehr lang.

Huang F. Lei
quelle
Ich stimme dir vollkommen zu. Ich mag Metaphern. :) Ein dreistöckiges Gebäude wurde möglicherweise von einem dummen Architekten gebaut, der nicht weiß, wo er einen gültigen Sicherheitsausgang anbringen soll, und ein anderes Gebäude könnte zehn Stockwerke haben und ein perfektes architektonisches Design sein. Wir sollten immer bedenken, dass die Lesbarkeit und Wartbarkeit der Hauptgrund sein sollte, eine Methode zu überarbeiten, um seine Größe und nicht die Größe selbst zu reduzieren. Eine Stadt könnte mit 90% Wolkenkratzer nur in Science-Fiction-Filmen gebaut werden. :)
Samuel
10

Eine Methode, die bei mir funktioniert, ist: Kann ich einem Teil einer längeren Funktion einen Namen geben, der Sinn macht. Ich denke, die Länge einer Methode ist nicht so wichtig wie eine gute Benennung. Die Methode sollte das tun, was der Name sagt, nicht mehr und nicht weniger. Und Sie sollten in der Lage sein, einen guten Namen zu geben. Wenn Sie Ihre Methode nicht gut benennen können, ist der Code wahrscheinlich nicht gut zusammengesetzt.

Mnementh
quelle
Und Ihre Methode sollte nur eines tun, um einen guten Namen zu haben ... kein 'Und', 'Oder' oder irgendetwas anderes, das den Methodennamen 50 Zeichen lang macht.
Samuel
10

Solange es sein muss, um das zu tun, was es tun muss, aber nicht länger.

Paul Nathan
quelle
wie sie in c sagen: "Es gibt kein Problem in c, das Sie nicht lösen könnten, indem Sie diesem Zeiger einen weiteren Zeiger hinzufügen." du könntest immer eine andere Funktion darunter hinzufügen, seine Frage wäre zu deiner Offenbarung "Wo endet es?"
Anzeigename
1
Ich würde es tatsächlich umdrehen und sagen "so kurz wie es sein muss, aber nicht kürzer", aber Sie bekommen meine +1 für die Nähe genug :)
Ben Hughes
6

Ich denke, es gibt einen Kompromiss. Wenn Sie viele kurze Methoden haben, ist es oft schwieriger, sie zu debuggen als eine lange Methode. Wenn Sie den Editor 20 oder 30 Mal hintereinander verwenden müssen, um einen Methodenaufruf zu verfolgen, ist es schwierig, alles im Kopf zu behalten. In der Zwischenzeit ist es oft einfacher, im Kopf zu bleiben, wenn es eine gut geschriebene, klare Methode gibt, selbst wenn es 100 Zeilen sind.

Die eigentliche Frage ist, warum sich die Elemente in unterschiedlichen Methoden befinden sollten, und die Antwort lautet, wie oben angegeben, Wiederverwendung von Code. Wenn Sie den Code nicht wiederverwenden (oder nicht wissen), ist es möglicherweise sinnvoll, ihn in einer riesigen, einfach zu befolgenden Methode zu belassen. Teilen Sie dann, wenn Sie ihn wiederverwenden möchten, die Teile auf, die neu verwendet werden müssen. Verwendung in kleinere Methoden.

In Wirklichkeit besteht ein Teil eines guten Methodendesigns darin, funktionell zusammenhängende Methoden zu erstellen (im Wesentlichen tun sie eine Sache). Die Länge der Methoden spielt keine Rolle. Wenn eine Funktion eine genau definierte Aufgabe ausführt und 1.000 Zeilen umfasst, ist dies eine gute Methode. Wenn eine Funktion 3 oder 4 Dinge macht und nur 15 Zeilen hat, dann ist es eine schlechte Methode ...

Cervo
quelle
Ich mag kurze Methoden.
Marcie
Mir gefällt, was Sie gesagt haben, denn zu sagen, dass eine Methode nicht mehr als 10 Zeilen haben sollte, ist aus meiner Sicht eine Utopie. Ok, es ist eine gute Regel, sich jedes Mal vor Augen zu halten, wenn Sie eine Methode schreiben, aber es sollte keine mathematische Regel wie 1 + 1 = 2 sein Nicht vollständige Kommentare, in denen einige Details erklärt werden, da die Methoden zu lang sind. Sie können 100 Codezeilen enthalten und sind möglicherweise völlig sauber, um sie zu verstehen und zu warten. Es sollte jedoch eher eine Ausnahme als eine Gewohnheit sein. Ich denke, Schaltergehäuse in der Fabrikmethode ist ein gutes Beispiel für eine Ausnahme.
Samuel
5

Ich finde es einfacher zu verfolgen, was ich tue, wenn ich die gesamte Funktion auf einmal sehen kann. So schreibe ich am liebsten Funktionen:

  1. Kurz genug, um mit einer vernünftigen Schriftart auf meinen Monitor zu passen.
  2. Wenn es länger als 1 sein muss, kurz genug, um auf ein Stück Papier in einer angemessenen Schriftart zu drucken.
  3. Wenn es länger als 2 sein muss, kurz genug, um 2-fach auf ein Stück Papier zu drucken.

Ich schreibe selten längere Funktionen. Die meisten davon sind gigantische C / C ++ - Schalteranweisungen.

Bob Murphy
quelle
Kurz genug, um auf einen Monitor zu passen, ist schön, aber die Schriftart und -größe anzugeben. Papier sollte aus meiner Sicht keine Regel sein, denn wir sind im Jahr 2013 und wer druckt noch Code auf Papier, wer druckt nur, um zu sehen, ob er auf ein Papierformat passt? Mit Tools wie Visual Studio und Intellisense gibt es keinen Grund mehr, Code auf Papier zu analysieren.
Samuel
5

Für mich ist eine Funktion eine beliebige Länge. Die meiste Zeit, in der ich es aufteile, werde ich Code wiederverwenden.

Grundsätzlich halte ich mich an das Prinzip 'hohe Kohäsion, niedrige Kopplung' und es gibt keine Einschränkung für die Länge.

Ross
quelle
5

Die Frage sollte sein, wie viele Dinge eine Funktion tun soll. Und normalerweise ist es selten, dass Sie 100 Zeilen benötigen, um "eine" Sache zu tun. Das hängt wiederum von der Ebene ab, von der aus Sie den Code betrachten: Ist das Hashen eines Passworts eine Sache? Oder ist Hashing und Speichern des Passworts eine Sache?

Ich würde sagen, beginnen Sie mit dem Speichern des Passworts als eine Funktion. Wenn Sie das Gefühl haben, dass Hashing anders ist und Sie den Code überarbeiten. Ich bin in keinster Weise ein erfahrener Programmierer, aber meiner Meinung nach ist die ganze Idee von Funktionen klein: Je atomarer Ihre Funktionen sind, desto höher ist die Wahrscheinlichkeit der Wiederverwendung von Code, und Sie müssen niemals dieselbe Änderung an mehr als einer Stelle vornehmen , usw.

Ich habe gespeicherte SQL- Prozeduren gesehen , die über 1000 Zeilen ausgeführt werden. Beträgt die Anzahl der Zeilen gespeicherter Prozeduren auch weniger als 50? Ich weiß es nicht, aber es macht das Lesen des Codes zur Hölle. Sie müssen nicht nur weiter rauf und runter scrollen, sondern Sie müssen einigen Codezeilen auch einen Namen wie "this does validation1", "this updates in the database" usw. geben - eine Arbeit, die der Programmierer hätte tun sollen.

Narayana
quelle
+1 nur für den ersten Absatz. Alles andere ist relativ zu dem Fall, an dem Sie arbeiten.
Anzeigename
Und wie hilft es, es in 50 Funktionen aufzuteilen? Wann müssen Funktionen kommunizieren, damit Sie nicht mit 500, sondern mit tausend Zeilen fertig werden?
gnasher729
5

Aus der zyklomatischen Komplexität (Wikipedia):

Die zyklomatische Komplexität eines Quellcodeabschnitts ist die Anzahl der linear unabhängigen Pfade durch den Quellcode.

  • Ich empfehle, dass Sie diese Zahl unter 10 in einer einzigen Methode halten. Wenn es 10 wird, dann ist es Zeit, neu zu faktorisieren.

  • Es gibt Tools, mit denen Sie Ihren Code auswerten und eine zyklomatische Komplexitätszahl erhalten können.

  • Sie sollten sich bemühen, diese Tools in Ihre Build-Pipeline zu integrieren.

  • Verfolgen Sie nicht buchstäblich eine Methodengröße, sondern versuchen Sie, deren Komplexität und Verantwortlichkeiten zu untersuchen. Wenn es mehr als eine Verantwortung hat, ist es wahrscheinlich eine gute Idee, die Faktoren neu zu bestimmen. Wenn die zyklomatische Komplexität zunimmt, ist es wahrscheinlich an der Zeit, neu zu faktorisieren.

  • Ich bin mir ziemlich sicher, dass es andere Tools gibt, die Ihnen ähnliche Rückmeldungen geben, aber ich hatte noch keine Chance, dies zu untersuchen.

CodeART
quelle
Es hat sich gezeigt, dass die zyklomatische Komplexität an realem Code aus einem der großen öffentlichen Repositories, die keine erfundenen Beispiele sind, sehr stark mit dem rohen SLOC korreliert. Dies macht es im Grunde wertlos, da es viel einfacher ist, Wagenrückläufe zu zählen. (Ja, es ist möglich, SLOC zu spielen. Um ehrlich zu sein: Wie lange würde jemand, der die SLOC-Metriken bei Ihrem Arbeitgeber gespielt hat, noch einen Gehaltsscheck ziehen dürfen?)
John R. Strohm
4

Normalerweise versuche ich, meine Methoden / Funktionen auf dem Bildschirm eines 1680x1050-Monitors zu belassen. Wenn es nicht passt, verwenden Sie Hilfsmethoden / -funktionen, um die Aufgabe zusammenzufassen.

Es verbessert die Lesbarkeit sowohl auf dem Bildschirm als auch auf dem Papier.

Jason
quelle
Ich mache dasselbe, aber es lohnt sich anzugeben, welche Schriftart und Schriftgröße Sie verwenden. Für mich selbst bevorzuge ich "consolas" mit einer Größe von 14, wie von Scott Hanselman vorgeschlagen. hanselman.com/blog/… Es ist schwierig, das erste Mal mit einer so großen Schrift zu arbeiten, aber es ist eine bewährte Methode, sich immer daran zu erinnern, dass Ihre Methode so klein wie möglich sein sollte.
Samuel
4

Ich beschränke nichts auf eine harte Linie, da einige Funktionen Algorithmen implementieren, die von Natur aus komplex sind, und jeder Versuch, sie zu verkürzen, die Interaktionen zwischen den neuen, kürzeren Funktionen so kompliziert machen würde, dass das Nettoergebnis keine Reduzierung der Einfachheit wäre. Ich glaube auch nicht, dass die Idee, dass eine Funktion nur "eine Sache" tun sollte, ein guter Leitfaden ist, da "eine Sache" auf einer hohen Abstraktionsebene "viele Dinge" auf einer niedrigeren Ebene sein kann.

Für mich ist eine Funktion definitiv zu lang, wenn ihre Länge im Moment subtile Verstöße gegen DRY hervorruft, und das Extrahieren eines Teils der Funktion in eine neue Funktion oder Klasse könnte dies lösen. Eine Funktion kann zu lang sein, wenn dies nicht der Fall ist. Es kann jedoch leicht eine Funktion oder Klasse extrahiert werden, die den Code modularer macht, und zwar auf eine Weise, die angesichts absehbarer Änderungen in der Zukunft wahrscheinlich nützlich ist.

dsimcha
quelle
Funktionen erledigen "eine Sache" auf einer bestimmten Abstraktionsebene, und Sie kümmern sich nur um diese eine Abstraktionsebene. Das ist der springende Punkt. Wenn Sie das nicht verstehen können, dann glaube ich nicht, dass Sie die Abstraktion verstehen.
Zoran Pavlovic
4

Kurz genug, um richtig optimiert zu werden

Methoden sollten so kurz sein, dass sie genau eines tun. Der Grund dafür ist einfach: So kann Ihr Code richtig optimiert werden.

In einer JIT-fähigen Sprache wie Java oder C # ist es wichtig, dass Ihre Methoden einfach sind, damit der JIT-Compiler schnell Code erstellen kann. Längere, kompliziertere Methoden erfordern natürlich mehr JIT-Zeit. Außerdem bieten JIT-Compiler nur eine Handvoll Optimierungen, von denen nur die einfachsten Methoden profitieren. Diese Tatsache wurde sogar in Bill Wagners Effective C # herausgestellt .

In einer niedrigeren Sprache wie C oder C ++ ist es ebenfalls wichtig, über kurze Methoden (etwa ein Dutzend Zeilen) zu verfügen, da auf diese Weise die Notwendigkeit minimiert wird, lokale Variablen im RAM statt in einem Register zu speichern. (Aka 'Register Spilling'.) Beachten Sie jedoch, dass in diesem nicht verwalteten Fall die relativen Kosten für jeden Funktionsaufruf ziemlich hoch sein können.

Und selbst in einer dynamischen Sprache wie Ruby oder Python helfen kurze Methoden auch bei der Optimierung des Compilers. In einer dynamischen Sprache ist die Optimierung umso schwieriger, je dynamischer eine Funktion ist. Zum Beispiel wird eine lange Methode, die ein X benötigt und ein Int, Float oder String zurückgeben könnte, wahrscheinlich viel langsamer ausgeführt als drei separate Methoden, die jeweils nur einen einzigen Typ zurückgeben. Dies liegt daran, dass der Compiler, wenn er genau weiß, welchen Typ die Funktion zurückgibt, auch die Funktionsaufrufsite optimieren kann. (ZB nicht auf Typkonvertierungen prüfen.)

Chris Smith
quelle
Ungefähr 99,999% der Anwendungen haben viel mehr Dinge, die die Geschwindigkeit der Programme verlangsamen, wie Datenbankzugriff, Dateizugriff oder Netzwerklatenz. Das Nachdenken über die Geschwindigkeit beim Entwerfen von Methoden kann ein wichtiger Grund für das Spielen, die Echtzeitanwendung oder die Berichterstellung mit Tonnen von Daten sein, in anderen Fällen jedoch nicht. Das ist ein guter Punkt, aber so klein ich als Programmierer bin, ich muss selten diese Art der Optimierung in meinen Anwendungen durchführen.
Samuel
Sie tun so etwas, wenn Sie die Geschwindigkeit Ihres Codes gemessen und für zu langsam befunden haben, wenn Sie wissen, was Sie tun (es ist nicht so einfach, wie Sie denken) und wenn Sie es anschließend messen und die Geschwindigkeit sich verbessert hat .
gnasher729
3

Es hängt sehr davon ab, was im Code enthalten ist.

Ich habe eine tausendzeilige Routine gesehen, mit der ich kein Problem hatte. Es war eine riesige switch-Anweisung, keine Option überschritt ein Dutzend Zeilen und die einzige Kontrollstruktur in jeder Option war eine einzelne Schleife. Heutzutage wäre es mit Objekten geschrieben worden, aber das war damals keine Option.

Ich betrachte auch 120 Zeilen in einem Schalter vor mir. Kein Fall überschreitet 3 Zeilen - eine Wache, eine Aufgabe und die Pause. Es analysiert eine Textdatei, Objekte sind keine Möglichkeit. Jede Alternative wäre schwerer zu lesen.

Loren Pechtel
quelle
2

Den meisten Compilern ist die Länge einer Funktion egal. Eine Funktion sollte funktional sein, aber sowohl leicht zu verstehen, zu ändern als auch für den Menschen wiederzuverwenden sein. Wählen Sie eine Länge, die am besten zu Ihnen passt.

LennyProgrammierer
quelle
1

Meine allgemeine Regel ist, dass eine Funktion auf den Bildschirm passen sollte. Es gibt nur drei Fälle, bei denen ich einen Verstoß festgestellt habe:

1) Versandfunktionen. In früheren Zeiten waren diese häufig, aber die meisten werden heutzutage durch Objektvererbung ersetzt. Objekte funktionieren jedoch nur in Ihrem Programm, und daher sehen Sie gelegentliche Versandfunktionen, wenn Sie Daten bearbeiten, die von einem anderen Ort stammen.

2) Funktionen, die eine ganze Reihe von Schritten ausführen, um ein Ziel zu erreichen, und bei denen den Schritten eine gute Unterteilung fehlt. Am Ende haben Sie eine Funktion, die einfach eine lange Liste anderer Funktionen in der angegebenen Reihenfolge aufruft.

3) Wie Nr. 2, wobei die einzelnen Schritte jedoch so klein sind, dass sie einfach inline und nicht separat aufgerufen werden.

Loren Pechtel
quelle
1

Vielleicht ist die Funktionslänge keine so gute Metrik. Wir versuchen, die zyklomatische Komplexität auch für Methoden zu verwenden, und eine der zukünftigen Check-in-Regeln für die Quellcodeverwaltung sieht vor, dass die zyklomatische Komplexität für Klassen und Methoden niedriger als X sein muss.

Für Methoden ist X auf 30 gesetzt und das ist ziemlich eng.

Peter Mortensen
quelle