Comment appelez-vous les classes sans méthodes?

10

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?

user52343
la source
1
Une classe sans méthode?
ChaosPandion
11
Le terme technique est record ou struct .
Kilian Foth
4
Un "sac de propriété"
Martin York
Kilian: Je préfère "structure glorifiée" pour la connotation supplémentaire.
Jason

Réponses:

23

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).

Faucon
la source
4
Je décourage tout le monde de faire des cours avec uniquement des getters / setters publics en java, c'est mortel et certains conteneurs ne fonctionneront même pas le code setter / getter (en regardant Glassfish ...), donc c'est la valeur par défaut ou vous avez un punaise. Je ne crois pas que l'encapsulation OOP était correcte, il s'avère que la plupart du temps, dans la plupart des applications, les DTO sont non seulement nécessaires, mais ce sont les classes les plus utilisées. Donc, ce sont tout sauf des anti-modèles, j'utiliserais plutôt le mot "blocs de construction de base".
Aadaam
8
Ils sont peut - être un anti-modèle si vous êtes dans un environnement strictement OO. Pour tout le reste du monde de la programmation, avoir des structures de données qui sont de simples collections hétérogènes de champs est un avantage évident par rapport aux alternatives, et même encouragé dans un pilier OO bien connu .
Telastyn
@Aadaam: Vous ne m'avez pas bien compris. Un DTO n'est pas un contre-modèle. Parfois, ces objets sont parfaitement bien si ce ne sont des DTO! Et quand Glassfish ne regarde pas les getters et setters, cela signifie seulement que glassfish n'est pas bien écrit (bien que ce soit difficile en java sans accesseurs intégrés). Ce code n'est pas braindead, c'est un passe-partout utile.
Falcon
4
Vite, @Aadaam. Quelqu'un définit un champ sur une valeur non valide, ce qui fait des ravages lorsqu'il est lu plus tard. Lancez une exception pour détecter le coupable. La première fois que vous devez faire quelque chose comme ça pour un champ public utilisé dans 1000 endroits, vous souhaiterez un setter. Les domaines publics ont leur place, mais le paradigme getter / setter est populaire pour une bonne raison.
Karl Bielefeldt
@KarlBielefeldt: dans une version glassfish, j'ai eu une seule exception dans un code setter comme test (sans conditions), qui n'a jamais été exécuté. La propriété avait une variable privée et deux getters-and-setters publics. Le conteneur a simplement contourné le passeur. Si quelque chose a réellement une valeur invalide, personnellement, je préfère les classes de type au lieu des valeurs primitives, mais c'est peut-être juste moi.
Aadaam
9

Je l'appellerais structou recordparce qu'il est utilisé pour le stockage de données et cela est très commun aux langages comme Cvous pouvez le voir ici: struct (langage de programmation C) . Donc, personnellement, je préférerais utiliser une structclasse 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.

Omar
la source
4
Le problème avec struct est que "struct" est un mot-clé dans de nombreuses langues. C #, par exemple, traite les structures comme des types de valeur qui ont une sémantique différente. Cela est également vrai pour "record" dans certaines langues (PL / SQL).
Falcon
5

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 .

Telastyn
la source
6
Vous pensez aux POD - une idée très différente. Les POJO incluent explicitement la «logique métier», mais excluent les dépendances sur des cadres particuliers.
Tom Hawtin - tackline
Les POD sont autorisés à avoir des méthodes, au moins en C ++. Ils doivent simplement avoir seulement des constructeurs triviaux, destructeur, constructeurs de copie et constructeurs d'affectation, seulement des membres de données publiques, pas de classes de base et pas de fonctions virtuelles. Fondamentalement, ils doivent simplement être compatibles avec les structures C.
Dirk Holsopple
2

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 datdans 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 Interlockedmé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 GetDatarenvoyait 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 GetDataentraînera myDatale remplissage des données de la collection, mais myCollectionne devrait pas en conserver une référence une fois la fonction terminée, ni l'utiliser à d'autres fins. StoreDatacopierait également les informations myDatadans 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' myDataextérieur de la boucle, puis réutiliser cette même instance à chaque fois. De même, myCollectionpeut ê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.

supercat
la source
0

Selon le contexte, je les appelle des entités. Sur mes applications commerciales ennuyeuses, elles sont généralement mappées 1: 1 à mon DER.

Machado
la source
0

Je l'appellerais un Schema.

Cela couvre plusieurs utilisations telles que la représentation d'une table de base de données, ou d'un enregistrement désérialisé, ou d'un DTO, etc.

userSteve
la source