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
("colour", "blue")
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
("colour", "blue")
Morgen werde ich es schwarz übermalen lassen und der neue Zustand wird sein
("colour", "black")
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
- Ansatz 1 verbraucht weniger Speicher und ermöglicht eine effizientere Erstellung eines neuen Snapshots, da kein Kopieren erforderlich ist.
- Ansatz 1 überträgt den neuen Status implizit auf alle Teile eines Programms, die einen Verweis darauf enthalten. Ansatz 2 benötigt einen Mechanismus, um einen Snapshot an seine Beobachter zu übertragen, z. B. in Form eines Ereignisses.
- Ansatz 2 kann dazu beitragen, inkonsistente Statusfehler (z. B. Teilstatusaktualisierungen) zu vermeiden: Durch die Definition einer expliziten Funktion, die einen neuen Status von einem alten erzeugt, ist es einfacher, zwischen Snapshots zu unterscheiden, die zu verschiedenen Zeitpunkten erstellt wurden.
- Der Ansatz 2 ist modularer, da er es ermöglicht, auf einfache Weise Ansichten über den Zustand zu erstellen, die unabhängig von dem Zustand selbst sind, z. B. unter Verwendung von Funktionen höherer Ordnung wie
map
und filter
.