• Как организовать фабрику для создания объектов?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    сразу скажу не использую ORM

    Сразу скажу - используйте ORM.

    class UserService{

    И где тут DDD? Где единый язык?

    Вопрос такой, где производить сборку готовой сущности для дальнейшего использования,

    В репозитории или в одной из его зависимостей. В частности в Doctrine2 репозиторий запрашивает сущность в entity manager-а, который загружает их сначала в unit of work, который хранит все в identity map для того что бы не допускать дублей сущностей (если мы будем каким либо образом запрашивать одну и ту же сущность, ORM вернет вам один и тот же объект, что делает использование ORM собственно и удобным). Внутренний мэппер мэпит данные из базы на сущности с использованием гидраторов.

    При сохранении происходит flush Unit-of-Work, при котором вычисляются изменения во всех сущностях и генерится SQL.

    то есть вам в любом случае нужно реализовать мэппер объектов либо взять готовый, затем вам нужно реализовать Unit-of-work, затем лоадер данных из базы ну и т.д. Я обдумывал вариант легкой замены Doctrine2 и понял что это в принципе практически не возможно. Именно по этой причине существует не так много реализаций data-mapper, для PHP это только доктрина, для Java это Hibernate, для Python - SQLAlchemy... и как бы больше реализаций и нет.

    Дядя Боб в одном из своих докладов на тему архитектуры приложенй (запамятовал название, поищу) рассказывал на эту тему много чего, мол и про загоны "не использовать ORM" которые были в 90-х, и почему реализация дата мэппера это весьма сложная задача....

    p.s. вывод - берите Doctrine2 ORM и не засоряйте себе голову попытками реализовать дата мэппер самостоятельно - это очень сложная задача. Именно поэтому не так много реализаций этого подхода.
    Ответ написан
    2 комментария
  • Как заставить директивы общаться друг с другом?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    нет, пусть две эти директивы зависят от одного сервиса, который предоставляет эту информацию.

    Общение директив имеет место быть если одна вложена в другую или у них есть реальная необходимость общаться. В вашем случае одна директива просит сервис пометит что-то прочитанным, а другая просто мониторит количество не прочитанных и среагирует на изменение.
    Ответ написан
    3 комментария
  • Как подключить symfony2 в существующий проект?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    1) делаем адаптер PSR-7 (или HttpKernel) к вашему движку
    2) делаем приложеньку на симфони
    3) ставим мидлвэр который будет разруливать на какое приложение какие запросы кидать. Это можно разруливать и через nginx но как-то не круто.
    4) когда начинаем пилить функционал на симфони и нужно что-то реюзать из старой кодобазы, стараемся отделить то что мы хотим заюзать от старой инфраструктуры (можно скажем сервис-декоратор запилить для старого движка) и регистрируем его в DI
    5) постепенно переносим код, модель можно оставить старую если это возможно.

    По сути основная сложность отделить модель от инфраструктуры движка и почистить сервисный слой.
    Ответ написан
    Комментировать
  • Не работают индексы при простом запросе?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    А поле `phone` случаем не текстового типа? Если да, то сравнение должно быть с текстом, иначе включается приведение типа для поля и индекс не работает.
    SELECT `name` FROM `phones` WHERE `phone` = '500'
    Ответ написан
    1 комментарий
  • В каких случаях оправданно использование leaflet.js, вместо yandex.maps?

    forgotten
    @forgotten
    Руководитель разработки API Яндекс.Карт
    Ни в каких ;)
    Ответ написан
    3 комментария
  • Как сделать вот такой скролл у элемента относительно другого элемента?

    Shugar348
    @Shugar348 Автор вопроса
    Сделал немного проще
    $ ->
      $(document).scroll ->
          $(".news").find(".content")
          .css('transform', "translate3d(0px, #{$(document).scrollTop() / 2}px, 0)")
    Ответ написан
    Комментировать
  • Стоит ли учить RoR для работы на фрилансе и своего стартапа в 2015?

    Atanvar
    @Atanvar
    Frontend developer
    Не одним вебом живём, учите питон, он и веб и серверное и мобилки и десктоп.
    Ответ написан
    Комментировать
  • Существуют ли НЕ видеоуроки по различным ЯП?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Есть такие штуки, книги называются, раньше говорят было модно.
    Ответ написан
    9 комментариев
  • Перебор массива циклом или сверка значений проверкой?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    С точки зрения производительности - без разницы, так как второй вариант эквивалентен циклу. Но сами понимаете что первый вариант лучше. Если вас парит производительность - то бинарный поиск. Но ни в коем случае не тот ад что вы привели. Быстрее всего поиск производить по хэш-мэпе, так как там сложность выборки всегда O(1).

    Вообще как, для большинства языков, в том числе для интерпритируемых, развертка цикла дает прирост производительности. За счет чего происходит ускорение? А за счет того что все эти инструкции внутри цикла независимы друг от друга, у нас нет конфликтов по записи (и не может быть) и посему процессор спокойно так паралелит выполнение инструкций. Это удобно когда надо посчитать какой-нибудь длинный массив (например добавить на картинку яркости).

    Пример. Возьмем массив на 1 000 000 чисел, и попробуем сделать его копию, с увеличенным в два раза значением:
    var data = range(1000000);
    var result = range(1000000);
    // обычный вариант
    for(var i = 0;i<1000000;i++) {
        result[i] = data[i] * 2;
    }
    
    // развертка цикла
    for(var i = 0;i<1000000;i+=4) {
        result[i] = data[i] * 2;
        result[i+1] = data[i+1] * 2;
        result[i+2] = data[i+2] * 2;
        result[i+3] = data[i+3] * 2;
    }


    jsperf.com/loop-unroll-simple

    На этом примере уже видно что развертка работает, хоть и прирост производительности не такой большой. Оптимизирующий компилятор JS-а и там умеет это делать.

    В вашем же случае у вас есть условия, которые уже вызывают ограничения по тому насколько что можно паралелить (посути при условиях вообще ничего нельзя паралелить), так что за счет развертки цикла профита не будет никак.
    Ответ написан
    Комментировать
  • Как часто вы используете/нужно исользовать паттерны проектирования и построении api?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Вы должны понимать зачем вообще нужны паттерны. Со временем вы можете и без книг придти к каким-то типовым решениями и т.д. То есть вы можете как-нибудь взять туже "банду четырех" и так вот... смотришь свой код и "а, так вот как это называется".

    Например почти каждый javascript разработчик писал что-то в духе...

    var api = (function() {
        // какие-то приватные вещи, к которым не стоит давать доступ из вне
        // что бы все было чистенько
        var privateVars =  {};
     
        // публичный метод
        return function () {
             
        }
    }();


    Но сказать что это "шаблон модуль" могут не все. В случае с CommonJS оно происходит автоматически, но суть остается той же. Думаю добрая половина даже не знают что все это ради инкапсуляции.

    Суть не в том что бы использовать шаблоны (важно понимать почему вообще они появились), так как вы так или иначе их будете использовать, а больше в общей терминологии. Это сокращает время требуемое на обсуждение реализации.

    p.s. пользуюсь постоянно, в контексте Angular реализую даже сервисный слой, что бы вся бизнес логика была вне контроллера и последний использовался для отделения бизнес логики от логики представления.
    Ответ написан
  • Ресурсоемкая функция подвешивает браузер?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Проблема простая - JS однопоточный. Более того, он работает в том же потоке, в котором и UI обрабатывается. То есть если вы залочили выполнение перебором - то печаль беда.

    Варианты - самый наилучший - вынести тяжелую задачу в WebWorker-ы. Их для этого и придумали.

    Другой вариант, если вам важна поддержка старых браузеров - делать паузы через каждые N операций. То есть у вас скажем массив с миллионом айтемов. Можно попробовать все делать асинхронно через setTimeout, что разгрузит event loop и позволит в перерывах UI-ке реагировать. И да это кастыль.
    Ответ написан
    1 комментарий
  • Design patterns in PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Ссылку на репозиторий вам уже привели.

    Вообще стоит почитать оригинальную книгу. Хотя и на википедии информации предостаточно в сжатом виде.

    Если без лишней воды, можно еще послушать лекции Сергея Немчинского (там помимо GoF рассказывается в принципе про основы ООП, GRASP и т.д. Что вобщем-то логично ибо без основ понять почему так а не иначе сложно и все сведется к простому заучиванию. и еще несколько лекций по рефакторингу).

    Ну и еще рекомендую почитать/посмотреть дяду Боба и подчерпнуть там чего о SOLID.
    Ответ написан
    Комментировать
  • Какие есть минималистичные PHP ORM библиотеки?

    @IceJOKER
    Web/Android developer
    Все никак не пойму - не легче ли вам самим поискать? ведь так сэкономите свое же время, чем задавать вопрос и ждать ответа..
    2da0de8776.jpg
    Ответ написан
    2 комментария
  • Действительно ли Zend Framework 2, лучше забыть?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Мне сказали что ZF2 прошлый век, и сейчас используют Laravel и Yii

    пошли этого человека куда по дальше. Это фреймворки обсалютно для разных задач. Laravel и Yii - преимущественно для быстрой разработки, хорошо подходит для малых и средних проектов. Для средних и больших больше подходит Zend (ну или Symfony).

    Грубо говоря:
    Yii и Laravel - RoR way
    Zend и Symfony - Java/C# way

    p.s. Если для вас фразы типа Single Responsibility, Layered Architecture, persistence ignorance, Unit-of-work и т.д. не пустой звук - Zend для вас. Если же нет - то можно думать.
    Ответ написан
    Комментировать
  • PostgresSQL вижу чужые базы данных - это нормально?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    %D1%82%D0%B0%D0%B9%D0%BD%D0%B0%D1%8F-%D0

    Если можете оттуда данные забирать или и того хуже записывать т.д. - надо смотреть настройки прав доступа.
    Ответ написан
    Комментировать
  • Как реализовать сервис поиска попуток и попутчиков?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    какой фреймворк или cms лучше всего использовать

    Может забейте просто? Без таких вещей как автопостроение маршрута и автоматического подбора попуток/попутчиков (а это использование таких СУБД как neo4j, алгоритмы дэйкстры или другие алгоритмы поиска пути) профита от сервиса для пользователей не будет. Это не сильно весело мониторить списки в поисках людей с которыми вам попути.

    Такие дела..
    Ответ написан
    Комментировать
  • Замыкания внутри циклов в JavaScript. Какова механика работы?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    в курсе сюрпризов JavaScript относительно замыкание внутри closures.

    Если для вас это все еще сюрпризы - рекомендую перештудировать какой-нибудь туториал или документацию. В JS все как-будто асинхронно, на самом деле там просто есть event loop.

    Давайте разберемся на примере:

    for(var i = 0; i < 10; i++) {
        setTimeout(function() {
            console.log(i);
        }, 1000);
    }

    Что у нас тут будет происходить. Мы берем цикл и 10 раз создаем отложенный вызов. Что при этом происходит... давайте представим себе что в JS все разбито на кадры. Цикл - один кадр, и пока он не отработает, какой бы он длинный не был - новый кадр так же не отработает. setTimeout не просто выполняет код с задержкой, через 1000 милисекунд в event loop будет добавлен очередной кадр. И любой "асинхронный" вызов так же просто добавляет кадр в event loop. Внутри же event loop все выполняется синхронно и по порядку.

    Так вот, на момент, когда закончит выполнение кадр с циклом, значение i уже будет установлено в 9. А как мы выяснили ранее, JS ничего более не будет выполнять до этого момента. Посему отложенный код выведет нам одно и то же значение так как все они ссылаются на одну и ту же переменную.

    Теперь, что происходит тут:
    for(var i = 0; i < 10; i++) {
        (function(e) {
            setTimeout(function() {
                console.log(e);
            }, 1000);
        })(i);
    }


    Да собственно то же самое. Только за счет того что мы при публикации setTimeout используем замыкание и передаем i в качестве аргумента, срабатывает механизм называемый copy-on-write. То есть в замыкании не i а его копия (когда цикл перезаписывает значение i - все кто ссылался на это значение не по ссылке, копируют себе переменную, для простоты можно просто думать что каждый раз когда вы передаете что-то не по ссылке, происходит копирование).

    Так как у каждого кадра, выполняемого в setTimeout есть своя копия i с нужным значением - все будет хорошо.
    Ответ написан
    2 комментария
  • Друзья, есть ли какие задачи для практики по JavaScript?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Реализуйте unit-of-work, identity map и шаблон репозиторий на JS. Эдакую абстракцию позволяющую выделить persistence layer.

    Других идей под чистый JS нет. Все остальное будет хоть как-то связано именно с DOM и т.д.
    Ответ написан
    Комментировать
  • Падает ли скорость от ORM?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Зависит от ORM. Оверхэд по производительности конечно будет, особенно если брать штукти типа Doctrine с гидрациями и т.д. Но тот профит в плане времени разработки и качества продукта которые они дают слихвой окупают все издержки. Если проект становится популярным и +30% это лишняя стойка серверов, то есть платить за сервера уже становится дороже чем за разработчика, тут уже имеет смысл рефакторить и оптимизировать узкие места. Но преждевременные оптимизации - зло.

    Что до SQL и возможностей СУБД - Doctrine и многие другие позволяют вам использовать как нативные запросы (+ свои гидрации) так и добавлять какие-то свои функции для *QL. Так же многие вещи можно порядочно ускорить (в доктрине самым узким местом является unit-of-work а точнее вычисление дифа данных которые там крутятся. По умолчанию там все сравнивается в лоб, типа дерти чекинг, но можно установить свою реализацию для своих сущностей если вы этого захотите).
    Ответ написан
    Комментировать
  • Twig как проверить существование ключа массива?

    error500
    @error500
    PHP-developer
    Попробуйте {% if items[myKey] is defined %}
    Ответ написан
    Комментировать