Eine Zeile funktioniert in C?

9

Was halten Sie von einer Linienfunktion? Ist es schlimm? Ein Vorteil, den ich mir vorstellen kann, ist, dass es den Code umfassender macht (wenn Sie einen guten Namen dafür wählen). Zum Beispiel:

%Vor%

Ein Nachteil, den ich mir vorstellen kann, ist, dass es den Code verlangsamt (indem man die Parameter verschiebt, zu einer Funktion springt, die Parameter löscht, die Operation ausführt, zum Code zurückspringt - und nur für eine Zeile?)

ist es besser, solche Zeilen in Funktionen zu setzen oder sie einfach in den Code einzufügen? Selbst wenn wir sie nur einmal benutzen?

Übrigens, ich habe keine Frage dazu gefunden, also vergib mir, wenn eine solche Frage schon einmal gestellt wurde.

    
Ori Popowski 24.04.2009, 09:23
quelle

8 Antworten

22

Haben Sie keine Angst vor 1-zeiligen Funktionen!

Viele Programmierer scheinen eine Blockade über 1-Linien-Funktionen zu haben, sollten Sie nicht.

Wenn der Code klarer und sauberer wird, extrahieren Sie die Zeile in eine Funktion.

Die Leistung wird wahrscheinlich nicht beeinträchtigt.

Jeder ordentliche Compiler, der in den letzten zehn Jahren (und vielleicht noch weiter) gemacht wurde, wird automatisch eine einfache 1-Zeilen-Funktion inline bilden. Außerdem kann die 1-Zeile von C leicht mehreren Maschinencodezeilen entsprechen. Sie sollten nicht davon ausgehen, dass selbst im theoretischen Fall, in dem Sie den vollen Overhead eines Funktionsaufrufs in Kauf nehmen, dieser Overhead im Vergleich zu Ihrer "kleinen Leitung" signifikant ist. Ganz zu schweigen von der Gesamtleistung Ihrer Anwendung.

Abstraktion führt zu besserem Design. (Auch für einzelne Codezeilen)

Funktionen sind die primären Bausteine ​​des abstrakten, komponentenbasierten Codes, sie sollten nicht vernachlässigt werden. Wenn Sie eine Codezeile hinter einem Funktionsaufruf einkapseln, machen Sie den Code lesbarer. Auch für den Fall, dass die Funktion einmal aufgerufen wird. Wenn Sie es für wichtig halten, eine bestimmte Codezeile zu kommentieren, ist das ein guter Code-Geruch, dass es hilfreich sein könnte, den Code in eine gut benannte Funktion zu verschieben.

Sicher, dieser Code könnte heute 1-zeilig sein, aber wie viele verschiedene Arten, die gleiche Funktion auszuführen, sind da? Durch das Einkapseln von Code in einer Funktion können Sie leichter alle für Sie verfügbaren Designoptionen sehen. Vielleicht wird Ihre 1-Code-Zeile zu einem Aufruf an einen Webservice erweitert, vielleicht wird sie zu einer Datenbankabfrage, vielleicht wird sie konfigurierbar (zum Beispiel mit dem Strategie-Muster), vielleicht möchten Sie den zwischen 1 und 1 berechneten Wert zwischenspeichern. Linie. Alle diese Optionen sind einfacher zu implementieren und leichter zu verstehen, wenn Sie Ihre 1-Zeilen-Code in eine eigene Funktion extrahiert haben.

Vielleicht sollte Ihre 1-Linie mehr Linien sein.

Wenn Sie einen großen Codeblock haben, kann es verlockend sein, viele Funktionen auf einer einzelnen Zeile zu speichern, nur um auf dem Bildschirm Platz zu sparen. Wenn Sie diesen Code zu einer Funktion migrieren, reduzieren Sie diesen Druck, was dazu führen könnte, dass Sie Ihren komplexen 1-Liner in einfacheren Code mit mehreren Zeilen erweitern (was wahrscheinlich die Lesbarkeit und Wartbarkeit verbessern würde).

    
Wedge 24.04.2009, 09:48
quelle
8

Ich bin kein Fan davon, dass alle Arten von Logik und Funktionalität in einer Zeile zusammengefasst sind. Das Beispiel, das Sie gezeigt haben, ist ein Durcheinander und könnte in mehrere Zeilen unterteilt werden, indem aussagekräftige Variablennamen verwendet und eine Operation nach der anderen ausgeführt wird.

Ich empfehle dringend, in jeder Frage dieser Art einen Blick darauf zu werfen (kaufen, ausleihen, (nicht herunterladen) (kostenlos)) bei dieses Buch: Robert C. Martin - Clean Code . Es ist ein Buch, das jeder Entwickler sehen sollte.

Es wird dich nicht sofort zu einem guten Programmierer machen und es wird dich nicht davon abhalten, hässlichen Code in der Zukunft zu schreiben, es wird dich jedoch dazu bringen, es zu realisieren, wenn du hässlichen Code schreibst. Es zwingt Sie, Ihren Code kritisch zu betrachten und Ihren Code wie eine Zeitungsgeschichte lesbar zu machen.

    
Peter Perháč 24.04.2009 09:33
quelle
5

Wenn Sie es mehr als einmal verwenden, machen Sie es definitiv zu einer Funktion und lassen Sie den Compiler das Inlining ausführen (möglicherweise fügen Sie der Funktionsdefinition "inline" hinzu). (& lt; Üblicher Rat über vorzeitige Optimierung geht hier & gt;)

    
Brian 24.04.2009 09:26
quelle
5

Da Ihr Beispiel anscheinend eine C (++) Syntax verwendet, sollten Sie sich die Inline-Funktionen ansehen die den Overhead des Aufrufens einer einfachen Funktion eliminieren. Dieses Schlüsselwort ist jedoch nur eine Empfehlung an den Compiler, und es kann nicht alle Funktionen, die Sie markieren, inline einfügen und möglicherweise unmarkierte Funktionen inline einfügen.

In .NET wird der JIT Inline-Methoden verwenden, die er für geeignet hält, aber Sie haben keine Kontrolle darüber, warum oder wann dies geschieht, obwohl Debugging-Builds niemals inline sind, da dies den Quellcode-Abgleich stoppen würde die kompilierte Anwendung.

    
Martin Harris 24.04.2009 09:33
quelle
1

Mit einer Zeilenfunktion ist nichts falsch. Wie bereits erwähnt, ist es für den Compiler möglich, die Funktionen zu inline zu schreiben, die jegliche Leistungseinbußen beseitigen.

Funktionen sollten auch gegenüber Makros bevorzugt werden, da sie einfacher zu debuggen, zu modifizieren, zu lesen sind und weniger unbeabsichtigte Nebenwirkungen haben.

Wenn es nur einmal verwendet wird, ist die Antwort weniger offensichtlich. Verschieben Sie es zu einer Funktion kann die aufrufende Funktion einfacher & amp; klarer, indem Sie etwas von der Komplexität in die neue Funktion verschieben.

    
Steven 24.04.2009 09:35
quelle
0

Wenn Sie den Code innerhalb dieser Funktion dreimal oder öfter verwenden, würde ich empfehlen, das in eine Funktion zu stellen. Nur für Wartbarkeit.

    
Ólafur Waage 24.04.2009 09:25
quelle
0

Welche Sprache? Wenn Sie C meinen, würde ich auch den Qualifier inline verwenden. In C ++ habe ich die Option inline , boost.lamda oder und C ++ 0x native Unterstützung für lamdas vorwärts zu bewegen.

    
dirkgently 24.04.2009 09:26
quelle
-1

Manchmal ist es keine schlechte Idee, den Präprozessor zu verwenden:

%Vor%

Zugegeben, Sie erhalten keine Art von Überprüfung, aber in einigen Fällen kann dies nützlich sein. Makros haben ihre Nachteile und ihre Vorteile, und in einigen Fällen können ihre Nachteile zu Vorteilen werden. Ich bin ein Fan von Makros an geeigneten Orten, aber es liegt an Ihnen zu entscheiden, wann es angemessen ist. In diesem Fall werde ich ein wenig aus dem Takt fallen und sagen, dass, was auch immer du am Ende machst, diese eine Zeile Code ziemlich viel ist.

%Vor%     
Chris Lutz 24.04.2009 09:41
quelle