Ответы пользователя по тегу Проектирование программного обеспечения
  • Как лучше организовать архитектуру классов?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Насколько это правильно с точки зрения архитектуры?

    Если вы уже используете Container, то вы уже понимаете суть DI контейнера или близки

    В контейнерах не хранится ссылка, а хранится просто инстанс объекта, если не указано, что для сервиса зависимость должна быть новой (новым инстансом) и просто инжектите этот объект
    Ответ написан
    Комментировать
  • Как снизить нагрузку на API?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Вы можете использовать TUS протокол для загрузки файла чанками

    Сервер фиксирует текущее состояние загрузки файла и всегда известно ему сколько уже загрузилось

    С каждым чанком возвращается инфа о размере загруженном и не надо отдельно делать какой-то запрос… то есть вы просто грузите ваш файл, а прогресс всегда известен

    Кроме того вы получаете возможность возобновить загрузку с того места, где остановились… это мощное и гибкое решение

    Сделал такое на go, для Java тоже есть решения и для сервера и для клиента…
    Ответ написан
    Комментировать
  • Не является ли создание глобального контекста антипаттерном?

    Maksclub
    @Maksclub
    maksfedorov.ru
    в Golang, например, контекст есть на уровне стандартной библиотеки (нужен для управления конкурентными сущностями (закрытие как правило)), а на уровне http роутеров — контекст используют как контейнер для значений почти все реализации, тк через жизненный цикл запроса протаскивать значения — типовая задача роутера

    в целом, вам нужно минимизировать такое явление. Если http-контекст остается только в http слое, то ваша задумка покушается на бизнес-логику. В бизнес-логике никакого контекста быть не может, если у вас есть конфиги или что-то такое — это часть контракта, просто его вы задаете в конфиге и инжектите ту часть контракта, что нужна
    Ответ написан
    1 комментарий
  • Отделение бизнес логики от фреймворка Symfony?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Генератор — просто инструмент для помощи, по итогу сущности чисты, не считая аннотаций/атрибутов для маппинга в ORM, но это просто мета-информации и завязка не существенна (не считая маленького компромисса с ArrayCollection). То есть если вы выберите др ORM, то эти аннотации вам не помешают никак, просто лишние заюзанные классы аннотаций

    Имея сущности доктрины — у нас не связанный от фреймворка код, пишите спокойно бизнесуху, не обращая внимания на то, как оно потом маппится. То есть практически все по каннонам

    Чтобы отделить репозиторий от домена — просто в домене делайте интерфейс, а вот реализация этого репозитория будет в Infrastrucure Layer, но это избыточно... риск минимальный, если сделаете не совсем по канону, а именно риск стоит как основной аргумент такового отделения (не просто же вы словам следуете, а причину понимаете?)
    Разработка строится на компромисах, если смените доктрину на др ORM — так и так писать новые репозиторий, вероятность низкая и многие например не делают такие интерфейсы — слишком усложнит код...
    Вам надо будет просто репозиторий в маппинге ORM\Repository заменить в таком случае

    Некоторые компании пишут интерфейсы и сильно усложняют код, но тк риск минимальный изменений, то такое усложнение приводит как правило к усложнению и не более. Следуйте здравому смыслу.
    Мой довод нельзя раскручивать "ну раз минимальный, то завяжусь по полной". Все же отделение логики надо делать

    чтобы все же соблюсти эту чистоту
    и не сильно усложнить, то можно систему разбить на модули/фичи
    и каждый модуль будет иметь такие слои
    почему лучше это сделать:
    - реализация репозиториев хоть и инфраструктурная, но правится часто при изменении домена, а значит сильно далеко прятать не вариант, иначе сильно все будет размазано... потому модуль делают трехслойным (инфра, домен и апликейшн слой)
    пример

    617588c41bdde421641847.png
    Ответ написан
    8 комментариев
  • Как правильно спроектировать обработку ошибок в слоях?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Репозиторий может иметь методы find() — возвращает Optional
    а может иметь get() — возвращает или нужный объект или исключение, которе может лететь дальше или перехвачено контроллером и выброшено дальше

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

    Maksclub
    @Maksclub
    maksfedorov.ru
    Или же expiretionDate правильнее выставлять через setExpirationDate

    Согласно всем учебникам ООП, обработка данных должна быть там, где эти данные лежат
    Вопрос только в том, что обычно в Java/Php приложениях царствует анемичные сущности с сеттерами и геттерами

    Ответ: это хорошая практика, довольно семантичная и со всех сторон хорошая( Information Expert из Grasp, закон деметры, инкапсуляция), сететры и обработка состояния объекта снаружи все это игнорируют

    Если и так вы делаете в сущности, то не особо важно, при билде объекта в констуркторе это тоже хорошо делать, setFoo() ничего не несет под собой и скрывает вашу логку и семантику происходящего)

    Почитать:
    https://martinfowler.com/bliki/TellDontAsk.html
    https://habr.com/ru/post/500416/ (моя статья)
    Ответ написан
    Комментировать
  • Нормально ли делать методы в DTO-классах?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Неправильно, валидаторы и десериализаторы пусть будут в конверторах, например для контроллеров
    Сами ДТО просто плоские глупые объекты. разве что маппинг и констрейнты повесить на поля (насколько это позволяет язык), а-ля через аннотации в PHP/Java

    У меня так ДТО выглядит для JSON (язык PHP)
    6151d8c3ef483090103516.png
    Использование:
    6151d96b4b398769256144.png

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

    Maksclub
    @Maksclub
    maksfedorov.ru
    Когда очень много логики и ее вариантов, то появляются разные DSL, которые сами внутри эту логику собирают...
    При проектировании DSL просто проектируется возможность как чего делать

    Например БД: есть куча данных и огроооомнейшее число как выбирать эти данные и правила выбора... Можно на разный случай накодить всякого, а можно придумать снтаксические конструкции, с помощью которых эта логика сама под капотом выполнится... так появился SQL язык

    Ну например есть некоторые правила дял построения акций:
    • Если есть один товар такого-то критерия
    • Если все товары такого-то критерия
    • Если хотя бы один товар такого-то критерия
    • Если ни один товар такого криетрия
    • ...

    Можно на каждый случай запрограть, особенно критерии то разные

    А можно придумать некоторый функционал, который бы принимал некоторые правила для разных компаний, которые бы конфигом настраивались, а критерий описывался бы еще одним рпавилом, и тогда любой маркетолог мог бы собирать разные акции
    Ответ написан
    Комментировать
  • Как спроектировать фреймворк?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Фреймворк от начала и до конца (с пайплайнами, мидлварями и контейнером):
    https://youtube.com/playlist?list=PLE20id3DjfFnio1...
    Ответ написан
    5 комментариев
  • Как действительно поможет ООП в реальной программе?

    Maksclub
    @Maksclub
    maksfedorov.ru
    ООП упрощает код, логику и понимание...
    Но только в случае подготовленного человека. Соответственно пока нет осознанности в происходящем и опыта, то ясен пень — будет сложно и не понятно

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

    Как поможет ООП:
    Очертит ваши абстракции явно названием, состоянием и поведением, а также описанием в коде.
    Позволит добавлять новые типы легко и всегда контроллировать той или иной контекст в виде осмысленной единицы, а не 100500 факторов, да еще и при каких-то еще условиях.

    Без ООП — абстракции не будут иметь четких границ и смысл будет в разобранном состоянии собираться из крупиц по коду и данным, но и такой, процедурный подход, имеет преимущества
    Ответ написан
    Комментировать
  • Какую архитектуру выбрать для системы с задачами, которые требуют множественной обработки/подтверждения?

    Maksclub
    @Maksclub
    maksfedorov.ru
    State Machine

    Хорошо себя показывает в разного рода CRM, колл-центрах, Order Proceesing в сложных системах.
    Из одного состояния можно перейти только в определенные, каждое состояние валидно, открыты только определенные переходы и в целом такой подход к проектированию помогает бороться со сложностью условий и контролем состояний.

    Пример схемы 1
    5d150bd349906770079074.png
    Пример схемы 2
    5d150cbb9ab7f176798816.png
    Ответ написан
    3 комментария
  • ValueObject - зачем?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Такой Value Object ВИДИМО создали, чтобы логику например его создания не городить в самих сущностях, например у этого VO может быть свой специфичный конструктор. Также у этого объекта возможны методы направления сортировки, вплоть до самых интересных -- эти знания тоже могут быть лишними для нашей сущности... Много чего может быть, вплоть до того, что нужно смотреть на некие другие данные и строить стратегию сортировки. И чтобы не нарушать SRP -- эту всю логику вынесли в самостоятельный объект, который не является сущность, значит в общепринятых терминах -- это VO.

    Такое может быть с чем угодно -- с датами, с метатегами (объект Meta для разных сущностей будет как правило с одной сиггатурой), для Id и даже может быть объект Name (в нем могут быть формирования коротких, длинных, сокращённый и всевозможных других состояний)

    Если у вас есть вопрос, замечу -- резонный, то вам такая абстракция просто напросто не нужна в силу простоты этого узла системы. Используйте int, но назовите тогда понятным свойством, например position или priority
    Ответ написан
    Комментировать
  • Как избежать дублирования кода в микросервисной архитектуре?

    Maksclub
    @Maksclub
    maksfedorov.ru
    как мне поступить без копипасты чтобы она была и так и там, чтобы когда нужно добавить метод в модель не нужно было следить самому за всеми копиями

    вынести в пакет или модуль эту сущность (или набор таковых), то есть сущность представляет некий домен, вот этот домен и подтягивайте в каждом микросервисе
    Ответ написан
    Комментировать
  • Как правильно заполнять БД при тестировании API?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Какого уровня тесты?
    • если интеграционный тест -- посмотреть в БД запись, на этом уровне тестирования вы работаете с разными участками системы и их взаимодействие (БД как раз является частью системы)
    • если приемочный -- посмотреть ответ по  GET, тк на этом уровне уже все должно работать как черный ящик, вы просто работаете с системой и смотрите результат ее работы (как человек, как браузер и т.д..)


    3 пункт конечно не делать!
    Ответ написан
    3 комментария
  • Как назвать папку с JS, CSS, Images, Fonts?

    Maksclub
    @Maksclub Куратор тега Веб-разработка
    maksfedorov.ru
    не важно как называются, но лежать они должны не в папке views (там у вас скорее всего темплейты лежат), а лежать в публичной папке, в той, куда смотрит веб-сервер и есть точка входа
    Ответ написан
    Комментировать
  • В чём причина постоянного переделывания кода?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Причин много:
    1. Бизнесу всегда нужно срочно. Из-за этого менеджер/заказчик бьет по рукам и говорит "не до архитектуры и главное быстрее", по итогу — пилятся костыли, которые блинным комом накатываются и в определенный момент нужно переписывать куски структуры, чтобы просто иметь техвозможность работать дальше
    2. Если было жирно по ресурсами и времени изначально и такая проблема — не правильная архитектура, экономия на тестах и прочее
    3. Плохая договоренность и плохое понимание задачи с каждой стороны, у кого-то завышенные/заниженные ожидания (один сказал сделай мне приложение, второй сказал, что сделает — вина обоих в таком случае)
    4. Не всегда это плохо. Сначала быстро запустили (проверили гипотезу, получили первые деньги, инвестиции и прочее), потом переделывают планово (просто этот план может не проговорен, отсюда плохие ожидания и чувство низкого КПД, а он может высокий как раз).

    Всегда, всегда ошибка менеджмента — где-то договорились, где-то не оговорили что-то, где-то не учли, где-то нажали, где-то пренебрегли, не выяснили ожидания, где-то сэкономили на выборе разраба, и прочее,
    даже если взяли не умного разраба — это тоже вина менеджмента

    UPD: Urukhayy речь не об этом проекте?
    Может ли проект быть собран с низким качеством кода, и пользоваться большим спросом?
    Ответ написан
    Комментировать