Dies ist eine Frage für Neulinge, aber ich konnte auf Google keine Antwort finden, die für Neulinge beweiskräftig genug ist.
Was bedeuten die Leute, wenn sie "Zustand" sagen - bei der Programmierung im Allgemeinen und bei der OO-Programmierung im Speziellen?
Auch, was ist veränderlicher und unveränderlicher Zustand - wieder allgemein in der Programmierung und auch spezifisch in OOP?
Antworten:
Sie haben Zustand, wenn Sie einer Identität und einem Zeitpunkt Werte (Zahlen, Zeichenfolgen, komplexe Datenstrukturen) zuordnen.
Beispielsweise stellt die Zahl 10 für sich genommen keinen Zustand dar: Sie ist nur eine genau definierte Zahl und wird immer für sich selbst stehen: die natürliche Zahl 10. In einem anderen Beispiel ist die Zeichenfolge "HELLO" eine Folge von fünf Zeichen und Es wird vollständig durch die darin enthaltenen Zeichen und die Reihenfolge ihres Auftretens beschrieben. In fünf Millionen Jahren wird die Saite "HELLO" immer noch die Saite "HELLO" sein: ein reiner Wert.
Um einen Zustand zu haben, muss man eine Welt betrachten, in der diese reinen Werte mit einer Art von Entitäten verbunden sind, die eine Identität besitzen . Identität ist eine primitive Idee: Sie können zwei Dinge unabhängig von anderen Eigenschaften unterscheiden. Zum Beispiel sind zwei Autos des gleichen Modells, der gleichen Farbe, ... zwei verschiedene Autos.
Wenn Sie diese Dinge mit Identität versehen, können Sie ihnen Eigenschaften zuweisen, die durch reine Werte beschrieben werden. Mein Auto hat zum Beispiel die Eigenschaft, blau zu sein. Sie können diese Tatsache beschreiben, indem Sie das Paar zuordnen
zu meinem Auto. Das Paar ("Farbe", "Blau") ist ein reiner Wert, der den Zustand dieses bestimmten Autos beschreibt.
Staat ist nicht nur mit einer bestimmten Entität verbunden, sondern auch mit einem bestimmten Zeitpunkt. So kann man sagen, dass mein Auto heute Zustand hat
Morgen werde ich es schwarz übermalen lassen und der neue Zustand wird sein
Beachten Sie, dass sich der Status einer Entität ändern kann, die Identität sich jedoch nicht per Definition ändert . Nun, solange die Entität existiert, kann ein Auto geschaffen und zerstört werden, aber es behält seine Identität während seines gesamten Lebens. Es macht keinen Sinn, über die Identität von etwas zu sprechen, das noch nicht existiert.
Wenn sich die Werte der Eigenschaften, die an eine bestimmte Entität angehängt sind, im Laufe der Zeit ändern, können Sie davon ausgehen, dass der Status dieser Entität geändert werden kann . Ansonsten sagst du, dass der Staat unveränderlich ist .
Die gebräuchlichste Implementierung besteht darin, den Status einer Entität in einer Art von Variablen (globale Variablen, Objektelementvariablen) zu speichern, dh den aktuellen Snapshot eines Status zu speichern . Der veränderbare Zustand wird dann durch Zuweisung implementiert: Jede Zuweisungsoperation ersetzt den vorherigen Schnappschuss durch einen neuen. Diese Lösung verwendet normalerweise Speicherorte zum Speichern des aktuellen Schnappschusses. Das Überschreiben eines Speicherorts ist ein destruktiver Vorgang, bei dem ein Schnappschuss durch einen neuen ersetzt wird. ( Hier finden Sie einen interessanten Vortrag über diesen ortsorientierten Programmieransatz .)
Eine Alternative besteht darin, die nachfolgenden Zustände (Verlauf) einer Entität als Strom (möglicherweise unendliche Folge) von Werten anzuzeigen , siehe z. B. Kapitel 3 von SICP . In diesem Fall wird jeder Schnappschuss an einem anderen Speicherort gespeichert, und das Programm kann gleichzeitig verschiedene Schnappschüsse untersuchen. Nicht verwendete Schnappschüsse können über den Müll gesammelt werden, wenn sie nicht mehr benötigt werden.
Vor- und Nachteile der beiden Ansätze
map
undfilter
.quelle
Zustand ist einfach Information über etwas, das in Erinnerung bleibt.
Stellen Sie sich als einfache Übung zur Objektorientierung eine Klasse als Ausstecher und Cookies als Objekte vor. Mit der Ausstechform (Klasse) können Sie ein Cookie erstellen (ein Objekt instanziieren). Angenommen, eine der Eigenschaften des Kekses ist seine Farbe (die durch Verwendung von Lebensmittelfarben geändert werden kann). Die Farbe dieses Cookies ist Teil seines Zustands, ebenso wie die anderen Eigenschaften.
Der veränderbare Status ist der Status, der geändert werden kann, nachdem Sie das Objekt erstellt haben (Cookie). Der unveränderliche Zustand ist ein Zustand, der nicht geändert werden kann.
Unveränderliche Objekte (für die keiner der Status geändert werden kann) werden wichtig, wenn Sie sich mit der Parallelität befassen, dh wenn mehr als ein Prozessor in Ihrem Computer gleichzeitig mit diesem Objekt arbeiten kann. Unveränderlichkeit garantiert, dass Sie sich darauf verlassen können, dass der Zustand während der gesamten Lebensdauer des Objekts stabil und gültig ist.
Im Allgemeinen wird der Status eines Objekts in "privaten oder Mitgliedsvariablen" gespeichert und über "Eigenschaften" oder Getter / Setter-Methoden aufgerufen.
quelle
Ich denke, der Begriff "Zustand" (im Gegensatz zu einem konkreten Zustandstyp wie "Mitgliedsvariable") ist am nützlichsten, wenn eine zustandsbehaftete API mit einer zustandslosen API verglichen wird. Der Versuch, "state" zu definieren, ohne APIs zu erwähnen, ähnelt dem Versuch, "variable" oder "function" zu definieren, ohne Programmiersprachen zu erwähnen. Die meisten der richtigen Antworten sind nur für Personen sinnvoll, die bereits wissen, was die Wörter bedeuten.
Stateful vs Staatenlos
Zum Beispiel ist OpenGL wahrscheinlich die zustandsstärkste API, die mir bekannt ist. Wenn ich es für einen Moment lächerlich stark vereinfachen darf, könnten wir sagen, dass es ungefähr so aussieht:
Fast jede Funktion wird nur verwendet, um einen Teil des Zustands zu übergeben, an den sich OpenGL erinnern muss. Am Ende rufen Sie eine antiklimaktisch einfache Funktion auf, um die gesamte Zeichnung durchzuführen.
Eine zustandslose Version von (stark vereinfachtem) OpenGL würde wahrscheinlich ungefähr so aussehen:
Sie werden oft Leute sagen hören, dass APIs mit weniger Status einfacher zu begründen sind. Wenn Sie die Anzahl der Argumente unter Kontrolle halten können, stimme ich dem im Allgemeinen zu.
Veränderlich gegen unveränderlich
Diese Unterscheidung ist meines Wissens nur dann sinnvoll, wenn Sie einen Ausgangszustand angeben können . Zum Beispiel mit C ++ - Konstruktoren:
Es ist schwierig, eine Fensterklasse zu implementieren, die sich nicht an die Größe "erinnert". Sie können jedoch entscheiden, ob der Benutzer die Größe eines Fensters nach dem Erstellen ändern kann.
PS In OOP ist es wahr, dass "state" normalerweise "member variables" bedeutet, aber es kann noch viel mehr sein. In C ++ kann eine Methode beispielsweise eine statische Variable haben, und Lambdas können durch Erfassen von Variablen zu Abschlüssen werden. In beiden Fällen bleiben diese Variablen über mehrere Aufrufe der Funktion bestehen und werden daher wahrscheinlich als Status qualifiziert. Lokale Variablen in einer regulären Funktion können auch als Status betrachtet werden, je nachdem, wie sie verwendet werden (die, die ich in main () habe, zählen oft).
quelle
In Laienwörtern
Das Wörterbuch besagt:
Der Zustand von etwas ist die Menge von Werten, die seine Attribute zu einem bestimmten Zeitpunkt haben.
In OOP ist der Status eines Objekts eine Momentaufnahme der Werte seiner Attribute zu einem bestimmten Zeitpunkt.
Der Zustand davon ist, dass seine Farbe blau ist, sein Preis 100 ist und seine Größe klein ist.
Wenn Sie später tun:
Sie haben eines der Attribute geändert, aber Sie haben auch den Status insgesamt geändert, da das Objekt nicht mehr so ist wie es war.
Manchmal werden Klassen so entworfen, dass die Werte ihrer Eigenschaften nach ihrer Erstellung nicht mehr geändert werden können. Alle Werte ihrer Eigenschaften werden entweder an den Konstruktor übergeben oder aus einer Quelle wie einer Datenbank oder einer Datei gelesen. Es gibt jedoch keine Möglichkeit, diese Werte nach diesem Zeitpunkt zu ändern, da es keine "Setter" -Methoden oder andere Methoden gibt Ändern der Werte im Objekt.
Das nennt man einen Zustand, der nicht mutiert werden kann. Alles, was Sie tun können, ist, das Objekt zu zerstören, ein neues zu erstellen und es derselben Referenz oder Variablen zuzuweisen.
quelle