Quels modèles de conception peuvent être appliqués au problème des parameters de configuration?

Dans les produits logiciels volumineux et complexes, la gestion des parameters configurables devient un problème majeur. Les deux approches que j’ai vues au problème sont les suivantes:

  • que chaque composant du système charge sa propre configuration à partir de fichiers de configuration ou de parameters de registre.
  • avoir une classe de chargeur de parameters qui charge tous les parameters système configurables et demander à chaque composant d’interroger le chargeur de parameters pour ses parameters.

Ces approches me sont toutes deux mauvaises.

Existe-t-il des modèles de conception pouvant être utilisés pour simplifier le problème? Peut-être quelque chose qui tirerait parti de la technique d’dependency injection.

Je préfère créer une interface pour définir une requête, un chargement et une sauvegarde. En utilisant l’dependency injection, je peux l’injecter dans chaque composant qui le nécessite.

Cela permet une flexibilité en termes de remplacement de la stratégie de configuration et fournit une base commune pour tout ce qui fonctionne. Je préfère cela à un seul “chargeur de parameters” global (votre option 2), d’autant plus que je peux remplacer le mécanisme de configuration pour un seul composant si je dois absolument le faire.

Je travaille actuellement sur un système où la configuration est gérée par un object singleton global qui conserve une carte des clés de configuration aux valeurs. En général, je souhaiterais que cela n’ait pas été fait de cette façon, car cela peut entraîner des goulots d’étranglement dans le système et une certaine négligence pour les tests unitaires, etc.

Je pense que Reed Copsey en a le droit (je l’ai voté), mais je recommanderais certainement de lire le formidable article de Martin Fowler sur l’dependency injection:

http://martinfowler.com/articles/injection.html

Un léger addendum aussi … si vous voulez effectuer des tests unitaires de type d’object, l’dependency injection est certainement la voie à suivre.

Que dis-tu de ça. Vous définissez une interface Configurable avec une seule méthode configure (configuration). L’argument de configuration est simplement une table de hachage qui associe les noms des parameters de configuration à leurs valeurs.

Les objects racine peuvent créer une table de hachage de configuration comme bon leur semble (ex: lecture à partir d’un fichier de configuration). Cette table de hachage peut contenir des parameters de configuration pour l’object racine iselft, ainsi que tout paramètre qu’un de ses composants, sous-composants, sous-sous-composants (etc.) pourrait utiliser.

L’object racine appelle alors configure (configuration) sur tous ses composants configurables.