Я хочу определить интерфейс «IFile», который включает в себя массив пар ключ / значение «Метаданные». При получении или установке этих пар ключ / значение разработчик IFile должен иметь возможность предпринять действия. Каков будет лучший способ пойти по этому поводу? Я вижу три метода:
Способ 1) Получить / установить объект словаря:
public interface IFile
{
...
Dictionary<String, String> GetMetadata();
void SetMetadata(Dictionary<String, String> metadata);
}
Метод 2) Использование класса Dictionary напрямую:
public interface IFile
{
...
Dictionary Metadata();
}
и в реализации IFile может быть предоставлена унаследованная версия Dictionary, которая действует на get / set.
Метод 3) Избегайте словаря и предоставьте пользовательский интерфейс, например:
public interface IMetadata
{
String GetValue(String key);
void SetValue(String key, String value);
Boolean Contains(String key);
void Delete(String key);
...
}
public interface IFile
{
...
IMetadata Metadata();
}
Я склоняюсь к методу 3, потому что он позволяет разработчику решать, как на самом деле реализовать структуру данных метаданных. Другие решения заставляют использовать словарь. Однако метод 3, кажется, включает в себя много дополнительного кода для переноса.
Я чувствую, что за этим вопросом стоит глубокая дилемма при проектировании иерархий классов, которая заключается в том, открывать ли непосредственно библиотечные классы или предоставлять несколько упакованных функций, которые скрывают внутренне используемый библиотечный класс. У меня мало фактического опыта в создании ООП-проектов, поэтому совет о том, каков «Правильный путь» в этом отношении, будет очень кстати!
Спасибо
Lars