Задать вопрос
Ответы пользователя по тегу Проектирование программного обеспечения
  • Почему идентификатор TSID такой?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Чтобы уметь их сравнивать.
    Если использовать твое решение (без времени), то будет верным только 1 узел всегда (если в этом случае сравнение будет иметь смысл).
    Ответ написан
  • Будет ли считаться правильно, если я размещу интерфейс репозитория в выходных портах в контексте чистой архитектуры?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    По идее, репозиторий - это абстракция над хранилищем твоих сущностей, он должен быть простой прослойкой для запросов в БД. Он должен быть в доменном слое, чтобы ты мог получать доступ к сущностям и выполнять доменные операции, например, заказ товара - нужен репозиторий, чтобы обновить сущность заказа.

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

    Если размещать интерфейс репозитория в прикладном слое, то тут 2 варианта:
    1. У тебя богатые сущности, которые могут выполнять все действия без необходимости доп. запросов. Это похоже на DDD с их агрегатами.
    2. Все смешалось в кучу и доменка вызывает прикладной слой

    Скорее всего, идея такого проекта следующая - доменный слой имеется только сущности и все операции не требуют других зависимостей, а прикладной слой уже кое-как говорит с внешним миром и реализует бизнес операции.
    Ответ написан
    1 комментарий
  • Как решить проблему Rich Model в DDD?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Отвечу на вопрос так: ядро DDD - представление бизнес-логики в коде. Добавляются промокоды, уровни скидок, подписки и т.д. - все это меняет бизнес-логику. Это нельзя просто просто взять и убрать, т.к. грубо говоря, под эти дела завели отдельные документы (юридически оформили уровни скидок, промокоды и т.д.). Соответственно и твоя доменная сущность должна измениться, так как она - отражение реального мира, а реальный мир изменился.

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

    P.S. сделаю замечание по поводу этой фразы:

    Также, подписки находятся в отдельном микросервисе, имеют свою БД и никак не связаны с сущностью пользователь.


    Тут явно это не говорится, но мне кажется, что ты разделяешь микросервисы по сущностям. Это плохой подход, так как ведет к головным болям, которые приводят к подобному (заданному) вопросу. Запомни: микросервисы надо разделять по бизнес-задачам, а не сущностям (иначе получаются вот такие crud сервисы, знающие друг о друге).
    Начни с этой статьи, и копай дальше. Иногда вопросы кода надо решать на уровне архитектуры системы.
    Ответ написан
    Комментировать
  • Какой брокер сообщений выбрать под задачу - принять данные по api и записать в базу?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Миллион элементов в json - это сильно (жирно).
    Предлагаю следующий вариант:
    - В качестве брокера использовать любой брокер сообщений/менеджер очередей с ACK/NACK механизмом (Redis Streams, RabbitMQ, Kafka)
    - Все json разбиваем на 2 категории - большие и маленькие в зависимости от размера (кот. поддерживает брокер)

    Алгоритм будет следующий:
    Producer:
    - Приходит запрос с json
    - Если json маленький, то отправляем в брокер напрямую
    - Если json большой, то сохраняем его в отдельную БД и получаем ID этой записи, в брокер отправляем ID этой записи

    Consumer:
    - Получает сообщение из брокера
    - Если json содержится в сообщении (когда маленький), то сохраняем в БД
    - Если json был большим и передан ID из БД, то читаем этот JSON из временный БД и сохраняем в целевую БД
    - Коммитим сообщение

    Пример такого запроса:
    // Маленький объект
    {
       "data": {
           "key": "value"
        },
        "id": null
    }
    
    // Большой объект
    {
        "data": null,
        "id": 13123123
    }


    P.S. название паттерна хранения большого объекта во внешнем хранилище и передача только его id не помню
    Ответ написан
  • Где можно применить hexagonal architecture?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Чистая архитектура - это просто идея, а не готовая архитектура. Гексагональная - частный случай чистой.
    В блоге Роберта Мартина первыми строками идет:
    Over the last several years we’ve seen a whole range of ideas regarding the architecture of systems. These include:

    Hexagonal Architecture (a.k.a. Ports and Adapters) by Alistair Cockburn and adopted by Steve Freeman, and Nat Pryce in their wonderful book Growing Object Oriented Software
    Onion Architecture by Jeffrey Palermo
    Screaming Architecture from a blog of mine last year
    DCI from James Coplien, and Trygve Reenskaug.
    BCE by Ivar Jacobson from his book Object Oriented Software Engineering: A Use-Case Driven Approach
    Ответ написан
    1 комментарий
  • Насколько разумно при композиции позволять компоненту управлять родителем?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    С точки зрения ЯП/Рантайма, это приведет к кольцевой зависимости, а это порождает различные баги (например, освобождение памяти), поэтому так лучше не делать.
    С точки зрения проектирования, Car не должен знать о Driver - это Driver должен знать о Car, т.к. он ей управляет. Здесь, по факту, водитель - это контроллер какого-то объекта.
    Ответ написан
    2 комментария
  • Какой самый простой способ организовать SSO?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Самый популярный фреймворк для SSO - OAuth.
    Про него много где уже писали. Например, вот некоторые ссылки:
    - https://habr.com/ru/articles/77648/
    - https://habr.com/ru/companies/vk/articles/115163/
    - https://oauth.net/2/

    Также есть еще и OpenID Connect. Это фреймворк построенный вокруг OAuth:
    - https://habr.com/ru/companies/nixys/articles/566910/
    - https://openid.net/developers/how-connect-works/

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

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Как по мне, для MVP достаточно будет монолита. + т.к. модели практически одинаковые, то будет проще.
    Если выстрелит, то сделай рефакторинг под модульный монолит, а потом и микросервисы.
    Ответ написан
    Комментировать
  • Как реализовать SQL движок в своём приложении?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    1. GraphQL - специальный язык запросов. Можно изменять/обновлять/добавлять/читать. Есть полноценный пакет, который парсит запрос и выполняет его. Можно к In memory коллекциям подкрутить. Но это не SQL

    2. OData - тоже язык запросов. Можно изменять/добавлять/читать/удалять. Он достаточно старый и разобраться сложнее. Тоже есть фреймворк, который автоматизирует работу по парсингу/выполнению. Это также не SQL

    3. In Memory sqlite - можно запустить SQLite в памяти и проксировать запросы уже ему.
    Ответ написан
    Комментировать
  • На что опереться при проектировании API (паттерны, концепции)?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Ну я вроде и рассказал, что это противоречит тому же SOLID

    Проектировать API надо по требованиям предметной области.

    SOLID, REST и т.д. - это конечно же хорошо, но когда из-за них архитектура становится трудной к пониманию - тупое следование им только усугубит ситуацию.

    а почему я не могу в API сделать метод DELETE и в него передавать и тип объекта, и его id


    Почему нет? Если объекты создаются динамически, а не предопределены, то передавать их тип - хорошая идея.
    Все зависит от проблемы.

    Есть где кратко изложенная теория по этому поводу?


    Вряд-ли. Все зависит от проблемы/предметной области.
    Могу посоветовать алгоритм:
    1. Выявить функциональные требования к системе
    2. Представить их в виде условных функций
    3. Переписать их в виде вызовов API (за основу можно взять готовые паттерны проектирования: REST, SOAP и т.д.)

    Посмотрите на API VK или Telegram. Это не REST, но тоже удобно
    Ответ написан
    3 комментария
  • О чём архитектура ПО?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Я запутался, что в итоге такое архитектура? Это про код, про инфраструктуру или про технологии?

    Архитектура это про то, как компоненты связаны между собой.

    Заметь, что такое "компоненты" не сказано. Это может быть и код, и инфраструктура, и сервис.
    Например, архитектуру кода можно представить через диаграмму классов UML. Архитектуру инфраструктуры, можно через C4.

    Как понять о каком типе архитектуры речь, когда о ней заходит разговор?


    По контексту.
    Разговор о функции или классе - об архитектуре кода.
    Разговор о базе данных или сервисе - об архитектуре инфраструктуры.
    Ответ написан
    Комментировать
  • В чем разница между понятиями Anti-Corruption Layer и паттерном Adapter?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Anti-Corruption Layer - это понятие из DDD. Оно обозначает слой (это может быть отдельный сервис или функция валидации), который проверяет запрос на корректность.

    Адаптер - это больше паттерн проектирования, который, грубо говоря, трансформирует запрос из одного формата в другой. Например, из XML в JSON, или если стоит прокси, то превращает `X-Redirected-From` в `Redirected-From` в HTTP заголовках.

    Адаптер может выполнять роль Anti-Corruption Layer и наоборот
    Ответ написан
    Комментировать