lastPost
изlastPost = posts.getLast();
Objects created by M
?Как раз хороший дизайн, в соответствии с законом Деметры, разделит знания:
Класс «пользователь» знает о том, что у пользователя есть посты.
Класс Post знает, что у постов есть комментарии.
Что бы получить комментарии мы должны у пользователя получить объект поста, а уже у этого объекта попросить его комментарии.
И наконец, можем мы увидеть вашу правильную реализацию примера из начального вопроса?
function lastPostCommentsForUser(User user, PostsRepo posts, CommentsRepo comments)
{
lastPost = posts.getLastUserPost(user);
return comments.getUserPostComments(user, lastPost);
}
Page #325
3 — The Law of Demeter
For all classes C, and for all methods M attached to C, all objects to which M sends a message must be instances of classes associated with the following classes:
- The argument classes of M (including C)
- The instance variable classes of C
Не соблаговолите пояснить, каким именно образом и где мой пример нарушает LoD даже в вашей формулировке?
posts = user.getPosts();
lastPost = posts.getLast();
comments = lastPost.getComments();
user
— аргумент вашего метода М или переменная вашего класса С. Нет нарушения — прямой аргументposts
— инстанс класса связанный с user
. Нет нарушения — прямая связь с прямым аргументомlastPost
— инстанс класса связанный с posts
. Нарушение закона — связь второго родаcomments
— инстанс класса связанный с lastPost
. Нарушение закона — связь третьего родаposts = user.getPosts();
lastPost = posts.getLast();
comments = lastPost.getComments();