Время от времени я сталкиваюсь с этим во время проектирования класса ... когда у меня есть несколько свойств одного типа в объекте. Возьмите несколько примеров:
У пользователя несколько адресов. Мы можем сделать
IDictionary<string, Address> Addresses; // Addresses["BusinessAddress"];
или
Address BusinessAddress;
Address ShippingAddress;
Продукт имеет родственные продукты, по разным категориям. Мы можем сделать
IDictionary<string, IList<Product>> Related; // Related["Available"];
или
IList<Product> Available;
IList<Product> Required;
Пользователю назначено несколько ролей. Мы можем сделать
IList<Role> Roles;
или
bool IsAdmin;
bool IsSales;
Так что же лучше? IDictionary более гибок, поскольку мы можем легко добавлять новые категории адресов в базу данных, даже не касаясь кода. Но недостатком является то, что мы используем строки для доступа; это всегда подвержено ошибкам. Мы можем решить это либо с помощью модульных тестов, либо с помощью констант типа
public class ProductCategories { public static string Available = "Available"; }
Но все же гораздо хуже читать «product.Available», чем «product.Related [ProductCategories.Available]».
Существуют и другие соображения, например, что проще / лучше сопоставить с ORM (например, NHibernate).
Но вопрос в том, есть ли известные предпочтения? Дизайн статей и / или книг на эту тему? Реальные мировые практики, которые люди здесь испытали?
Например, мы можем объединить оба мира ... пусть IList и bool IsAdmin делают "return Roles.Contain (Role (" Admin "));". Но это выглядит уродливо для меня.
Или, в случае IDictionary, мы не можем иметь более 1 адреса на тип; и если мы сделаем
IDictionary<string, IList<Address>>
это сходит с ума по простым адресам, где нам не нужны множители. Но если мы используем BillingAddress, ShippingAddress и IList для MultipleAddress, у нас будет гораздо более детальный контроль над нашими адресами ... с Intellisense и т. Д.