Tenir compte de la classe suivanteméthodes de classe devraient accepter les paramètres ou l'utilisation des propriétés de classe
public class Class1
{
public int A { get; set; }
public int B { get; set; }
public int GetComplexResult()
{
return A + B;
}
}
Pour utiliser GetComplexResult
, un consommateur de cette classe devrait savoir pour mettre A
et B
avant d'appeler la méthode. Si GetComplexResult
accède à de nombreuses propriétés pour calculer son résultat, cela peut entraîner des valeurs de retour erronées si le consommateur ne définit pas toutes les propriétés appropriées en premier. Donc, vous pourriez écrire cette classe comme celui-ci au lieu
public class Class2
{
public int A { get; set; }
public int B { get; set; }
public int GetComplexResult(int a, int b)
{
return a + b;
}
}
De cette façon, un appelant à GetComplexResult
est forcée de passer toutes les valeurs requises, veiller à la valeur de rendement attendu est calculé correctement. Mais s'il y a beaucoup de valeurs requises, la liste de paramètres augmente également et cela ne semble pas non plus être un bon design. Il semble également rompre le point d'encapsulation A
, B
et GetComplexResult
dans une seule classe. Je pourrais même être tenté de rendre statique GetComplexResult
car il ne nécessite pas une instance de la classe pour faire son travail. Je ne veux pas faire un tas de méthodes statiques.
Existe-t-il des termes pour décrire ces 2 différentes façons de créer des classes? Ils semblent tous deux avoir des avantages et des inconvénients - y a-t-il quelque chose que je ne comprends pas qui devrait me dire qu'une façon est meilleure que l'autre? Comment les tests unitaires influencent-ils ce choix?
J'essaie toujours d'appeler des getters au lieu d'accéder directement aux membres, et dans le getter je consigne un message si je retourne une valeur nulle. J'avais l'habitude d'utiliser des assertions, mais ensuite nous avons découvert que certains de nos clients s'exécutent avec des assertions activées en production (!). – TMN