Wie nennt man Klassen ohne Methoden?

10

Wie nennt man Klassen ohne Methoden?

Zum Beispiel,

class A
{
  public string something;
  public int a;
}

Oben ist eine Klasse ohne Methoden. Hat diese Art von Klasse einen speziellen Namen?

user52343
quelle
1
Eine Methode ohne Methode?
ChaosPandion
11
Der Fachbegriff ist record oder struct .
Kilian Foth
4
Eine "Eigenschaftstasche"
Martin York
Kilian: Ich bevorzuge "verherrlichte Struktur" für die zusätzliche Konnotation.
Jason

Antworten:

23

Meistens: Ein Anti-Muster.

Warum? Weil es die prozedurale Programmierung mit "Operator" -Klassen und Datenstrukturen erleichtert. Sie trennen Daten und Verhalten, was nicht gerade gut ist.

Oft: Ein DTO (Data Transfer Object)

Schreibgeschützte Datenstrukturen zum Datenaustausch, die von einem Geschäfts- / Domänenobjekt abgeleitet wurden.

Manchmal: Nur Datenstruktur.

Nun, manchmal muss man nur diese Strukturen haben, um Daten zu speichern, die schlicht und einfach sind und keine Operationen haben. Aber dann würde ich keine öffentlichen Felder verwenden, sondern Accessoren (Getter und Setter).

Falke
quelle
4
Ich rate jedem davon ab, Kurse nur mit öffentlichen Getter / Setter in Java zu machen. Es ist hirntot und einige Container führen nicht einmal den Setter / Getter-Code aus (siehe Glassfish ...), also ist es entweder die Standardeinstellung oder Sie haben eine Fehler. Ich glaube nicht, dass die OOP-Kapselung richtig war. Es stellt sich heraus, dass DTOs in den meisten Anwendungen meistens nicht nur benötigt werden, sondern auch die am häufigsten verwendeten Klassen sind. Sie sind also alles andere als Antimuster, ich würde stattdessen das Wort "Grundbausteine" verwenden.
Aadaam
8
Sie sind möglicherweise ein Anti-Pattern, wenn Sie sich in einer streng OO-Umgebung befinden. Für den Rest der Programmierwelt ist das Vorhandensein von Datenstrukturen, die einfache heterogene Sammlungen von Feldern sind, ein klarer Vorteil gegenüber den Alternativen und wird sogar in einer bekannten OO-Hauptstütze gefördert .
Telastyn
@Aadaam: Du hast mich nicht richtig verstanden. Ein DTO ist kein Antimuster. Manchmal sind diese Objekte vollkommen in Ordnung, wenn es sich um DTOs handelt! Und wenn Glassfish sich nicht mit Gettern und Setzern befasst, bedeutet dies nur, dass Glassfish nicht gut geschrieben ist (obwohl es in Java ohne eingebaute Accessoren schwierig ist). Dieser Code ist kein Braindead, sondern ein nützliches Boilerplate.
Falcon
4
Schnell, @Aadaam. Jemand setzt ein Feld auf einen ungültigen Wert und verursacht Chaos, wenn es später gelesen wird. Wirf eine Ausnahme aus, damit du den Täter erkennen kannst. Wenn Sie zum ersten Mal so etwas für ein öffentliches Feld an 1.000 Stellen tun müssen, wünschen Sie sich einen Setter. Öffentliche Felder haben ihren Platz, aber das Getter / Setter-Paradigma ist aus gutem Grund beliebt.
Karl Bielefeldt
@KarlBielefeldt: In einer Glassfish-Version hatte ich eine einzige Ausnahme in einem Setter-Code als Test (ohne Bedingungen), die nie ausgeführt wurde. Das Anwesen hatte eine private Variable und zwei öffentliche Getter-and-Setter. Der Behälter umging einfach den Setter. Wenn etwas tatsächlich einen ungültigen Wert hat, bevorzuge ich persönlich Typklassen anstelle primitiver Werte, aber vielleicht bin das nur ich.
Aadaam
9

Ich würde es nennen structoder recordweil es zur Datenspeicherung verwendet wird und dies sehr häufig in Sprachen vorkommt, wie CSie dort sehen können: struct (Programmiersprache C) . Ich persönlich würde es vorziehen, eine structKlasse anstelle einer Klasse zu verwenden, die besser geeignet und lesbar ist:

struct A
{
  public string something;
  public int a;
}

Normalerweise werden sie wie die anderen als DTOs (Data Transfer Object) verwendet .

Omar
quelle
4
Das Problem mit struct ist, dass "struct" in vielen Sprachen ein Schlüsselwort ist. C # behandelt beispielsweise Strukturen als Werttypen mit unterschiedlicher Semantik. Dies gilt auch für "record" in einigen Sprachen (PL / SQL).
Falcon
5

Diese werden als einfache alte __ Objekte (PO_Os) bezeichnet, bei denen das Leerzeichen Java oder C oder CIL oder eine von Ihnen verwendete Sprache ist.

Wenn sie als einfache Datenblöcke für die Kommunikation verwendet werden, können sie als Datenübertragungsobjekte ( Data Transfer Objects, DTOs) bezeichnet werden.

Wenn sie einige extern bereitgestellte Daten darstellen, können sie als Entitäten bezeichnet werden .

Telastyn
quelle
6
Sie denken an PODs - eine ganz andere Idee. POJOs enthalten explizit "Geschäftslogik", schließen jedoch Abhängigkeiten von bestimmten Frameworks aus.
Tom Hawtin - Tackline
PODs dürfen Methoden haben, zumindest in C ++. Sie müssen nur triviale Konstruktoren, Destruktoren, Kopierkonstruktoren und Zuweisungskonstruktoren haben, nur öffentliche Datenelemente, keine Basisklassen und keine virtuellen Funktionen. Grundsätzlich müssen sie nur mit C-Strukturen kompatibel sein.
Dirk Holsopple
2

Ich würde eine solche Klasse als veränderlichen Datenhalter bezeichnen und habe manchmal eine generische Form verwendet:

class DataHolder<T>
{
   public T dat;
}

Beachten Sie, dass das Umschließen dateiner Eigenschaft die Leistung beeinträchtigt und keinen Vorteil bietet, da ein Eigenschaften-Accessor nichts anderes tun kann (als das Feld zu lesen / schreiben), was einige Implementierungen nicht beschädigen würde. Außerdem kann es erforderlich sein, InterlockedMethoden mit dat(oder, wenn es sich um eine Struktur handelt, mit Feldern davon) zu verwenden, aber das wäre nicht möglich, wenn datsie in eine Eigenschaft eingeschlossen wären .

Beachten Sie, dass veränderbare Dateninhaber zwar für Typen (veränderlich oder nicht veränderbar) nützlich sein können, die Daten enthalten müssen, sie jedoch nicht sicher für den Datenaustausch verwendet werden können, wie dies bei unveränderlichen Typen der Fall wäre. Zum Beispiel eine Aussage wie:

myData = myCollection.GetData(myKey);

hätte eine klare Bedeutung, wenn GetDataein unveränderlicher Klassentyp oder eine Struktur ("veränderlich" oder nicht) zurückgegeben würde, die keine Verweise auf veränderbare Daten enthält. Wenn ein veränderbares Klassenobjekt zurückgegeben wird, ist jedoch unklar, ob Änderungen an diesem Objekt von der zugrunde liegenden Auflistung konsistent ignoriert werden, konsistent zu sauberen Aktualisierungen führen oder ein lästiges oder unvorhersehbares Verhalten verursachen, das keiner der beiden Beschreibungen entspricht.

Wenn man möchte, dass eine Sammlung Daten in einem veränderlichen Objekt zurückgibt, ist das richtige Paradigma oft so etwas wie:

var myData = new WhateverType();
myCollection.GetData(myKey, myData);
myData.ModifySomehow();
myCollection.StoreData(myKey, myData);

Bei Verwendung dieses Ansatzes gibt es eine eindeutige Implikation, GetDatadie dazu führt myData, dass Daten aus der Sammlung gefüllt werden, von denen jedoch myCollectionnicht erwartet wird, dass sie nach Abschluss der Funktion einen Verweis darauf enthalten, und dass sie auch nicht für andere Zwecke verwendet werden. StoreDatawürde ebenfalls Informationen myDatain seine eigene interne Datenstruktur kopieren , ohne eine Referenz zu behalten. Beachten Sie, dass ein Vorteil dieses Ansatzes darin besteht, dass der Clientcode, wenn er viele Datenelemente innerhalb einer Schleife liest, sicher eine Instanz myDataaußerhalb der Schleife erstellen und diese Instanz dann jedes Mal wiederverwenden kann. Ebenso kann myCollectionmöglicherweise die dem Schlüssel zugeordnete Objektinstanz wiederverwendet werden (Kopieren von Daten aus der übergebenen Instanz), ohne dass eine neue Instanz erstellt werden muss.

Superkatze
quelle
0

Je nach Kontext nenne ich sie Entitäten. In meinen langweiligen Geschäftsanwendungen ordnen sie meinem DER normalerweise 1: 1 zu.

Machado
quelle
0

Ich würde es a nennen Schema.

Dies umfasst mehrere Verwendungszwecke, z. B. die Darstellung einer Datenbanktabelle oder eines deserialisierten Datensatzes oder eines DTO usw.

userSteve
quelle