In einem C ++ - Buch sagt der Autor, dass wir keine Funktion mit einer langen Parameterliste mehr benötigen, da die meisten Parameter in Statusvariablen in einer Klasse umgestaltet werden können. Andererseits sagt ein funktionales Programmierbuch, dass Zustandsvariablen böse sind, weil sie Nebenwirkungen verursachen, die fehleranfällig und schwer zu parallelisierenden Code verursachen. Ich werde verwirrt. Sollte der Code vermeiden, sich so weit wie möglich auf Zustandsvariablen zu verlassen, indem er seine Zustandsvariable in die Funktionsparameterliste verschiebt?
10
Antworten:
Hängt davon ab, ob Sie in einem
procedural
oder einemfunctional
Paradigma programmieren . Für den ersteren ist ein veränderlicher Zustand erforderlich und für den späteren verkrüppelt. Das sind Äpfel und Orangen. Sie sind beide richtig in ihren Vogteien!Sie können einzelne Zuweisungen und andere funktionale Techniken auf imperative prozedurale Sprachen anwenden. Der unveränderliche Zustand macht die gleichzeitige Programmierung deterministischer, aber es ist fast unmöglich, jedes Objekt in einer Sprache wie Java oder C ++ unveränderlich zu machen, da ihre Speichermodelle dieses Paradigma nicht einfach unterstützen.
quelle
Wenn ich Ihre Frage richtig verstehe, fragen Sie sich, welche Bedingungen die Verwendung eines Parameters oder einer Klassenvariablen / member / field / etc qualifizieren? Ich gehe davon aus, dass Sie sich auf eine Methode beziehen und nicht auf eine Funktion. Wenn es speziell um C ++ geht, empfehle ich, Ihre Frage in den Stapelüberlauf zu verschieben.
Eine lange Parameterliste kann ein Zeichen dafür sein, dass Sie Ihre Methode möglicherweise in eine Reihe detaillierterer umgestalten müssen. Im Allgemeinen wird Ihr Code durch die Verwendung von Parametern lockerer gekoppelt. Ich bin mir nicht sicher, ob dies für die meisten modernen OO-Sprachen mehr zutrifft, aber die Objekterstellung kann teuer sein, insbesondere wenn viele Klassenvariablen beteiligt sind. Wenn Ihre Klassenvariablen Objekte waren und in einem Programm häufig referenziert wurden, können sie als Klassenvariablen gerechtfertigt sein.
Ebenfalls:
quelle
Nein, Zustandsvariablen an sich verursachen keine Nebenwirkungen.
Das Aufrufen einer Setter-Methode (für eine Datenstruktur, die an anderer Stelle sichtbar ist) ist ein Nebeneffekt.
Sie können Datenstrukturen haben, um lange Parameterlisten auszublenden und Nebenwirkungen zu vermeiden, wenn Sie sie entsprechend erstellen. Hier ist ein kleines Beispiel (in Java ungetestet):
Natürlich hat der Konstruktor von ManyParams auf diese Weise immer noch eine lange Parameterliste. Aber es ist versteckt.
quelle