Задать вопрос
  • Закон Деметры. Нужен ли?

    everzet
    @everzet
    Вижу у вас совсем клинический случай неспособности читать и думать. Боюсь здесь я больше ничем помочь не могу.
  • Закон Деметры. Нужен ли?

    everzet
    @everzet
    Под каким углом у вас 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);
    }
    
  • Закон Деметры. Нужен ли?

    everzet
    @everzet
    Нет, вы не будете менять в 10 местах — вы будете менять только там, где есть прямая связь с вашим obj. Разница огромная
  • Закон Деметры. Нужен ли?

    everzet
    @everzet
    Меня терзают смутные сомнения по поводу того, что для вас «первоисточником» закона Деметры служит русский MSDN. Но раз уж речь зашла о первоисточниках, давайте обратимся к тому самому первоисточнику:
    www.ccs.neu.edu/research/demeter/papers/law-of-demeter/oopsla88-law-of-demeter.pdf

    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:

    1. The argument classes of M (including C)
    2. The instance variable classes of C


    Перевод нужен или сами осилите?

    И по поводу вашего примера вместе с
    Не соблаговолите пояснить, каким именно образом и где мой пример нарушает LoD даже в вашей формулировке?


    Объясняю:

    posts = user.getPosts();
    lastPost = posts.getLast();
    comments = lastPost.getComments();

    С — ваш класс
    М — ваш метод

    • user — аргумент вашего метода М или переменная вашего класса С. Нет нарушения — прямой аргумент
    • posts — инстанс класса связанный с user. Нет нарушения — прямая связь с прямым аргументом
    • lastPost — инстанс класса связанный с posts. Нарушение закона — связь второго рода
    • comments — инстанс класса связанный с lastPost. Нарушение закона — связь третьего рода
  • Закон Деметры. Нужен ли?

    everzet
    @everzet
    Где вы в этой книге фигу нашли? Закон Деметры ну никак не отличает проперти от методов. Суть закона в ограничении любого знания объекта о коллабораторах, если эти коллабораторы этому объекту напрямую не были даны. Инкапсуляция она про другое…

    ваш

    posts = user.getPosts(); lastPost = posts.getLast(); comments = lastPost.getComments();

    закон Деметры благополучно нарушает.
  • Закон Деметры. Нужен ли?

    everzet
    @everzet
    Открыли новый магазин прямо напротив вашего дома и транспорт для покупки молока стал совсем не нужен. Что будете делать?