Ce qu'il y a de bien, en programmation, c'est qu'il n'y a pas de mauvaise méthode de faire... il n'y a que des méthodes qui présenteront certains avantages et / ou certains inconvénients.
Ainsi, pour ce qu'il en serait d'un type "Complex", trois possibilités sont présentes:
Soit, tu envisage le type Complex comme un "POD" (Plain Old Data) ou, si tu préfère comme "une simple structure qui regroupe plusieurs valeurs qui vont si bien ensemble", et tu te contente d'y adjoindre certaines fonctions qui fournissent les comportements attendus (comparaison, addition, multiplication, ...) dont l'avantage est de t'éviter d'avoir à réfléchir aux mutateurs/accesseurs nécessaires et de te permettre de te concentrer sur les fonctions indispensable (comparaison, opérations mathématique, ...) mais dont l'inconvénient réside dans le fait que, si une des variables qui le compose ne peut pas avoir une valeur particulière, tu va obliger l'utilisateur de la structure à effectuer les tests lui-même.
Soit, tu considère le type Complex comme "un tout immuable" une fois qu'une instance en a été créée, et tu encapsule les données en ne fournissant que les comportements constants que tu es en droit d'attendre du type.
L'avantage, c'est que tu limite énormément les manipulation hasardeuses par la suite.
L'inconvéniant, c'est que, si tu veux additionner (ou effectuer n'importe quelle opération mathématique entre) deux complexes, tu sera obligé de passer par la création d'un nouveau complex, dont les valeurs correspondent au résultat escompté... avec tous les petits inconvénients que cela peut occasionner en terme de copie et de création d'instances.
Soit, enfin, tu envisage un "mix" des deux solutions, en admettant éventuellement de créer des mutateurs pour les variables qui nécessitent une validation avant d'accepter les modifications de valeur, mais cela se fera au détriment de l'homogénéité globale de tes conventions d'appel: tu pourrais très bien en arriver à te trouver confronté à un code proche de
avec l'éternel problème de savoir "si je veux modifier telle valeur, dois-je y accéder directement, ou passer par un mutateur :question:"Code:
1
2
3
4
5 void foo(Complex & c, int i, float f) { c.x*=i; c.setImaginaire(c.getImaginaire() * f); }
Seule la situation à laquelle tu es réellement confronté te permettra de choisir "la moins mauvaise" des solutions, pour qu'elle puisse s'adapter à tes besoins réels ;) (il est vrai cependant que la préférence ira sans doute à l'une des deux premières ;))