Ich vermute, ich werde mich nicht mit dieser Frage befassen, aber ich bin ein sehr erfahrener Programmierer, und ich hoffe, dass einige der aufgeschlosseneren Leser darauf achten werden.
Ich glaube, dass es für objektorientierte Programmiersprachen besser geeignet ist, wenn ihre Value-Returning-Verfahren (VRPs) deterministisch und rein sind.
'VRP' ist der moderne akademische Name für eine Funktion, die als Teil eines Ausdrucks aufgerufen wird und einen Rückgabewert hat, der den Aufruf während der Auswertung des Ausdrucks fiktiv ersetzt. ZB in einer Anweisung wie x = 1 + f(y)
der Funktion f
dient die Funktion als VRP.
'Deterministisch' bedeutet, dass das Ergebnis der Funktion nur von den Werten ihrer Parameter abhängt. Wenn Sie es erneut mit denselben Parameterwerten aufrufen, erhalten Sie mit Sicherheit dasselbe Ergebnis.
'Rein' bedeutet keine Nebenwirkungen: Der Aufruf der Funktion bewirkt nichts anderes als die Berechnung des Ergebnisses. Dies kann so interpretiert werden, dass es in der Praxis keine wichtigen Nebenwirkungen gibt. Wenn der VRP beispielsweise bei jedem Aufruf eine Debugging-Nachricht ausgibt, kann dies wahrscheinlich ignoriert werden.
Wenn Ihre Funktion in C # nicht deterministisch und rein ist, sollten Sie sie zu einer void
Funktion machen (mit anderen Worten, nicht zu einem VRP), und jeder Wert, den sie zurückgeben muss, sollte entweder in einem out
oder einem ref
Parameter zurückgegeben werden.
Wenn Sie beispielsweise eine Funktion zum Löschen einiger Zeilen aus einer Datenbanktabelle haben und möchten, dass diese die Anzahl der gelöschten Zeilen zurückgibt, sollten Sie Folgendes deklarieren:
public void DeleteBasketItems(BasketItemCategory category, out int count);
Wenn Sie diese Funktion manchmal aufrufen möchten, aber die nicht erhalten möchten count
, können Sie jederzeit eine Überladung deklarieren.
Vielleicht möchten Sie wissen, warum dieser Stil besser zur objektorientierten Programmierung passt. Im Großen und Ganzen passt es in einen Programmierstil, der (etwas ungenau) als "prozedurale Programmierung" bezeichnet werden könnte, und es ist ein prozeduraler Programmierstil, der besser zur objektorientierten Programmierung passt.
Warum? Das klassische Modell von Objekten besteht darin, dass sie Eigenschaften (auch Attribute genannt) haben und Sie das Objekt (hauptsächlich) abfragen und bearbeiten, indem Sie diese Eigenschaften lesen und aktualisieren. Ein prozeduraler Programmierstil erleichtert dies in der Regel, da Sie zwischen Operationen, die Eigenschaften abrufen und festlegen, beliebigen Code ausführen können.
Der Nachteil der prozeduralen Programmierung besteht darin, dass Sie, da Sie überall beliebigen Code ausführen können, über globale Variablen und Nebenwirkungen einige sehr stumpfe und fehleranfällige Interaktionen erhalten können.
Es ist also ganz einfach eine gute Praxis, jemandem, der Ihren Code liest, zu signalisieren , dass eine Funktion Nebenwirkungen haben kann, indem sie nicht wertmäßig zurückgegeben wird.