Lange Parameterliste versus lange Statusvariablenliste

10

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?

TomCaps
quelle
Hat das ursprüngliche Buch C ++ als funktionale Sprache kommentiert?
Martin York

Antworten:

7

Hängt davon ab, ob Sie in einem proceduraloder einem functionalParadigma 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
:Vielen Dank! Das Buch << 97 Dinge, die jeder Programmierer wissen sollte >> besagt, dass wir funktionale Programmierprinzipien anwenden sollten, z. B. Nebenwirkungen vermeiden. Können wir funktionale Programmierprinzipien nicht in einem imperativen Codekontext anwenden?
TomCaps
Für die prozedurale Programmierung ist kein Staat erforderlich . Es ist üblich, aber nicht erforderlich. Dass es üblich ist, liegt mehr an Gewohnheiten als an irgendetwas anderem. Ich gebe jedoch zu, dass es sicherlich Situationen gibt, in denen es einfacher ist, eine (Zustands-) Variable zu behalten als die Alternativen (z. B. asynchrone Verarbeitung).
Marjan Venema
@ Marjan alles, was unveränderliche Variablen hat, ist state
@ Jarrod: Jetzt hast du mich verwirrt. Wenn ich Ihre Antwort noch einmal lese, sehe ich, dass ich das "Mutable" in "Mutable State ist erforderlich" verpasst habe. Ihr Kommentar scheint jedoch zu sagen, dass unveränderliche Variablen ein Zustand sind. Versteh es nicht. Könnte daran liegen, dass ich es nicht gewohnt bin, in diesen Begriffen herumzuwerfen und über veränderlich und unveränderlich nachzudenken. Irgendwelche Referenzen, die ich lesen kann?
Marjan Venema
@MarjanVenema: Ja, unveränderliche Variablen sind Status. Der Unterschied im Handhabungsstatus zwischen prozeduraler und funktionaler Programmierung ist nicht der proc.prog. hat Zustand und funktional nicht - vielmehr ist der Unterschied, dass proc. prog. hat einen veränderlichen Zustand, während der Zustand in der (reinen) funktionalen Programmierung immer unveränderlich ist. Siehe z. B. en.wikipedia.org/wiki/Purely_functional , in dem erklärt wird, dass rein funktionale Sprachen Aktualisierungen vermeiden.
Sleske
1

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:

  • Könnten andere Methoden die Klassenvariablen verwenden? Wenn ja, sollten Sie Klassenvariablen verwenden.
  • Ist Ihre Methode öffentlich? Wenn öffentlich, verwenden Sie Parameter.
  • Kann Ihre Parameterliste angemessen als Hash / Map / Array / Collection / List / etc dargestellt werden? Wenn ja, betrachten Sie es als eine Option.
  • Ist Ihre Methode statisch? Wenn ja, verwenden Sie Parameter.
Travis J.
quelle
0

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):

class ManyParams {
    final String theName = null;
    final int    theAge = 0:
    ManyParams() {}
    ManyParams(String a, int b) { theName=a; theAge = b; }
    public withName(String n) {
        return new ManyParams(n, this.theAge);
    }
    public withAge(int i) {
         return new ManyParams(theName, i);
    }
}
/// to be used like this
foo(new ManyParams.withName("John").withAge(42));

Natürlich hat der Konstruktor von ManyParams auf diese Weise immer noch eine lange Parameterliste. Aber es ist versteckt.

Ingo
quelle