Сегодня прочитал об этом законе и сделал для себя следующие выводы:
Закон не нацелен на улучшение читаемости или эстетичности кода. Наоборот, красота кода теряется, а структура класса обрастает проксирующими функциями-пустышками, портя читаемость класса.
Основная цель использования закона, это избавить команду программистов от страха изменять существующий код.
К примеру, представим 2 разные ситуации:
1. В проекте игнорируется закон Деметры. Класс b включен в классы a, c и d. Каждый класс инстанцируется в разных участках кода по 10 раз каждый и применяется a.b.Method(), c.b.Method() и d.b.Method()
2. В проекте применяется закон Деметры. Класс b включен в классы a, c и d. Каждый класс инстанцируется в разных участках кода по 10 раз каждый и применяется a.Method(), c.Method() и d.Method()
При замене класса 'b' на класс 'z':
В 1-ом случае нам придется изменить код в 30 местах где используется a.b.Method().
Во 2-ом случае нам потребуется изменить код в 3-ех методах классов a, c и d.
Следуя этому правилу, я думаю будет логичен следующий код:
$user = new User('Paul')
$comments = $user->getCommentsOfLastPost()
В классе User:
function getCommentsOfLastPost()
{
$posts = new Posts()
$posts->getCommentsOfLastPostUser($this)
}
и т.д.
В итоге, этот закон стоит применять там, где стоимость легкого изменения кода выше стоимости чистоты структуры классов. А значит, закон лучше игнорировать при разработке небольших проектов.
Я уловил суть?