• Закон Деметры. Нужен ли?

    NightTiger
    @NightTiger
    Попробую и я ответить. Закон применять надо всегда, если есть возможность его применить.

    Немного лирики: та тонна бизнес-кода 20-30 разработчиков, которая прошла через меня позволила познать тот самый дзен Clean Code, не могу сказать, что у нас все везде хорошо, но за последние несколько лет мы так улучшили его общее состояние, что с ним становится приятно работать — и это передается от разработчика к разработчику, вселяя уверенность, понимание и осознание каждого участка кода.

    При чем здесь правило Деметры? Оно и дает эти возможности. Как вы думаете, почему так популярен IoC и DIC Symfony2 на его основе? Своей популярностью он как раз обязан тем, что использует неявно правило Деметры для всех создаваемых сервисов: каждый сервис в контейнере получает только свои зависимости и не лезет через них к другим, более того, сам контейнер зависимостей — отражение правила Деметры, потому что он пользуется исключительно своими методами для создания инстансов сервисов, обращению к параметрам.

    Идем дальше, слои приложения. Если кто не знает — учите мат.часть. Но если кратко, то слой данных не должен содержать бизнес-логики и взаимодействует с уровнем сервисов. Уровень сервисов содержит необходимую логику и предоставляет API наружу для контроллеров, веб-сервисов и других, но не отвечает за поддержку различных форматов запросов/ответов. Уровень контроллеров позволяет распаковывать запросы/упаковывать ответы, работая только с уровнем сервисов, не делая никаких предположений об источнике данных. Где здесь правило Деметры? Ответ очевиден: везде. Если мы соблюдаем это правило, то мы можем независимо менять реализацию кажого из слоев, не волнуясь о том, что сломается что-то в слое, который мы не трогаем сейчас.

    Следующий пункт: уровень детализации участка кода. Если вы проводили ревью кода, то как часто вам приходилось думать о том, что делает конкретный участок кода с этой цепью вызовов внутри? Есть простой факт, что мы можем держать в голове эффективно около 7 объектов, когда идет ревью кода, то каждый уровень цепочки обязует загрузить себе в память лишний класс, потому что только так вы поймете что происходит в конечном счете. Проведем легкую арифметику: если у нас есть класс, он же сервис, в который инжектятся три других сервиса, то у нас пока в памяти 4 сущности, которые мы легко понимаем. Дальше идет вызов метода с аргументами, если этот метод принимает три параметра и работает только с прямыми зависимостями на один уровень, то все хорошо: 7 объектов, но все еще понятно, как оно работает. Но как только начинаются запросы вида $this->service->createResult($request)->translate($mapping); приходится материться, так как такой код не помещается со всеми зависимостями в наше ОЗУ — мозг эффективно. Отсюда вывод — каждый участок кода отвечает за свой уровень детализации, позволяя более низким сервисам раскрывать детали. Если мне понадобятся детали — я дойду до них, но они не должны мне мешать понимать текущий код уровнем выше, а для этого надо вызывать только свои соседей, делегируя детали все ниже и ниже.

    Надеюсь, мои мысли подтолкнут вас к добрым намерениями )
    Ответ написан
    2 комментария
  • Закон Деметры. Нужен ли?

    @StepEv
    А ваш пример закон не нарушает.

    В $user->getPosts()->getLast()->getComments(); каждый объект обращается только к одному знакомому ему объекту:

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

    Так что не переживайте, всё в порядке. Выше понаписали какой-то ереси, честно говоря.

    Нарушением было бы что-то типа $user.posts.last->getComments();

    Здесь получается что user знает о том, как устроен posts, а это не хорошо.

    Вообще-то по вашей же ссылке на википедии это всё хорошо расписано, даже с примерами.
    Ответ написан
  • Закон Деметры. Нужен ли?

    SLY_G
    @SLY_G
    журналист, переводчик, программист, стартапщик
    Так этот закон — не юридический. Это скорее rule of thumb, как говорят у них. То бишь, на заметку взять. Чем меньше связанность, тем проще менять код. А с кодом надо сразу иметь в виду, что он будет меняться.
    Ответ написан
    Комментировать
  • CodeIgniter и Unit-тесты. Что использовать?

    Попробуйте прикрутить Codeception от Davert насколько помню CI должно быть несложно прикрутить. Есть примеры для Kohana, ZF, Symfony, по аналогии должно быть несложно сделать для CI.
    Ответ написан
    3 комментария
  • Какой HTML/CSS-редактор под Windows актуален?

    delmot
    @delmot
    Советую WebStorm. В 5-й версии ожидается необходимая вам функциональность: www.youtube.com/watch?v=TnnVl3ydIB0
    Ответ написан
    Комментировать
  • PHP. C чего начать?

    Слушай, мужик, может ты себе нервы и время сэкономишь? Учись Python ;-)
    Ответ написан
    12 комментариев
  • PHP. C чего начать?

    taliban
    @taliban
    php программист
    Как пхп-шник с шестилетним стажем, посоветую начать с другого языка, например с java или c# =)
    Ответ написан
    1 комментарий
  • Стоит ли открыть исходный код ORM для PHP?

    silentnuke
    @silentnuke
    Пишите, лишним точно не будет.
    Ответ написан
    Комментировать
  • А можно ли использовать язык BrainFuck на ЕГЭ?

    @stg34
    Вспоминается анекдот.
    Два солдата, один — другому:
    — Давай над прапорщиом подшутим?
    — Хватит, над деканом уже пошутили…
    Ответ написан
    Комментировать
  • Выбор Моего Первого Фреймворка (PHP)

    MuXaJIbI4
    @MuXaJIbI4
    А я вот использую symfony и не разу еще не пожалел. Возможностей наоборот более чем достаточно. Выучить не так уж и сложно, так как много документации втом числе и переведенной на русский. Не меленькое русское комьюнити. Плюс скоро выйдет symfony 2, а там вкусностей еще больше ;)
    Ответ написан
    2 комментария
  • Как правильно совместить регистрацию пользователя и создание профиля компании?

    Milfgard
    @Milfgard
    Email и имя пользователя — это одно поле.
    Повтор пароля — сомнительно (как и звёздочки), вы его продублируете на почту. Собстивенно, если задача одноразовая, то и сам пароль не нужен, пусть лучше юзер сразу залогинится, а пароль упадёт ему потом.

    Остаётся:
    E-mail
    Название компании
    Сайт
    Адрес сайта
    Чекбокс: я согласен с _этим_, _этим_ и _этим_.
    Ответ написан
    3 комментария
  • Нетбук: удобная клавиатура или более ёмкий аккумулятор?

    artyomst
    @artyomst
    Советую выбирать время работы. У меня был нетбук, наверное, с самой ужасной клавиатурой — Asus EEEPC 900. Писал лекции, привык быстро, а вот батарею всегда пытался экономить — яркость понижал, вайфай выключал и т д.
    Ответ написан
    Комментировать
  • Нетбук: удобная клавиатура или более ёмкий аккумулятор?

    Cheese
    @Cheese
    хорошее время автономной работы всегда пригодится, а клавиатуре можно привыкнуть за месяц, какой бы она ни была :)

    кстати, я нашёл фотки клавиатуры обеих аппаратов:
    N148: pcshop.com.ua/newsblog/wp-content/uploads/2010/08/228030_3.gif
    eM350: www.smart-shop.com.ua/components/com_virtuemart/shop_image/product/Acer_eMachines_eM350-21G25i__LU_NAH0D_066__2645.jpg

    по-моему, они почти одинаковые, а стрелки даже у самсунга побольше.
    Ответ написан
    Комментировать
  • Существует ли в природе form-builder (PHP) + validator (client+server) в одном флаконе?

    gabriell
    @gabriell
    Не смотрели в сторону фреймворков? Например в codeigniter есть вариант и валидации и постороения формы — достаточно мощный!
    Ответ написан
    1 комментарий
  • HTML шаблоны

    тут можно глянуть www.oswd.org/
    Ответ написан
    Комментировать
  • Синтаксис ООП в js и использование prototype

    runawayed
    @runawayed
    JS — объектно-ориентированный язык, но в нем отсутствуют классы, их заменяют конструкторы объектов, поэтому вместо обычного наследования через классы существует наследование через прототипы. Т.е. экземпляр класса наследует его свойства и методы, которые находятся в его прототипе.
    Конструктор класса (function Obj() {}) — функция, в которой описаны свойства и методы прототипа, поэтому ко всем ним будет доступ при создании экземпляра.

    В примере A конструктор пустой, а Obj.method присваивает метод объекту, а не его прототипу, поэтому он не будет наследован в obj = new Obj(). Этот пример не работает.

    Пример B — правильный, здесь метод method добавляется в прототип и будет наследоваться всеми экземплярами.

    Пример C чаще всего используется, когда нужно реализовать singleton или namespace, потому что это простой хэш без конструктора, его нельзя наследовать. Фактически это не объект в ООП понимании, а просто ассоциативный массив, в котором могут содержаться любые данные, методы и другие объекты.

    Пример D аналогичен примеру C, только его свойство method содержит ссылку на внешнюю функцию. Этот пример можно использовать, когда нужно вызвать какую-то функцию из внешней библиотеки.

    Пример E правильный и аналогичен примеру B, с разницей в том, что наследуемый метод задается сразу в конструкторе, а не через prototype.
    Ответ написан
    1 комментарий