2012-04-01 6 views
0

Dans ma conception actuelle, je créais un référentiel où, il est composé par un dictionnaire, où vous pouvez définir plusieurs objets appelés Foo dans un niveau (facile, moyen et difficile). C'EST À DIRE.Comment améliorer la conception de ce référentiel?

  • Niveau facile: objet Foo1, objet foo2, objet foo3
  • Niveau moyen: Foo4 objet
  • Niveau dur: objet Foo5, objet Foo6

Et ce est mon référentiel:

public interface IFoosRepository 
{ 
    void AddFooLevel(Levels level, Foo foo); 
    void RemoveFooLevel(Levels level); 
    Foo GetProblemFoo(Levels level); 
    IEnumerable<Levels> GetFooLevels(); 
    IEnumerable<Foo> GetFoos(); 
} 

public class FoosRepository : IFoosRepository 
{ 
    private IFoosService service; 
    private Dictionary<Levels, Foo> _fooLevels = new Dictionary<Levels, Foo>(); 

    public FoosRepository() 
     : this(new FoosService()) 
    { 
    } 

    public FoosRepository(IFoosService service) 
    { 
     this.service = service; 

     // Loads data into the _fooLevels 
     // ... 
    } 

    public void AddFooLevel(Levels level, Foo foo) 
    { 
     _FooLevels.Add(level, foo); 
    } 

    public void RemoveFooLevel(Levels level) 
    { 
     _FooLevels.Remove(level); 
    } 

    public Foo GetProblemFoo(Levels level) 
    { 
     return _FooLevels[level]; 
    } 

    public IEnumerable<Levels> GetFooLevels() 
    { 
     return _FooLevels.Keys; 
    } 

    public IEnumerable<Foo> GetFoos() 
    { 
     return _FooLevels.Values; 
    } 
} 

Ensuite, j'ai réalisé une autre chose, j'ai besoin d'avoir un ID unique comme un nom pour les objets foos. C'EST À DIRE. si je veux avoir un objet spécifique d'un niveau, j'ai besoin de définir le nom pour l'obtenir.

Maintenant, les objets seraient comme ceci:

  • Niveau facile: [nom: foo1, objet Foo1], [nom: foo2, objet foo2], [nom: foo3, objet foo3]
  • Niveau moyen: [nom: foo4, objet foo4]
  • Niveau dur: [nom: foo5, objet Foo5], [nom: foo7, objet Foo6]

Je veux dire, chaque nom est accompagné d'un nom unique et je suppose que ce sera le meilleur que ce nom ne soit pas répété dans un autre plus.

Et voilà quand je commence à douter de mon premier design. Mon premier était IDictionary>, ou peut-être que je devrais inclure cet identifiant dans l'attribut Foo, mais je suppose que ce n'est pas la meilleure solution.

Que dois-je modifier pour implémenter cette nouvelle fonctionnalité?

Répondre

0

Qu'en est-il des dictionnaires imbriqués? Dictionary (of Levels, Dictionary (de String, Foo))

0

Il est difficile de dire avec certitude sans en savoir plus sur la façon dont votre référentiel sera utilisé, mais les dictionnaires imbriqués semblent être ce que vous voulez. Par exemple, dans votre FoosRepository classe:

private IDictionary<Levels,IDictionary<string,Foo> _foos = new Dictionary<Levels,IDictionary<string,Foo>>; 

Ensuite, par exemple, votre AddFooLevel deviendrait:

public AddFooLevel(Levels level, string name, Foo foo) { 
    IDictionary<string,Foo> level = null; 
    if(_foos.ContainsKey(level)) { 
    level = _foos[level]; 
    } else { 
    level = new Dictionary<string,Foo>(); 
    _foos.Add(level); 
    } 
    level.Add(name, foo); 
} 
Questions connexes