it-swarm.com.de

Was ist Staat, veränderlicher Staat und unveränderlicher Staat?

Dies ist eine Neulingsfrage, aber ich konnte bei Google keine neulingsichere Antwort finden.

Was meinen die Leute, wenn sie 'state' sagen - in der Programmierung im Allgemeinen und in OO Programmierung im Speziellen?

Was ist ein veränderlicher und unveränderlicher Zustand - wiederum allgemein in der Programmierung und speziell in der OOP?

34
Aviv Cohn

Sie haben den Status, wenn Sie einer Identität und einem Zeitpunkt Werte (Zahlen, Zeichenfolgen, komplexe Datenstrukturen) zuordnen.

Zum Beispiel repräsentiert die Zahl 10 an sich keinen Zustand: Sie ist nur eine genau definierte Zahl und wird immer selbst sein: die natürliche Zahl 10. Als weiteres Beispiel ist die Zeichenfolge "HALLO" eine Folge von fünf Zeichen und Es wird vollständig durch die darin enthaltenen Zeichen und die Reihenfolge beschrieben, in der sie erscheinen. 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 einer Art von Entitäten zugeordnet 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 hinzufügen, die durch reine Werte beschrieben werden. Zum Beispiel hat mein Auto 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.

Der Staat ist nicht nur einer bestimmten Entität zugeordnet, sondern auch einem bestimmten Zeitpunkt. Man kann also sagen, dass mein Auto heute einen Zustand hat

("colour", "blue")

Morgen werde ich es in schwarz neu streichen lassen und der neue Zustand wird sein

("colour", "black")

Beachten Sie, dass sich der Status einer Entität ändern kann, ihre Identität sich jedoch per Definition nicht ändert . Nun, solange die Entität existiert, natürlich: Ein Auto kann geschaffen und zerstört werden, aber es wird seine Identität während seines gesamten Lebens behalten. Es macht keinen Sinn, über die Identität von etwas zu sprechen, das noch nicht mehr existiert.

Wenn sich die Werte der Eigenschaften, die einer bestimmten Entität zugeordnet sind, im Laufe der Zeit ändern, sagen Sie, dass der Status dieser Entität veränderbar ist . Ansonsten sagen Sie, dass der Zustand unveränderlich ist .

Die häufigste Implementierung besteht darin, den Status einer Entität in einer Art von Variablen (globale Variablen, Objektmitgliedsvariablen) zu speichern, dh den aktuellen Snapshot zu speichern. eines Staates. Der veränderbare Status wird dann mithilfe der Zuweisung implementiert: Jede Zuweisungsoperation ersetzt den vorherigen Snapshot durch einen neuen. Diese Lösung verwendet normalerweise Speicherorte zum Speichern des aktuellen Snapshots. Das Überschreiben eines Speicherorts ist eine destruktive Operation, bei der ein Snapshot durch einen neuen ersetzt wird. ( hier Sie finden einen interessanten Vortrag über diesen ortsorientierte Programmierung Ansatz.)

Eine Alternative besteht darin, die nachfolgenden Zustände (Verlauf) einer Entität als einen Strom (möglicherweise eine unendliche Folge) von Werten anzusehen, siehe z. Kapitel 3 von SICP . In diesem Fall wird jeder Snapshot an einem anderen Speicherort gespeichert, und das Programm kann gleichzeitig verschiedene Snapshots untersuchen. Nicht verwendete Schnappschüsse können gesammelt werden, wenn sie nicht mehr benötigt werden.

Vor-/Nachteile der beiden Ansätze

  • Ansatz 1 verbraucht weniger Speicher und ermöglicht die 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 würde einen Mechanismus benötigen, um einen Schnappschuss an seine Beobachter zu senden, z. in Form einer Veranstaltung.
  • Ansatz 2 kann dazu beitragen, inkonsistente Statusfehler (z. B. teilweise Statusaktualisierungen) zu vermeiden: Durch Definieren einer expliziten Funktion, die einen neuen Status von einem alten erzeugt, ist es einfacher, zwischen Schnappschüssen zu unterscheiden, die zu verschiedenen Zeitpunkten erstellt wurden.
  • Ansatz 2 ist insofern modularer, als er es ermöglicht, leicht Ansichten über den Zustand zu erzeugen, die vom Zustand selbst unabhängig sind, z. Verwenden von Funktionen höherer Ordnung wie map und filter.
48
Giorgio

Zustand ist einfach Information über etwas, das im Gedächtnis gehalten wird.

Stellen Sie sich eine Klasse als einfache Übung zur Objektorientierung als Ausstecher und Cookies als Objekte vor. Mit dem Ausstecher (Klasse) können Sie ein Cookie erstellen (ein Objekt instanziieren). Angenommen, eine der Eigenschaften des Cookies ist seine Farbe (die durch Verwendung von Lebensmittelfarben geändert werden kann). Die Farbe dieses Cookies ist Teil seines Status, ebenso wie die anderen Eigenschaften.

Der veränderbare Status ist ein Status, der geändert werden kann, nachdem Sie das Objekt (Cookie) erstellt haben. Unveränderlicher Zustand ist Zustand, der nicht geändert werden kann.

Unveränderliche Objekte (für die keine des Status geändert werden kann) werden wichtig, wenn Sie sich mit Parallelität, der Fähigkeit von mehr als einem Prozessor in Ihrem Computer befassen, damit zu arbeiten Objekt zur gleichen Zeit. Die Unveränderlichkeit garantiert, dass Sie sich darauf verlassen können, dass der Zustand für die 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.

11
Robert Harvey

Ich denke, der Begriff "Zustand" (im Gegensatz zu einem konkreten Zustandstyp wie "Mitgliedsvariable") ist am nützlichsten, wenn eine zustandsbehaftete API mit einer zustandslosen 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 Stateless

  • Eine stateful API "merkt" sich, welche Funktionen Sie bisher aufgerufen haben und mit welchen Argumenten. Wenn Sie also das nächste Mal eine Funktion aufrufen, werden diese Informationen verwendet. Der Teil "Erinnern" wird häufig mit Mitgliedsvariablen implementiert, aber das ist nicht der einzige Weg.
  • Eine zustandslose API ist eine API, bei der jeder Funktionsaufruf ausschließlich von den an sie übergebenen Argumenten abhängt und sonst nichts.

Zum Beispiel ist OpenGL wahrscheinlich die zustandsstärkste API, die ich kenne. Wenn ich es für einen Moment lächerlich vereinfache, könnten wir sagen, dass es ungefähr so ​​aussieht:

glSetCurrentVertexBufferArray(vba1);
glSetCurrentVertexBufferObject(vbo1);
glSetCurrentVertexShader(vert1);
glSetCurrentFragmentShader(frag1);
// a dozen other things
glActuallyDrawStuffWithCurrentState(GL_TRIANGLES);

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 das gesamte Zeichnen durchzuführen.

Eine zustandslose Version von (stark vereinfachtem) OpenGL würde wahrscheinlich eher so aussehen:

glActuallyDrawStuff(vba1, vbo1, vert1, frag1, /* a dozen other things */, GL_TRIANGLES);

Sie werden oft Leute sagen hören, dass APIs mit weniger Status leichter zu überlegen sind. Wenn Sie die Anzahl der Argumente unter Kontrolle halten können, stimme ich dem im Allgemeinen zu.

Veränderlich gegen unveränderlich

Soweit ich weiß, ist diese Unterscheidung nur dann sinnvoll, wenn Sie einen Anfangszustand angeben können. Beispiel: Verwenden von C++ - Konstruktoren:

// immutable state
ImmutableWindow windowA = new ImmutableWindow(600, 400);
windowA = new ImmutableWindow(800, 600); // to change the size, I need a whole new window

// mutable state
MutableWindow windowB = new MutableWindow(600, 400);
windowB.width = 800; // to change the size, I just alter the existing object
windowB.height = 600;

Es ist schwierig, eine Fensterklasse zu implementieren, die sich nicht an ihre 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 "Mitgliedsvariablen" bedeutet, Aber es kann viel mehr als das 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 hinweg bestehen und qualifizieren sich daher wahrscheinlich als state. Lokale Variablen in einer regulären Funktion können auch als state betrachtet werden, je nachdem, wie sie verwendet werden (diejenigen, die ich in main () habe, zählen oft).

7
Ixrec

In Laienwörtern

Das Wörterbuch besagt:

ein. Eine Bedingung oder Art des Seins, wie in Bezug auf die Umstände.

  1. zustand - wie etwas in Bezug auf seine Hauptattribute ist;

Der Zustand von etwas ist die Menge von Werten, die seine Attribute in einem bestimmten Moment haben.

In OOP ist der Status eines Objekts eine Momentaufnahme der Werte seiner Attribute zu einem bestimmten Zeitpunkt.

Thing t = new Thing();
t.setColor("blue");
t.setPrice(100)
t.setSize("small");

Der Zustand ist seine Farbe ist blau, sein Preis ist 100 und seine Größe ist klein.

Wenn Sie später tun:

t.setColor("red");

Sie ändern eines seiner Attribute, aber Sie haben auch den Status insgesamt geändert, da das Objekt nicht mehr das gleiche 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 Moment zu ändern, da es keine "Setter" -Methoden oder andere Methoden gibt Ändern der Werte innerhalb des Objekts.

Thing t = new Thing("red",100,"small");
t.setColor("blue") -->> ERROR, the programmer didn't provide a setter or any other way to change the properties values after initialization.

Das nennt man einen Zustand, der nicht von mutiert geändert werden kann. Sie können das Objekt nur zerstören, ein neues erstellen und es derselben Referenz oder Variablen zuordnen.

Thing t = new Thing("red",100,"small");
t = new Thing("blue",100,"small");
// I had to create a new Thing with another color since this thing is inmutable.
2