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?
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?
Antworten:
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).
Ich würde es nennen struct
oder record
weil es zur Datenspeicherung verwendet wird und dies sehr häufig in Sprachen vorkommt, wie C
Sie dort sehen können: struct (Programmiersprache C) . Ich persönlich würde es vorziehen, eine struct
Klasse 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 .
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 .
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 dat
einer 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, Interlocked
Methoden mit dat
(oder, wenn es sich um eine Struktur handelt, mit Feldern davon) zu verwenden, aber das wäre nicht möglich, wenn dat
sie 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 GetData
ein 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, GetData
die dazu führt myData
, dass Daten aus der Sammlung gefüllt werden, von denen jedoch myCollection
nicht erwartet wird, dass sie nach Abschluss der Funktion einen Verweis darauf enthalten, und dass sie auch nicht für andere Zwecke verwendet werden. StoreData
würde ebenfalls Informationen myData
in 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 myData
außerhalb der Schleife erstellen und diese Instanz dann jedes Mal wiederverwenden kann. Ebenso kann myCollection
möglicherweise die dem Schlüssel zugeordnete Objektinstanz wiederverwendet werden (Kopieren von Daten aus der übergebenen Instanz), ohne dass eine neue Instanz erstellt werden muss.