Wo sollten Sie in einem objektorientierten System, wenn überhaupt, (C-artige) Strukturen gegenüber Klassen wählen?


9

C und höchstwahrscheinlich viele andere Sprachen bieten ein structSchlüsselwort zum Erstellen von Strukturen (oder ähnlichem). Diese sind (zumindest in C) aus vereinfachter Sicht wie Klassen, jedoch ohne Polymorphismus, Vererbung, Methoden usw.

Stellen Sie sich eine objektorientierte Sprache (oder eine Sprache mit mehreren Paradigmen) mit Strukturen im C-Stil vor. Wo würdest du sie den Klassen vorziehen? Ich glaube nicht, dass sie mit OOP verwendet werden sollen, da Klassen ihre Zwecke zu ersetzen scheinen, aber ich frage mich, ob es Situationen gibt, in denen sie Klassen in ansonsten objektorientierten Programmen vorgezogen werden könnten und in welchen Situationen. Gibt es solche Situationen?


Welche Sprache benutzt du? Was veröffentlichen Sie? Die meisten modernen OO-Sprachen außer Java unterstützen Eigenschaften auf die eine oder andere Weise.
Kevin Cline

Antworten:


16

In einigen Büchern habe ich einen Unterschied zwischen staatlich tragenden Objekten und funktionsbereitstellenden Objekten gesehen. Die genauen Begriffe unterscheiden sich von Quelle zu Quelle. Aber im Allgemeinen zeichnen sich die ersteren dadurch aus, dass sie eine Reihe von Feldern und eine ganze Reihe einfacher Getter-Setter-Paare (und möglicherweise einen Konstruktor) haben.

Diese sind in Java besonders häufig für Klassen, die explizit als "serialisierbar" gekennzeichnet sind.

Ich würde argumentieren, dass diese Art von Klassen als Strukturen am sinnvollsten ist, wenn Sie der Meinung sind, dass die Mitglieder nicht direkt ausgeblendet werden müssen (z. B. bei verschachtelten Typen).


1
Robert C Martin nennt sie in Clean Code "Datenübertragungsobjekte" .
user16764

5

In C gibt es keine Klassen, ebenso structwie das Bündeln von Daten. In C ++ structist dies dasselbe wie mit der classAusnahme, dass Vererbung und Mitgliederzugriff publicstandardmäßig und nicht standardmäßig erfolgen private. C # hat auch eine Art struct, aber ich weiß nicht genug C #, um es zu kommentieren. Common Lisp hat die defstructForm, die unter structBerücksichtigung des Sprachunterschieds so ähnlich wie C s funktioniert , und unterscheidet sich von einer Common Lisp Object System-Klasse.

Es gibt jedoch einen konzeptionellen Unterschied zwischen einem verwandten Datenbündel und einer realen Klasse. In C ++ structwird es häufig für ein Datenbündel verwendet, während classes für Objekte verwendet wird, die ihr eigenes Verhalten haben sollen. Als Richtlinie würde ich sagen, dass a classetwas darstellt, über das Sie etwas Nützliches sagen können, z. B. eine Klasseninvariante, während a structlockerer mit Datenwerten gekoppelt ist, die nicht wirklich stark von anderen abhängen.


6
Der Unterschied zwischen a structund a classist in C # bedeutender - das große Problem ist, dass a structein Werttyp und a classein Referenztyp ist. Microsoft empfiehlt, a nicht zu verwenden, structwenn der Inhalt größer als 16 Byte oder so ist.
Carson63000

0

Was ist auf einer sehr einfachen Ebene der Unterschied zwischen einer Struktur und einer reinen Datenklasse (eine, die außer Eigenschaftszugriffsfunktionen keine Funktionalität hat)?

Nichts als der Speicherbedarf wirklich.


0

Die akzeptierte Antwort ist gut. Ich möchte nur hinzufügen ...

Manchmal ist es besser, eine Methode in eine Klasse einzufügen. In anderen Fällen ist es besser, eine externe Funktion zu haben, bei der die Struktur / Klasse als Parameter übergeben wird (auch wenn Sie den OOP-Stil verwenden).

Beispiel für das Einfügen einer Methode in die Klasse: Rectangle.CaclulateArea ()

Beispiel dafür, wann eine Funktion außerhalb der Klasse platziert werden soll: Canvas.Draw (Rectangle rect)

Sie könnten Draw () in das Rechteck einfügen und es würde funktionieren. Das Zeichnen ist jedoch eine tierabhängige Operation. Sie würden nicht auf der Serverseite zeichnen, sondern auf der Clientseite. Draw () wäre nicht sinnvoll, um überhaupt auf dem Server zu existieren. "CalculateArea ()" ist jedoch unabhängig von der Ebene und ein echtes Attribut des Rechtecks. Daher ist es besser, es als Elementmethode einzuschließen.


0

Für mich ist der große Unterschied, ob es eine Klasseninvariante gibt oder nicht.

Oder mit anderen Worten: Kann ich zu jedem Zeitpunkt ein Feld in einen Wert ändern? Wenn ja, ist es eine Struktur; Wenn nicht, ist es eine Klasse.

Das übliche Beispiel für eine Struktur ist ein 2D-Punkt mit nur einem X- und Y-Element, der einen beliebigen Wert haben kann und völlig unabhängig voneinander ist. Der öffentliche Zugang ist akzeptabel.

Ein Beispiel für eine Klasse ist die Kombination eines Zeigers auf ein Zeichenarray und eines Längenfelds: Die Länge hängt vom Wert des Zeigers ab und sollte daher keine Struktur sein. Die Felder sollten privat sein und der Zugriff sollte über Setter und Getter erfolgen, um sicherzustellen, dass die Klasse unveränderlich ist.


0

1) Netzwerke struct: Strukturen, die über das Kabel übertragen werden.

Allgemeiner und formeller jede Klasse, für die Sie POD, Trivial, Standardlayout oder ein verwandtes Konzept benötigen. Eine ausgezeichnete Diskussion dieser Konzepte mit Beispielen finden Sie in dieser Antwort (für C ++ 11).

2) Funktoren (insbesondere Prädikate), die Sie an Funktionen wie übergeben würden std::remove_if. Andernfalls ausgedrückt, Klassen std::binary_functionähnlich von / geerbt von oder dergleichen.

3) Metaprogrammierungskonzepte, die nur öffentliche constexprs und / oder typedefs enthalten dürfen.

Bearbeiten: Hinweis: Diese Antwort gilt für C ++ - Klassen im Vergleich zu Strukturen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.