Können wir sagen, dass Objekte Attribute, Zustände und Verhaltensweisen haben?

16

Ich habe die Einführung von Oracle in OOP-Konzepte gelesen und bin auf folgende Beschreibung gestoßen:

Objekte der realen Welt haben zwei Eigenschaften gemeinsam: Sie haben alle Zustand und Verhalten. Hunde haben Zustand (Name, Farbe, Rasse, Hunger) und Verhalten (Bellen, Holen, Schwanzwedeln). Softwareobjekte sind realistischen Objekten konzeptionell ähnlich: Sie bestehen ebenfalls aus Status und verwandtem Verhalten.

Mein Problem mit dieser Passage ist , dass bei der Beschreibung Zustand seiner Mixe Attribute auch dort. Zum Beispiel sind der Name und die Farbe eines Hundes seine Attribute, während es sein Zustand ist, hungrig oder durstig zu sein.

Meiner Meinung nach ist es daher genauer, die Eigenschaften von Objekten in drei Teile zu unterteilen: Attribute, Zustände und Verhaltensweisen .

Klar, wenn ich das in eine Programmiersprache übersetze, kann ich sehen, dass die dreifache Partition eine zweifache wird, weil sowohl Attribute als auch Zustände in Feldern / Variablen gespeichert werden, während Verhalten in Methoden / Funktionen gespeichert werden.

Aber konzeptionell ist es sinnvoller, die drei Dinge getrennt zu haben.

Hier ist ein weiteres Beispiel: Betrachten Sie eine Lampe. Zu sagen, dass sowohl die Lampengröße als auch, ob sie eingeschaltet sind oder nicht, Zustände sind, ist meiner Meinung nach eine Strecke. Die Lampengröße ist ein Attribut, kein Status, während das Ein- oder Ausschalten ein Status ist.

Oder habe ich etwas verpasst?

Daniel Scocco
quelle
4
Yeap, Sie vermissen Eigenschaften als eine Technik, um das Verhalten zu simulieren.
Yannis
Werfen
yegor256

Antworten:

13

Sie haben Recht, dass Objekte aus Attributen, Zuständen und Verhalten bestehen, wenn Sie Attribute definieren, die unveränderte Merkmale einer Instanz bedeuten. Tatsächlich ist es wichtig, diese Unterscheidung zu treffen, da es Objekte gibt, die nur Attribute (in Ihrem Sinne) und keinen Zustand enthalten. Sie werden unveränderlich genannt und sind sehr nützlich bei der Programmierung.

Diese dreiteilige Definition wird in der Tat in Programmiersprachen dargestellt, beispielsweise mit dem finalSchlüsselwort in Java oder dem readonlySchlüsselwort in C #, um Instanzdaten zu kennzeichnen, die sich während der gesamten Lebensdauer der Instanz nicht ändern dürfen.

Ich muss jedoch hinzufügen, dass sich nicht ändernde Instanzdaten normalerweise nicht als Attribute bezeichnet werden. Wir neigen dazu, von "endgültigen" oder "schreibgeschützten" oder "konstanten Daten" zu sprechen, je nachdem, welche Sprache wir verwenden. Der richtige Begriff für sie wäre "Invarianten", aber dann wird dieses Wort in diesem Sinne nicht häufig verwendet; es wird häufiger für andere Dinge verwendet.

Mike Nakis
quelle
Es ist sinnvoll, davon auszugehen, dass sich die Eigenschaften einer Instanz nicht ändern und ändern. Und ich bin froh, dass ich nicht so weit weg war. Vielen Dank!
Daniel Scocco
Wird die Größe der Lampe während eines Fertigungs- oder Montageprozesses ein Zustand sein?
JeffO
Nein, es wird ein Attribut sein. (Im Sinne des OP.)
Mike Nakis
4
Es gibt keinen grundsätzlichen Unterschied zwischen Zustand und Attributen, daher ist es einfacher, den Zustand als möglicherweise veränderlich oder unveränderlich zu definieren. Während (unveränderliches) Attribut und (veränderlicher) Zustand nicht falsch sind (und in vielerlei Hinsicht gleichwertig sind), macht diese Unterscheidung die Definition komplexer als nötig. Obwohl IMO der Begriff "Zustand" wahrscheinlich nicht der beste Begriff ist, um das Konzept zu beschreiben, impliziert "Zustand" irgendwie, dass es sich ändern soll, während der "Zustand" - wie in Orakels Artikel beschrieben - dies nicht hat.
Lie Ryan
Ich denke, dass sich die Haltung der Menschen zur Unveränderlichkeit im Laufe der Jahre ändert. Für diejenigen, die ihre Bedeutung verstehen, gibt es einen fundamentalen Unterschied zwischen veränderlichem und unveränderlichem Zustand, der ausreicht, um einen anderen Namen zu rechtfertigen. Darf ich eine sehr interessante Lektüre empfehlen? Eric Lippert - Fabulous Adventures in Code - Unveränderlichkeit in C # Teil 1: Arten der Unveränderlichkeit
Mike Nakis
4

Ich denke, es ist genauer zu sagen, dass Objekte nur zwei Eigenschaften haben. Ein Beispiel für Oracle:

Hunde haben Zustand (Name, Farbe, Rasse, Hunger) und Verhalten (Bellen, Holen, Schwanzwedeln). Softwareobjekte sind realistischen Objekten konzeptionell ähnlich: Sie bestehen ebenfalls aus Status und verwandtem Verhalten.

Die Tatsache, dass die Werte (Status) für Name, Farbe, Rasse und Hunger in Attributen im Objekt gespeichert sind , ist ein Implementierungsdetail. Attribute braucht man eigentlich gar nicht.

Wenn Sie Attribute als drittes Merkmal einschließen, müssen Sie auch Methoden als viertes Merkmal einschließen, da sich das Verhalten von Objekten (wie der Zustand) ebenfalls ändern kann. Zustand und Verhalten sind zwei abstrakte Merkmale von Objekten. Attribute und Methoden sind konkrete Implementierungen dieser Konzepte.

Bill the Lizard
quelle
Wird die Fellfarbe eines Fuchses zu einem Zustand, weil sie sich im Winter ändert?
JeffO
@JeffO Die Fellfarbe kann sich auch ändern, wenn es alt, nass, gefärbt ist ... aus einer Reihe von Gründen. Es ist nicht wirklich ein Zustand, nur weil er sich während der Lebensdauer eines Objekts ändern kann, sondern weil verschiedene Objekte desselben Typs unterschiedliche Werte für dieses Attribut haben können.
Bill the Lizard
1

Der Status setzt sich aus Attributen und entsprechenden Werten zusammen. Aus meiner Sicht haben Sie also nicht Recht (und Sie schaffen unnötige zusätzliche Komplexität für eine einfache Definition).

Pavel Bucek
quelle
0

Wir können die Dinge auf unzählige Arten klassifizieren und jede Klassifizierung hätte keine "richtige Antwort". Das Klassifizieren von Dingen hat nur dann einen Vorteil, wenn die Klassifizierung zu einem tieferen Verständnis führt oder die Kommunikation verbessert. Wenn Ihr Team die Begriffe Attribute, Zustände und Funktionen bevorzugt und über gute Arbeitsdefinitionen für diese verfügt, kann dies zur Verbesserung der internen Kommunikation beitragen. Sie müssen jedoch bei der Kommunikation außerhalb dieser Gruppe flexibel sein.

Die Konzepte "hungrig" und "durstig" können von grundlegenden Attributen (z. B. Blutzucker, Flüssigkeitsspiegel) abgeleitet werden, sodass wir uns den Zustand als Metaattribut vorstellen können, das von Basisattributen abgeleitet ist, auf deren Grundlage wir zu "Wahr" oder "Falsch" wechseln können den Status der relevanten Basisattribute. Für das Lichtbeispiel könnten wir uns das Licht mit den Attributen applied_voltageund resistanceund den Funktionen voltage_switch()und vorstellen shine(). Das voltage_swich()ist dann eine Funktion einiger Eingänge (z. B. Handschalter, Licht, Timer usw.) und shine()eine Funktion von applied_voltageund resistance. Wir könnten ein Metaattribut mit dem Namen " light_stateWahr" oder "Falsch" deklarieren , um das Objekt mental zu konstruieren. Letztendlich handelt es sich jedoch nur um mentale Konstrukte, mit denen wir unsere Arbeit organisieren.

Blane
quelle
-2

Der Status eines Objekts wird entweder direkt oder indirekt in seinen Attributen codiert . Wenn Sie zum Beispiel möchten, dass Ihr Hund Durst hat, können Sie ihm ein

private boolean thirsty;

Alternativ können Sie es so etwas haben lassen

private Date lastDrinkAt;

und schließen Sie, ob Ihr Hund durstig ist, indem Sie die aktuelle Zeit mit der Zeit vergleichen, zu der er zuletzt etwas getrunken hat.

In jedem Fall liegt der Zustand Ihrer Objekte in den Attributen.

Dann gibt es Klassen, die keine Attribute haben, meistens Dienstprogrammklassen. Normalerweise möchten Sie jedoch auch in diesem Fall keine Instanz von ihnen erstellen.

Um Aussagen begründen zu können, halten sich Wissenschaftler in der Regel an das Prinzip der Minimalität. Ich denke, deshalb hat Oracle state nicht explizit erwähnt. Sie kann aus dem Wert der Attribute abgeleitet werden.

Raku
quelle
1
Oracle hat state ausdrücklich erwähnt; Lesen Sie das Zitat. Und der OP wird mit offensichtlich das Wort Attribute im Sinne der sich nicht ändernden Eigenschaften eines Objekts, so dass er sie nicht mit Staat verwirrend ist.
Mike Nakis
Es sind immer noch Eigenschaften - ob sie sich ändern oder ob Sie sie "Attribute" oder "Mitglieder" nennen. In der Programmierwelt gibt es nichts anderes, als den Zustand eines Objekts neben seinen Attributen darzustellen.
Raku
-3

Die realen Zusammenhänge sind fehlgeleitet. So würde ich es lehren (C ++ - Ansatz):

  1. Computer unterstützen zwei verschiedene Speicherformate: Daten und Code
  2. Daten sehen aus wie Bits 010101010101
  3. Code sieht aus wie asm Anweisungen
  4. Datenbits haben zwei unterschiedliche Werte, entweder 0 oder 1
  5. Daten werden in folgende Datentypen abstrahiert: int i = 1; ist nur eine kurze Notation zu einigen Bits 0000001
  6. Code sieht aus wie eine Funktion: int f (int a) {return a + a + a; } ist eine Kurznotation für einige asm-Anweisungen
  7. Wenn Sie mehrere Variablen haben, kombinieren Sie diese zu einer Struktur: int a; float b; kann in eine Struktur AB {int a; float b; };
  8. Wenn Sie einige Codestücke damit kombinieren, erhalten Sie eine Klasse: class ABf {int a; float b; float sum (float c) const {return a + b + c; }};
  9. Dann haben wir für Daten Variablennamen, die verwendet werden können, um den Wert zu finden: a + b + c, um auf die Daten zuzugreifen.
  10. Und dann haben wir normale Funktionsaufrufe: int k = f (10); um auf die asm-anweisungen zuzugreifen, die in der f-funktion "gespeichert" sind.
  11. Dann gibt es Objektinstanzen: ABf var;
  12. Und die Mitgliedsfunktion ruft auf: int k2 = var.sum (10.0);
  13. Funktionen haben die Typen int f (int);
  14. Mitgliedsfunktionen haben die Typen int ABf :: sum (float);
  15. Es gibt diesen Zeiger mit dem Typ ABf *
  16. Variablen wie a und b und c sind kontextabhängig. Wenn sie sich innerhalb der Elementfunktion befinden, können sie dies bedeuten -> b oder nur b.
  17. Mitgliedsfunktionen int ABf :: sum (float c) ist nur eine kurze Notation für int sum (ABf * this, float c);
  18. Das Wort "Zustand" bedeutet nur dasselbe wie Daten
  19. Das Wort "Verhalten" bedeutet nur das Gleiche wie Code
  20. Das Wort "Attribut" bedeutet nur dasselbe wie "Daten".

Es gibt also keine Unterschiede zwischen Status und Attribut. Es ist nur eine zufällige Ansammlung von Bits. Es ist nur eine willkürliche Unterscheidung, um sie zu trennen. Ich muss nur wissen, wofür es ein Alias ​​ist.

tp1
quelle