Я только недавно узнал о Законе Деметры .
Как и многие другие вещи, я понял, что это то, чем я уже занимался, но у меня не было названия. Хотя есть несколько мест, где я, кажется, нарушаю это.
Например ...
У меня может быть объект Address:
public class Address : IAddress
{
public string StreetAddress { get; set; }
public string City { get; set; }
public int Zip { get; set; }
}
и объект Customer:
public class Customer : ICustomer
{
private IAddress address;
Customer()
{
Address = null;
}
public string Name { get; set; }
public IAddress
{
get
{
if (address == null)
{
address = new Address();
}
return address;
}
set
{
address = value;
}
}
}
Хорошо, это фальшивый код, так что вам, вероятно, не придется прыгать на меня, чтобы использовать IoC для устранения new Address()
или чего-либо еще, но это в значительной степени пример того, что я делаю. Я не включил интерфейсы, так как надеюсь, что они очевидны.
Я бы тогда использовал его в своем коде для таких вещей, как int zip = customer.Address.Zip;
и customer.Address.City = "Vancouver";
Насколько я понимаю, я нарушаю Закон Деметры, манипулируя деталями Обращения от Клиента.
Опять же, похоже, что и фреймворк тоже. В конце концов, не будет адреса. Город. Длина будет нарушением? Должен ли я добавлять методы в адрес для обработки доступа к свойствам строки? Возможно нет. Итак, зачем засорять адрес?
Я не могу просто добавить методы к Address, которые относятся только к клиенту. У меня есть объекты Member, Employee, Dependent, Vendor, Employer и т. Д., Которые тоже имеют адреса.
Есть ли лучший способ справиться с этим? Какими проблемами я рискую, если использую Адрес таким, какой я есть сейчас?
Для Java-пользователей класс Address может выглядеть примерно так, если это поможет:
public class Address extends AddressInterface
{
private String m_city;
public String getCity() { return m_city; }
public void setCity(String city) { m_city = city; }
}
Я должен признать, что customer.getAddress().setCity("Vancouver");
издает больше сигналов, чем customer.Address.City = "Vancouver";
сделал для меня. Может быть, мне стоит ненадолго переключиться на Java.