Как улучшить этот дизайн хранилища? - PullRequest
0 голосов
/ 01 апреля 2012

В моем текущем проекте я создавал хранилище, где он состоит из словаря, в котором вы можете установить несколько объектов с именем Foo на уровень (легкий, средний и сложный). И.Е.

  • Уровень Easy: Объект Foo1, объект Foo2, объект Foo3
  • Средний уровень: Объект Foo4
  • Уровень сложности: Объект Foo5, объект Foo6

А это мой репозиторий:

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;
    }
}

Затем я понял еще одну вещь: мне нужно иметь уникальный идентификатор, такой как имя для объектов foos. И.Е. если я хочу получить определенный объект с уровня, мне нужно установить имя, чтобы получить его.

Теперь объекты будут такими:

  • Уровень Easy: [имя: foo1, объект Foo1], [имя: foo2, объект Foo2], [имя: foo3, объект Foo3]
  • Средний уровень: [имя: foo4, объект Foo4]
  • Уровень сложности: [имя: foo5, объект Foo5], [имя: foo7, объект Foo6]

Я имею в виду, что каждое имя сопровождается уникальным именем, и я думаю, будет лучше, если это имя больше не повторяется.

И вот тут я начинаю сомневаться в своем первом дизайне. Сначала я назвал IDictionary>, или, может быть, мне нужно было включить этот идентификатор в атрибут Foo, но, думаю, это не лучшее решение.

Что я должен изменить, чтобы реализовать эту новую функцию?

Ответы [ 2 ]

0 голосов
/ 02 апреля 2012

Трудно сказать наверняка, не зная больше о том, как будет использоваться ваш репозиторий, но, похоже, вам нужны вложенные словари.Например, в вашем FoosRepository классе:

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

Тогда, например, ваш AddFooLevel станет:

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 );
}
0 голосов
/ 02 апреля 2012

Как насчет вложенных словарей? Словарь (уровней), словарь (строк, фу))

...