Ich benutze Funktionen teilweise, um den Code zu dokumentieren. Das Aufrufen einer Funktion mit einem aussagekräftigen Namen erleichtert das Verständnis des Codes. In einigen Fällen ist sogar eine Funktion mit einer einzelnen Zeile sinnvoll.
In "Clean Code" gibt Robert C. Martin beispielsweise das folgende Beispiel an: Welches würden Sie lieber sehen? Dies:
// Check to see if the employee is eligible for full benefits
if ((employee.flags & HOURLY_FLAG) &&
(employee.age > 65))
Oder dieses?
if (employee.isEligibleForFullBenefits())
Ich stimme ihm nicht immer zu, aber in diesem Fall. Code sollte nicht nur lesbar sein, wenn Sie ihn schreiben und jedes Detail kennen, sondern auch um 21.00 Uhr, wenn Sie Fehler im Code eines anderen Benutzers beheben müssen. Es ist nicht empfehlenswert, lange zu warten und zu versuchen, alle Doppelnegative herauszufinden. Wenn Sie einfach einen Namen darauf setzen können (nicht nur Bedingungen, sondern jeden Code, den Sie schreiben), wird es viel einfacher.
Ich habe es nie bereut, etwas in eine Funktion eingefügt zu haben, und wenn Sie sich Sorgen um die Leistung machen, sollten Sie sich zuerst profilieren.
Es gibt ein weit verbreitetes Missverständnis, dass Funktionsaufrufe nur erfolgen sollten, um sich wiederholende Codesegmente zu vermeiden. Meine Faustregel lautet, dass jede logische Arbeitseinheit zu einer Funktion gemacht werden sollte, auch wenn sie nur an einem einzigen Ort verwendet wird. Dies führt normalerweise zu einer besseren Lesbarkeit und ermöglicht es Ihnen, selbstdokumentierenden Code zu schreiben, bei dem Funktionsnamen Kommentare ersetzen und Sie keine zusätzlichen Kommentare schreiben müssen, die erklären, was Sie tun.
quelle
Wenn es an mehr als einem Ort verwendet wird, und
dann mache es zu einer Funktion oder Methode. Nach meiner Erfahrung werden lange Teile von wiederholtem Code natürlich in eine dieser Kategorien fallen (normalerweise die erste, aber dann überlappen sich die Kategorien stark;). Natürlich ist alles, was sich in der Schnittstelle befinden muss, auch eine eigenständige Funktion / Methode.
quelle
float x
,int y
unddouble density
dann können diese Berechnungen als C - Funktion der Einrichtung sein heikler als nur den Code zu wiederholen, da Sie einen Weg finden , haben alle drei Werte raus. Wenn die wiederholten Berechnungen selbst trivial sind, ist es manchmal besser, sie einfach inline zu lassen.Fast immer, besonders wenn jedes Duplikat konzeptionell den gleichen Vorgang darstellt. Führen Sie eine generische Implementierung durch, wenn dies auf die gleiche Weise, jedoch auf unterschiedlichen Typen durchgeführt wird.
Der einzige Grund, warum ich mir das nicht vorstellen kann, ist die Wartung: Manchmal ist es vielleicht bequemer, eine Abhängigkeit zwischen einzelnen Dingen zu vermeiden, selbst wenn einige Duplikate erforderlich sind.
quelle
Eine Suche nach " Refactoring " führt Sie zu vielen Ressourcen für "Best Practices" der Branche für diesen sehr häufigen Prozess. Der etwas berühmte Artikel " Once and Only Once" ist eine großartige historische Referenz, die erklärt, was einige als "Best Practices" für die von Ihrer Frage aufgeworfenen Bedenken ansehen. Das noch allgemeinere Konzept wird auch als Don't Repeat Yourself (DRY) bezeichnet . Lesen Sie Martin Fowlers großen Klassiker " Refactoring: Verbessern des Designs von vorhandenem Code" , der einige der bekanntesten Ratschläge für das Refactoring enthält , die Sie intuitiv ausführen möchten !
quelle
Wenn der Code mehrmals genau wiederholt wird und sich der wiederholte Abschnitt in naher Zukunft nicht ändern wird, breche ich ihn in eine Funktion auf.
quelle
Das hängt von der Art des Zusammenhalts des wiederholten Codes ab. Wenn der wiederholte Codeabschnitt eine bestimmte Funktion ausführt, ist er ein ausgezeichneter Kandidat für die Umwandlung in eine Methode, zum Teil aufgrund des DRY-Prinzips , zum Teil, weil nur ein Abschnitt vorhanden ist, wenn die Funktion optimiert oder korrigiert werden muss Code zu behandeln.
Wenn die Zuordnung zufällig ist, ist es besser, den Code zu wiederholen, als ihn in eine Methode umzuwandeln. Wenn Sie etwas in die Mitte einer der Codesequenzen einfügen müssen, um eine der Verwendungen dieses Snippets zu erfüllen, kann sich die Änderung, die Sie vornehmen, auf andere Verwendungen dieser Methode auswirken.
Siehe den Wikipedia-Artikel zum Konzept der Codekohäsion .
quelle
Man muss zwischen Funktionen im Sinne einer strukturierten Programmierung und Methoden einer Klasse unterscheiden.
In Ihrem Beispiel haben Sie eine Methode gezeigt, die als solche nicht inline codiert werden sollte.
Möglicherweise müssen Sie eine Zeichenfolge validieren, um festzustellen, ob es sich um eine Zahl handelt. In diesem Fall verwenden Sie eine Funktion, und die meisten der vorstehenden Antworten gelten.
Diese Unterscheidung ist besonders bei großen Projekten wichtig.
Versuchen Sie, so gut Sie können, Geschäftsregeln (das sind Methoden) von Rechenalgorithmen (das sind reine Programmierfunktionen) zu trennen.
quelle