web-dev-qa-db-fra.com

Comment gérer des constructeurs dans de grandes classes de données

Plusieurs fois maintenant, j'ai rencontré les situations où vous avez une sorte de classe de paramètres qui contient simplement une masse de données. Souvent, ces classes ne sont tout simplement pas valables sans au moins la plupart des données.

Cependant un constructeur comme celui-ci:

public dataclass (int v1, int v2, int v3, int v4,
      string v5, double v6, string v7, int v8, 
      Internalclass v9, string v10,
      double v11, double v12, int v13, int v14)
{
   this.v1=v1;
   this.v2=v2;
   ...
   this.v14=v14; 
}

on se sent comme ce n'est pas une bonne pratique du code. Maintenant, je pourrais essayer de regrouper certaines de ces variables ensemble, mais souvent ces variables n'ont de sens que dans le contexte de la classe de données. Alors, quel est un bon moyen de concevoir une telle classe de données?

8
Thijser

Vous recherchez le modèle de constructeur .

C'est essentiellement un objet avec des setters où vous pouvez définir les paramètres de construction et une méthode createResult() qui créera l'objet que vous recherchez (ou échouez si cela ne serait pas valide).

Vous pouvez l'utiliser pour contenir les valeurs par défaut pour les propriétés et le grouper certains d'entre eux dans un ensemble unique.

DataClassBuilder builder = new DataClassBuilder();

builder.setV1(v1);
builder.setV3(v3);
builder.setV4(v4);
builder.setV5AndV6(v5, v6);
//...

DataClass data = builder.createResult();
13
ratchet freak

Est-ce que tous ces paramètres en réalité sont-ils nécessaires? Par "Classe de données" Signifiez-vous un modèle de domaine, Afficher le modèle ou objet de transfert de données? Nécessitant une telle liste d'arguments pour une simple "classe de données" commence à se sentir comme une odeur de code qui vous distingue:

  1. Cette classe fait trop, et une grande partie de son travail devrait être déléguée à d'autres classes qui se sont transmises comme une dépendance

  2. Tout n'est pas nécessaire. Les valeurs facultatives des classes de données ne doivent pas être transmises via le constructeur

Je pense que la question ici n'est pas "Comment gérer une grande liste d'arguments de constructeur" et est plutôt "Comment puis-je refactoriser mon modèle d'objet afin que je n'ai pas besoin de deux douzaines de paramètres à un constructeur."

Le modèle de constructeur "fixera" votre problème, mais je pense qu'il met un bandage sur un problème plus important qui nécessite une solution différente.

5
Greg Burghardt