Nous faisons beaucoup de tests unitaires et de refactorisation de nos objets métier, et je semble avoir des opinions très différentes sur la conception des classes que les autres pairs.
Un exemple de cours dont je ne suis pas fan:
public class Foo
{
private string field1;
private string field2;
private string field3;
private string field4;
private string field5;
public Foo() { }
public Foo(string in1, string in2)
{
field1 = in1;
field2 = in2;
}
public Foo(string in1, string in2, string in3, string in4)
{
field1 = in1;
field2 = in2;
field3 = in3;
}
public Prop1
{ get { return field1; } }
{ set { field1 = value; } }
public Prop2
{ get { return field2; } }
{ set { field2 = value; } }
public Prop3
{ get { return field3; } }
{ set { field3 = value; } }
public Prop4
{ get { return field4; } }
{ set { field4 = value; } }
public Prop5
{ get { return field5; } }
{ set { field5 = value; } }
}
Dans la classe "réelle", elles ne sont pas toutes des chaînes, mais dans certains cas, nous avons 30 champs de support pour les propriétés complètement publiques.
Je déteste ce cours et je ne sais pas si je suis juste difficile. Quelques points importants:
- Champs de sauvegarde privés sans logique dans les propriétés, semble inutile et gonfle la classe
- Constructeurs multiples (assez bien) mais couplés à
- toutes les propriétés ayant un setter public, je ne suis pas fan.
- Aucune propriété ne serait potentiellement affectée à une valeur en raison du constructeur vide, si un appelant n'est pas au courant, vous pourriez potentiellement obtenir des comportements très indésirables et difficiles à tester.
- C'est trop de propriétés! (dans le cas 30)
Je trouve beaucoup plus difficile de vraiment savoir dans quel état se trouve l'objet Foo
à un moment donné, en tant qu'implémenteur. L'argument a été avancé: «nous pourrions ne pas avoir les informations nécessaires à définir Prop5
au moment de la construction de l'objet. D'accord, je suppose que je peux le comprendre, mais si c'est le cas, ne rendre Prop5
public que le setter, pas toujours jusqu'à 30 propriétés dans une classe.
Suis-je juste pointilleux et / ou fou pour vouloir une classe qui est "facile à utiliser" par opposition à "facile à écrire (tout public)"? Des cours comme ceux ci-dessus me crient, je ne sais pas comment ça va être utilisé, donc je vais juste rendre tout public juste au cas où .
Si je ne suis pas très difficile, quels sont les bons arguments pour lutter contre ce type de pensée? Je ne suis pas très bon pour articuler des arguments, car je suis très frustré d'essayer de faire passer mon message (pas intentionnellement bien sûr).
get
ou set
:-)