Je suis récemment tombé sur des classes qui utilisent un objet de configuration au lieu des méthodes de configuration habituelles pour la configuration. Un petit exemple:Structure structs vs setters
class A {
int a, b;
public:
A(const AConfiguration& conf) { a = conf.a; b = conf.b; }
};
struct AConfiguration { int a, b; };
Les bons côtés:
- Vous pouvez étendre votre objet et facilement garantir des valeurs par défaut raisonnables pour de nouvelles valeurs sans vos utilisateurs jamais besoin de savoir.
- Vous pouvez vérifier la cohérence d'une configuration (par exemple, votre classe n'autorise que certaines combinaisons de valeurs)
- Vous économisez beaucoup de code en désactivant les setters.
- Vous obtenez un constructeur par défaut pour spécifier un constructeur par défaut pour votre structure de configuration et utiliser
A(const AConfiguration& conf = AConfiguration())
.
L'inconvénient (s):
- Vous devez connaître la configuration au moment de la construction et ne peut pas changer ultérieurement.
Y a-t-il d'autres inconvénients à cela qui me manquent? S'il n'y en a pas: Pourquoi cela n'est-il pas utilisé plus fréquemment?
J'ai récemment rencontré ceci avec une ancienne base de code que je soutiens. C'est assez énervant. –
L'API Windows fait cela très bien en ajoutant un champ de taille, en s'assurant que les structures sont des POD, et en ajoutant seulement des champs de données à la fin. Ajoutez les anciens constructeurs de support pour créer de nouvelles structures (avec des valeurs par défaut raisonnables pour les nouveaux champs) et la compatibilité est réellement _increased_. – sbi
J'ai écrit une réponse miroir, où je montre que la compatibilité est augmentée à la place. –