• Как совместить реляционную модель бд с ООП?

    @xfg
    Я бы в read моделях вообще не использовал ORM. Оно там не нужно, нам нужно просто получить данные и пробросить их дальше, а для этого достаточно обычных sql запросов. И вообще это чтение может быть с какой-нибудь денормализованной базы данных подготовленной специально для чтения, чтобы не городить трехэтажные селекты. Вот для write моделей, да это нужно, но там и не нужны сложные sql запросы потому что не вытаскивают связи вместе с объектом. Вытаскивают только сам объект, меняют его состояние и сохраняют обратно в хранилище. Если нужно поменять и связанные объекты в рамках одного и того же бизнес-процесса, то используют saga pattern и eventual consistency. В итоге получается распределенное приложение, с консистентностью данных, но без джойнов и транзакций. Ну и без РСУБД как правило, потому что пользы ноль от них в распределенных системах.
    Написано
  • Как делать сложные запросы используя репозитории и объединение разных таблиц?

    @xfg
    Максим Ковалев, погугли. Для чтения не используют репозитории и доменную модель. Это просто не нужно. При чтении делают прямые запросы в базу данных. Репозитории и доменную модель используют при изменении данных и здесь не должно быть сложных запросов, так как всё что требуется - это найти нужный доменный объект, изменить его состояние и сохранить обратно.
    Написано
  • Как бэкенд-разработчику поднять свой заработок?

    @xfg
    Где зарплата выше, там и расходы выше. Смысл ехать в Москву чтобы отдавать 40-50 за квартиру и иметь те же 50-60 и повышенные расходы на всё остальное.
    Написано
  • Правильно ли я нарисовал план ООП игры шашки?

    @xfg
    2. Шашка это неотъемлемая часть доски. Поэтому модификация шашек будет из сущности доски.


    У вас DDD указан в профиле. В книге Вон Вернона Implementing domain-driven design про агрегаты написано, что не нужно вкладывать сущность в агрегат просто потому что это кажется логичным. Нужно исходить из наличия инвариантов, то есть ситуации когда корень агрегата меняет своё состояние при изменении внутренней сущности, если такое есть - тогда да, если их нет, тогда нет. Здесь такого не наблюдается, стандартная ситуация из двух агрегатов доски и шашки со связью 1:N, где шашка ссылается на доску по id.

    Вот что точно ненормально, так это отрисовка шашки, подсветка клетки, получить возможные ходы и тому подобное. Потому что это не бизнес-логика. Нет такого в игре в шашки, а когда проектируется что-либо, всегда нужно помнить, что мы делаем модель чего-либо. Соответственно чего нет в том предмете/явлении, который мы проектируем, этого не должно быть и в его доменной модели, так как модель есть упрощенная версия того или иного предмета/явления. Рисовать шашки, подсвечивать клетки и ходы - это всё должно быть в слое представления. Вообще автор может открыть выше указанную книгу и самостоятельно понять, что в его модели не совсем хорошо и как это можно исправить.
    Написано
  • Какие ресурсы и литературу почитать для освоения node.js?

    @xfg
    Алий Кунашев, есть такое. Тоже когда-то переходил с PHP 5 на nodejs 0.12 или даже раньше. Помню изначально скопировал с главной оф. сайта пример веб-сервера. Удивился ничего не сказать. Ничего не понял и стал читать доку к http модулю. Был в недоумении, как же так даже не рассказали как работает эта штука и сразу пихают API. Но я тогда просто проигнорировал гайды на оф. сайте и прочитал их много позже, а там всё это было и даже больше. Даже не знаю как освоил. Получается тоже через гугл.
    Написано
  • Что делать, если взломали и удалили сайт?

    @xfg
    Всё возможно. Дыра может быть не только в твоем коде, но и у тех, кто поставляет софт, на котором работает сайт. Даже если защитился от xss, инъекций, csrf и прочего, то обязательно найдется кто-то кто проверит твою поделку на устойчивость к race condition или заюзает какой-нибудь баг из ПО или вообще найдет новый неизвестный вектор уязвимости. Просто первое что нужно делать в таких случаях - лезть в логи веб-сервера. Если веб-сервер являлся точкой входа в систему, то после некоторого анализа будет понятно кто и что делал и где дыра. Более того, уязвимость можно будет воспроизвести в тестовом окружении и затем написать на неё фикс.
    Написано
  • Как лучше обращаться с параметрами метода?

    @xfg
    Denis, в таком случае можно использовать паттерн composite. Базовая идея та же самая построенная на полиморфизме типов, как и практически все шаблоны проектирования.

    Я лишь хотел донести мысль, что когда есть что-то одного и того же типа, но разной реализации - то это история про полиморфизм в любом случае. Шарики, ручки, доставки, кеши или логгеры - неважно. Важно лишь то, что мы должны отделить разные алгоритмы одного типа от клиента через интерфейс.
    Написано
  • Как правило организовать рабочее окружение web разработчика?

    @xfg
    NkDev, две системы можно установить на машину. В чем проблема? Для работы Ubuntu + docker + git. Для развлечений windows.
    Написано
  • Как вы относитесь к использованию транзакций в Laravel?

    @xfg
    Alex Wells, да, всё верно, только в saga не откатывают, а компенсируют. Отличие в том, что rollback - это техническая штука, которая случается при ошибках в инфраструктуре. Компенсация - это бизнес штука, которая случается, если было нарушено бизнес-правило. Классический пример - бронь путешествия. На первом шаге бронируем отель, на втором шаге пытаемся купить билет на самолет, но сервис отвечает отказом, так как билеты на эту дату уже распроданы. Теперь требуется отказаться от бронирования отеля. Это и делает компенсирующая транзакция. То есть здесь нет технических ошибок, здесь есть только бизнес-правило не позволяющее дальше продолжать цепочку действий, поэтому она прерывается и начинает идти в обратном направлении. Соответственно компенсация - это не обязательно шаг строго обратный транзакции, в отличии от rollback. При технических ошибках, сага падает и остается не завершенной, такие ситуации нужно анализировать и исправлять код, чтобы сага всё же смогла придти к завершенному состоянию.

    По поводу doctrine, я так понимаю имеется ввиду шаблон Unit of Work. Он к сожалению не решает проблемы дедлоков. Они в любом случае будут возможны. Чем больше сущностей внутри транзакции и чем чаще происходят эти транзакции, тем выше вероятность получить deadlock. Можно погуглить doctrine deadlock, чтобы в этом убедиться. Эту проблему не возможно решить какой-либо библиотекой, просто потому что так устроены сами ACID-транзакции. Doctrine может лишь скрыть эту проблему от пользователя используя например ретраи. Unit of Work просто позволяет не держать транзакцию открытой, а открыть её только в тот момент, когда мы готовы сделать коммит.

    Но всегда, всё имеет свои компромиссы. Saga значительно повышает сложность проекта, но фактически является де-факто в распределенных системах.
    Написано
  • Почему мой код js не работает на ноде?

    @xfg
    semki096 всё верно websocket это web api, а не часть языка javascript. Node.js использует только javascript. Соответственно для того, чтобы поднять websocket-сервер вам нужно взять сторонний модуль или написать свой используя встроенные модули node.js. Например этот https://github.com/websockets/ws очень популярен или для вас проще сразу взять фреймворк https://github.com/socketio/socket.io так как там уже реализован протокол обмена данными между клиентом и сервером поверх websocket протокола.
    Написано
  • Http очереди в порядке добавления?

    @xfg
    Для очередей можно использовать rabbitmq. Есть клиенты под различные языки программирования, в том числе и PHP.
    Написано
  • Взламывают, как защитить сайт?

    @xfg
    Чтобы понять как защитить, нужно понять как взламывают. Чтобы понять как взламывают нужно смотреть логи веб-сервера так как точка входа в уязвимость вероятнее всего там. Если вы каким-то образом узнали, что кто-то гулял по вашей панели администратора, значит вам должны быть известны какие-то данные, например пользователь который гулял, дата когда гуляли, урл по которому гуляли. Этих данных достаточно, чтобы отфильтровать логи по дате, по пользователю, по урлу и проанализировать какие запросы были сделаны в это время, по такому-то урлу, таким-то пользователем. Как правило сразу всё станет очевидно и ясно где дыра, а сидеть и генерировать предположения дело довольно бесполезное.
    Написано
  • С чего начать создание игры на android/iOS?

    @xfg
    xmoonlight, там не рассказывают как делать правильно или неправильно, там лишь речь о том, как игры устроены внутри. Каким образом генерируется кадр и тому подобное. Чтобы человек имел представление о чем-то еще, кроме как нажимания кнопок в редакторе.
    Написано
  • С чего начать создание игры на android/iOS?

    @xfg
    xmoonlight, ваше чсв не позволяет вам аргументировать свою позицию?
    Написано
  • С чего начать создание игры на android/iOS?

    @xfg
    lehinas, можно еще посмотреть плейлист https://www.youtube.com/watch?v=HLbxyPwdlgI&list=P... где автор рассказывает о том как это всё устроено.
    Написано
  • Как максимально ускорить скорость работы сайта?

    @xfg
    smilingcheater, html страницы это да, 1.2 мб против 400 кб у эталона, но там еще и TTFB 640-700 ms у автора против 40-70 ms у эталона. Посмотрел другие битрикс каталоги и все примерно с таким ttfb и отдаются. Соответственно проблема вероятнее всего с кодом битрикса. Никому неизвестно сколько всего там вычисляется прежде чем результат будет передан веб-серверу. Нужно распутывать километры спагетти-кода чтобы разобраться что там понаписали разработчики этого решения, но проще забить.
    Написано
  • Какой инструмет выбрать для бэкенда?

    @xfg
    Евгений Ромашкан, Фаулер считает анемичную модель анти-паттерном, но бизнес-логику в сервисах без модели вообще - он считает нормальным решением и называет это transaction scripts. Такую же мысль в своих книгах доносят и другие известные инженеры. Посыл следующий или пишите процедурно или пишите объектно-ориентированно. Не делайте нечто среднее, то есть анемичную модель + процедуры в сервисах, так как не получите никаких преимуществ перед transaction scripts, но получите всю сложность domain model. Ну и тот же Фаулер ничего против rich model с использованием Active Record не имеет, указывая в своей книге PoEAA на то, что это некий компромисс между transaction scripts и domain model.

    Только всякие хейтеры в интернете пишут, процедуры говно, active record анти-паттерн и нарушает принцип единой ответственности, что можно оспорить и вроде это даже делается прямо у Фаулера в PoEAA. Нужно просто иметь прямые руки и осознавать трейд-оффы каждого из решения которое предлагается к проектированию бизнес-логики.
    Написано
  • Откуда появился логотип Хабр Q&A?

    @xfg
    Adamos, можно подумать, что государство настолько ужасное, что ты ходишь в разорванных трусах и живешь в картонной коробке, а вот было бы другое, то ты наверное точно купил бы самолет с яхтой, ну или хотя бы новую BMW. Люди, которые сумели создать свои компании, не ноют, не кричат как всё ужасно, не тащат всюду политику, а работают, обеспечивают работой других и создают ввп страны. Мнение таких людей может иметь значение. Мнение крикунов - нет, которых к тому же используют люди, некоторые из которых уже были ранее во власти и что-то как-то эдемов сад построить не сумели.
    Написано
  • Где можно посмотреть толковые реализации API на Symfony?

    @xfg
    Не пишу на симфони, но по поводу исключений обычно вешают пользовательский обработчик исключений через set_exception_handler куда проваливается всё, что не было перехвачено. В этом обработчике определяют в каком окружении запущенно приложение и если это HTTP, то бросают HTTP-исключение, а в сервисах и везде глубже, да бросают обычные исключения.

    Это уже должно быть реализовано в фреймворке и должна быть возможность подменить дефолтный обработчик исключений на свой. Думаю стоит просто погуглить.
    Написано