Bonjour,

A titre d’exercice, afin de me familiariser d'avantage avec les designs patterns, je souhaiterais gérer une liste d’items via, sans doute, une interface permettant diverses implémentations pour le stockage de cette liste.

Chaque item ayant une valeur et étant identifié par une "clef" composée (section, parametre)

Les actions possibles seraient 1) Lecture 2) Ecrire 3) Suppression d’un item ou d’une section toute entière

Par exemple :

  • Get( "section1", "parametre1b") -> valeur2
  • Set( "sectionX", "parametreY", "valeurZ") qui modifie la valeur si l’item existe, et sinon crée l’item (ainsi que la section si besoin)
  • Delete( "sectionX") qui supprime entièrement la sectionX, ou Delete( "sectionX", "parametreY") qui supprime le parametreY de la sectionX


Get() Set() et Delete() seront vraisemblablement des méthodes d’un objet

Nommons cet objet "configurationManager"

Contraintes :
  • Il ne peut exister qu’un seul configurationManager dans tout le code (instance unique)
  • Il doit être possible de modifier la méthode de stockage des items sans rien changer au code "utilisateur", sinon sans doute à un unique endroit où l’on indiquera que le stockage se fait dans une base de données, ou un fichier XML, ou un fichier "INI" typique des anciens fichiers de configuration de Windows, ou peut-être même via un WebService, etc… Bref, on n'aura pas forcément prévu dès le départ tous les modes de stockage possibles, et il devra être possible d'en ajouter d'autres aisément en impactant au minimum sur le code utilisateur


Afin de s’assurer de l’unicité de l’objet permettant les Get(), Set() et Delete() sur les items, j’ai bien entendu songé au Design Pattern Singleton. Avez-vous une objection à cela ?

Il me semble acquis que cet objet unique serait obtenu par une méthode retournant "une interface" nommée par exemple IConfigurationManager, soit en C# quelque chose comme :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
interface IConfigurationManager
{
	public string Get( string section, string parametre)
	public void Set( string section, string parametre, string valeur )
	public void Delete(string section)
	public void Delete(string section, string parametre)
}
Pour la suite, par contre, cela se corse…

Quel(s) design(s) pattern(s) utiliser ?

J’ai envisagé Factory Method, couplé à Strategy ? Au niveau de la mise en oeuvre, cela ne me semble pas si évident... Qu’est ce que cela donnerait au niveau du code ?

Il me semble qu’il faudra créer des classes implémentant l’interface IConfigurationManager, par exemple :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
class ConfigurationManagerXML: IConfigurationManager()
{
…
}
class ConfigurationManagerDB : IConfigurationManager()
{
…
}
class ConfigurationManagerINI : IConfigurationManager()
{
…
}
Puis au niveau d’une factory avoir quelque chose comme :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
class ConfigurationManagerFactory
{
	public static IConfigurationManager GetConfigurationManager(…)
}
Mais quels parametres pour GetConfigurationManager() ?

Comment indiquer proprement la "stratégie" = le mode de "stockage" des items ?

D’avance merci pour vos remarques !