Comment appelez-vous les classes sans méthodes?
Par exemple,
class A
{
public string something;
public int a;
}
Ci-dessus est une classe sans aucune méthode. Ce type de classe a-t-il un nom spécial?
Comment appelez-vous les classes sans méthodes?
Par exemple,
class A
{
public string something;
public int a;
}
Ci-dessus est une classe sans aucune méthode. Ce type de classe a-t-il un nom spécial?
Réponses:
La plupart du temps: un motif anti.
Pourquoi? Parce qu'il facilite la programmation procédurale avec les classes "Opérateur" et les structures de données. Vous séparez les données et les comportements qui ne sont pas exactement bons.
Souvent fois: un DTO (Data Transfer Object)
Des infrastructures de données en lecture seule destinées à échanger des données, dérivées d'un objet métier / domaine.
Parfois: juste la structure des données.
Eh bien parfois, vous devez simplement avoir ces structures pour stocker des données qui sont tout simplement et simples et sans aucune opération. Mais je n'utiliserais pas de champs publics mais des accesseurs (getters et setters).
Je l'appellerais struct
ou record
parce qu'il est utilisé pour le stockage de données et cela est très commun aux langages comme C
vous pouvez le voir ici: struct (langage de programmation C) . Donc, personnellement, je préférerais utiliser une struct
classe plutôt qu'une classe plus adaptée et lisible:
struct A
{
public string something;
public int a;
}
Habituellement, ils sont utilisés comme DTO (Data Transfer Object) comme l'ont dit les autres.
Ceux-ci sont connus sous le nom de Plain Old __ Objects (PO_O) où le blanc est Java ou C ou CIL, ou quel que soit le langage que vous utilisez.
S'ils sont utilisés comme de simples blocs de données pour la communication, ils peuvent être appelés objets de transfert de données (DTO).
S'ils représentent des données fournies en externe, ils peuvent être appelés Entités .
J'appellerais une telle classe un détenteur de données mutable, et j'ai parfois utilisé un formulaire générique:
class DataHolder<T>
{
public T dat;
}
Notez que l'habillage dat
dans une propriété dégradera les performances et n'offrira aucun avantage, car il n'y a rien qu'un accesseur de propriété puisse faire (autre que lire / écrire le champ) qui ne casserait pas certaines implémentations. De plus, il peut être nécessaire d'utiliser des Interlocked
méthodes avec dat
(ou, s'il s'agit d'une structure, avec leurs champs), mais cela ne serait pas possible si elles dat
étaient encapsulées dans une propriété.
Notez que si les détenteurs de données mutables peuvent être utiles pour les types (mutables ou non) qui doivent contenir des données, ils ne peuvent pas être utilisés en toute sécurité pour l'échange de données de la même manière que les types immuables. Par exemple, une déclaration comme:
myData = myCollection.GetData(myKey);
aurait un sens clair s'il GetData
renvoyait un type de classe immuable ou une structure ("mutable" ou non) qui ne contenait pas de références à des données mutables. S'il renvoyait un objet de classe mutable, cependant, il ne serait pas clair si des modifications de cet objet seraient systématiquement ignorées par la collection sous-jacente, entraîneraient régulièrement des mises à jour propres de celui-ci, ou provoqueraient un comportement gênant ou imprévisible ne répondant à aucune description.
Si l'on souhaitait qu'une collection renvoie des données dans un objet mutable, le paradigme correct serait souvent quelque chose comme:
var myData = new WhateverType();
myCollection.GetData(myKey, myData);
myData.ModifySomehow();
myCollection.StoreData(myKey, myData);
En utilisant cette approche, il existe une implication claire qui GetData
entraînera myData
le remplissage des données de la collection, mais myCollection
ne devrait pas en conserver une référence une fois la fonction terminée, ni l'utiliser à d'autres fins. StoreData
copierait également les informations myData
dans sa propre structure de données interne sans conserver de référence. Notez que l'un des avantages de cette approche est que si le code client lit de nombreux éléments de données dans une boucle, il peut créer en toute sécurité une instance de l' myData
extérieur de la boucle, puis réutiliser cette même instance à chaque fois. De même, myCollection
peut être en mesure de réutiliser l'instance d'objet associée à la clé (copie des données de l'instance transmise) sans avoir à créer une nouvelle instance.