Закон Деметера на практике
От: Mikhail Polykovsky Россия  
Дата: 18.02.07 06:50
Оценка:
Здравствуйте.
Читаю книгу "Программист-прагматик", там один из советов — придерживаться закона Деметера. Закон звучит так:

Любой метод объекта должен обращаться только к методам, принадлежащим:
— тому же классу
— любым объектам, переданным в метод в качестве аргументов
— любым создаваемым им объектам
— любым непосредственно содержащимся объектам компонентов


То есть

void Demeter::example(B& b){
  b.invert(); // Так можно
  
  b.getUser.name(); // Так не рекомендуется
}


Аргументация в том, что уменьшается связанность и упрощается изменение классов. Но мне вот что непонятно. Если мне в метод, например, передается объект "Машина", у которой надо накачать колеса, как лучше поступить?

1 вариант (нарушение закона):
void обслуживание(Машина машина){
  машина.левоеПереднееКолесо().накачать();
}


2 вариант (добавление лишнего(?) метода в класс "Машина"):
void обслуживание(Машина машина){
  машина.накачатьЛевоеПереднееКолесо();
}


3 вариант (добавление лишнего(?) метода в текущий класс):
void обслуживание(Машина машина){
  колесо = машина.левоеПереднееКолесо(); 
  накачать(колесо);
}

void накачать(Колесо колесо){
  колесо.накачать();


Как вы считаете, какой из вариантов более аккуратный? Какой облегчает поддержку и дальшейшие изменения программы? Надо ли стремиться к выполнению закона Деметера, или это "шашечки"?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.