Funktionen gegen wiederholten Code

8

Ich schreibe etwas PHP-Code, um PDFs mit der FPDF-Bibliothek zu erstellen. Und ich benutze grundsätzlich die gleichen 4 Zeilen Code, um jede Zeile des Dokuments zu drucken. Ich fragte mich, was effizienter ist, diese 4 Zeilen immer wieder zu wiederholen, oder würde es in eine Funktion besser machen? Ich bin neugierig, weil es sich anfühlt, als ob eine Funktion einen größeren Overhead hätte, weil die Funktion nur 4 Zeilen lang wäre.

Der Code, den ich in Frage stelle, sieht so aus:

%Vor%     
cskwrd 02.08.2010, 13:22
quelle

8 Antworten

16

Dies sollte es beantworten: Ссылка und Ссылка

  

Das Gesetz von Curly, mach eins, ist   spiegelt sich in mehreren Kernprinzipien wider   der modernen Softwareentwicklung:

     
  • Wiederholen Sie sich nicht

         

    Wenn Sie mehr als eine Möglichkeit haben, dasselbe zu einem bestimmten Zeitpunkt auszudrücken   die zwei oder drei verschiedenen   Darstellungen werden höchstwahrscheinlich fallen   aus dem Takt geraten. Selbst wenn   sie nicht, du garantierst   selbst die Kopfschmerzen der Aufrechterhaltung   sie parallel, wenn eine Veränderung   tritt ein. Und Veränderung wird auftreten. Nicht   Wiederhole dich selbst ist wichtig, wenn du es bist   will flexibel und wartbar sein   Software.

  •   
  • Einmal und nur einmal

         

    Jede Verhaltenserklärung sollte einmal und nur einmal vorkommen   Einmal. Dies ist eines der Hauptziele,   wenn nicht das Hauptziel, beim Refactoring   Code. Das Designziel ist zu eliminieren   doppelte Verhaltenserklärungen,   typischerweise durch Zusammenführen oder Ersetzen   mehrere ähnliche Implementierungen mit   eine einigende Abstraktion.

  •   
  • Single Point of Truth

         

    Wiederholung führt zu Inkonsistenz und Code, der subtil ist   kaputt, weil du nur ein paar verändert hast   Wiederholungen, wenn du dich ändern musstest   alle von ihnen. Oft bedeutet das auch   Du hast nicht richtig durchdacht   die Organisation Ihres Codes. Irgendein   Mal sehen Sie doppelten Code, das ist ein   Gefahrenzeichen. Komplexität ist ein Kostenfaktor;   Zahlen Sie es nicht zweimal.

  •   
    
Christian Smorra 02.08.2010, 13:25
quelle
12

Anstatt sich selbst zu fragen, was effizienter ist, sollten Sie sich stattdessen fragen, was besser zu warten ist.

Das Schreiben einer Funktion ist weitaus wartungsfreundlicher.

    
tplaner 02.08.2010 13:25
quelle
11
  

Ich bin neugierig, weil es sich anfühlt wie ein   Funktion hätte einen größeren Overhead   Because die Funktion wäre nur 4   Zeilen lang.

Hier kommt Spaghetti her.

Definiere es eindeutig in eine Funktion und rufe es auf. Der Aufwand, vor dem Sie Angst haben, ist die schlimmste Art der vorzeitigen Optimierung.

TROCKEN - Wiederhole dich nicht.

    
duffymo 02.08.2010 13:26
quelle
4

Mach es zu einer Funktion. Funktionsaufruf ist heutzutage ziemlich klein. Im Allgemeinen können Sie viel mehr Zeit sparen, indem Sie bessere High-Level-Algorithmen finden, als mit solchen Low-Level-Details herumzuspielen. Und es ist weit einfacher und mit einer solchen Funktion richtig zu machen. Wozu soll es einem Menschen nützen, wenn er ein wenig beschleunigen und die Richtigkeit seines Programms verlieren soll?

    
Paul E. 02.08.2010 13:28
quelle
2

Eine Funktion ist sicherlich vorzuziehen, besonders wenn Sie später zurückgehen müssen, um eine Änderung vorzunehmen.

    
dave 02.08.2010 13:24
quelle
2

Mach dir keine Sorgen über den Overhead; Sorgen Sie sich um sich selbst, ein Jahr in der Zukunft, versuchen Sie, dies zu debuggen.

Im Lichte des oben genannten, wiederholen Sie nicht sich selbst und machen Sie eine winzige Funktion.

    
Piskvor 02.08.2010 13:28
quelle
1

Zusätzlich zu all den wertvollen Antworten zu dem viel wichtigeren Thema der Wartbarkeit; Ich möchte etwas zur Frage des Overheads hinzufügen.

Ich verstehe nicht, warum Sie befürchten, dass eine Vier-Zeilen-Funktion einen größeren Overhead hätte.

  1. In einer kompilierten Sprache wäre ein guter Compiler wahrscheinlich in der Lage, sie trotzdem zu inline zu schreiben.

  2. In einer interpretierten Sprache (wie PHP) muss der Interpreter den gesamten Wiederholungscode jedes Mal analysieren, wenn er auftritt, zur Laufzeit . Für mich bedeutet das, dass Wiederholungen einen noch höheren Aufwand als ein Funktionsaufruf haben.

  3. Wenn Sie sich über den Funktionsaufruf-Overhead Gedanken machen, ist das eine furchtbare vorzeitige Optimierung. In solchen Fällen ist die einzige Möglichkeit, wirklich zu wissen, was schneller ist, das Profil.

Lass es funktionieren, mach es richtig, mach es schnell. In dieser Reihenfolge.

    
Paul Butcher 02.08.2010 14:19
quelle
0

Der Overhead ist tatsächlich sehr klein und verursacht keinen großen Unterschied in Ihrer Anwendung. Würden Sie lieber diesen kleinen Overhead haben, aber ein einfacheres Programm haben, oder Sie möchten die bloße Millisekunde sparen, aber Stunden brauchen, um kleine Änderungen zu korrigieren, die sich wiederholen.

Wenn Sie mich oder einen anderen Entwickler dort fragen, wollen wir definitiv die erste Option. Also mach weiter mit der Funktion. U wird vielleicht nicht den Code heute beibehalten, aber wenn du es tust, wirst du dich dafür hassen, dass du versuchst, diese bloßen Millisekunden zu speichern

    
C_Rance 02.08.2010 14:20
quelle

Tags und Links