Ответы пользователя по тегу Проектирование программного обеспечения
  • На чём писать клиентское приложение с GUI?

    vabka
    @vabka
    Токсичный шарпист
    Можно посмотреть в сторону PWA и кэшировать данные в local storage или на диск.
    Ответ написан
    Комментировать
  • Как должна работать интеграция VK ID в SPA в описанном случае?

    vabka
    @vabka
    Токсичный шарпист

    Что должен возвращать mysite.com/redirect пользователю?

    Тот же самый токен, который бы твой сайт вернул при обычной аутентификации и отправить пользователя дальше
    Ответ написан
    3 комментария
  • Как организовать БД, если данные нужно отправлять по разным АПИ, в запросах которых поля отличаются?

    vabka
    @vabka
    Токсичный шарпист
    Если не упарываться в NoSQL, то можно классическим реляционным подходом - EAV-паттерн применить.
    Если постгрес, то можно его в документ-ориентированную базу превратить, благодаря jsonb полям.

    Я бы ввёл две таблицы:
    1. "Описание услуги" - с перечислением всех полей, которые должны быть указаны в заявке. (чтобы можно было сформировать форму)
    2. "Заявка" - там все специфичные поля записываются в jsonb-колонку.

    GraphQL позволит гибко настраивать payload для внешних API

    Мне кажется, что в этом случае GraphQL не очень подходит, так как у контрагентов может быть свой интерфейс взаимодействия => всё равно в коде нужно будет реализовать коннектор для каждого.
    Ответ написан
    1 комментарий
  • Какая архитектура бекенда для временной информации(капча и пр.)?

    vabka
    @vabka
    Токсичный шарпист
    Тут напрашивается Redis.
    1. Ничего страшного не произойдёт, если разок при вводе капчи пользователя попросят ввести её ещё раз, если на стороне твоего Бэка что-то потеряется.

    2. Если ты создаёшь большой сервис с кучей клиентов, то ты можешь захотеть горизонтально масштабироваться - тогда твой сервис должен быть stateless, а по тому никакого состояния в памяти у отдельного экземпляра быть не должно.

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

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист

    Чтобы данный сервис был доступен в окружении Lib.Controls, я реализую в этой библиотеке статический класс:

    Фатальная ошибка.


    Является ли такая архитектура единственно возможной или у нее есть достойные альтернативы?

    Раз у тебя уже есть DI, то следующий шаг прямо напрашивается. Создавать формы тоже при помощи DI и прокидывать все такие зависимости через конструктор.
    Ответ написан
    2 комментария
  • GRPC или RabbitMQ что лучше использовать для взаимодействия между API Gateway и микросервисами?

    vabka
    @vabka
    Токсичный шарпист
    1. Зачем вообще нужны усложнения, почему в рамках ваших сервисов не использовать rest api (обычный голый http с json-ами)?
    2. grpc vs rabbitmq - это больше вопрос про синхронное vs асинхронное взаимодействие.
    В зависимости от конкретного случая может быть лучше одно, а может быть лучше другое.
    Как правило при использовании api gateway имеет место синхронное взаимодействие, тк ожидается, что сервер ответит на http-запрос в течение пары секунд (как правило меньше секунды).

    При желании, можно поверх rabbitmq устроить rpc, но там всё равно будет более высокая нагрузка на железо, чем если бы напрямую происходил вызов.
    Ответ написан
    2 комментария
  • Как лучше возвращать ошибку API?

    vabka
    @vabka
    Токсичный шарпист
    Лучше возвращать какой-то код ошибки (можно несколько слов. Главное чтобы они никогда не менялись и значили одно и то же) и дополнительную информацию (например id не найденного объекта, роль, которой не хватило, дополнительные коды, и тд), а на фронте по этому коду находить человеческое описание и наполнять его дополнительной инфой.

    Но если хочется облегчить жизнь фронту (и усложнить бэку), язык на сайте только русский, и API будет пользоваться только сайтом, то можно на бэке формировать сообщение об ошибке.
    Ответ написан
    Комментировать
  • Где лучше всего хранить sms коды?

    vabka
    @vabka
    Токсичный шарпист
    Тут нет "более правильного" варианта.
    Программная инженерия - это всегда про компромисс.

    Я бы выбрал вариант с уже имеющейся базой данных, тк это:
    1. Уже проверенное решение
    2. Это решение очень простое и понятное
    3. Оно не подразумевает усложнение инфраструктуры
    4. Оно точно устроит тебя по производительности.
    Ответ написан
    Комментировать
  • Что лучше выбрать для взаимодействия в микросервисной архитектуре? MessageBroker или REST?

    vabka
    @vabka
    Токсичный шарпист
    Зависит от того что именно за данные (для какой цели) будут передаваться и между кем и кем.
    Rest как и любой другой синхронный метод взаимодействия несёт плюсы:
    + Сравнительно быстрая реакция на запрос и ответ. (как правило от запроса до получения ответа менее секунды)
    + Очень прост в использовании, нет никаких проблем с поддержкой на клиенте
    + Очень простая инфраструктура (в минимальном варианте она не нужна вообще)
    + Всё хорошо изучено. Та же аутентификация и авторизация очень легко реализуется в рамках http.
    + Достаточно легко разрабатывать и тестировать
    + Есть grpc и openapi - нет никакой проблемы с документированием такого API.
    + В http запрос с каким-нибудь multipart form data может спокойно быть размером в десятки мегабайт, а может и больше - полезно при загрузке файлов.
    И минусы:
    - Не понятно что делать, в случае недоступности ответной стороны
    - При неправильной реализации клиента (политики ретраев) - можно легко заддосить сервер

    Всякие разнообразные брокеры сообщений тоже имеют свои плюсы:
    + Строгая очерёдность обработки данных (событий) из коробки
    + В случае недоступности ответной стороны - брокер у себя может хоть несколько дней держать данные
    + Все политики ретраев реализуются на стороне брокера
    + Если это rabbit, то можно разные сложные механики рассылки и маршрутизации реализовать
    + Если это кафка или какой-то другой лог, то можно вычитывать события повторно

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

    vabka
    @vabka
    Токсичный шарпист
    При использовании TCP стека (Ethernet, IP, TCP) не гарантируется сохранение целостности.

    Гарантируется.
    Ответ написан
    7 комментариев
  • Что такое компонент? Что такое модуль?

    vabka
    @vabka
    Токсичный шарпист
    Существую 2 термина, компонент и модуль. Но что они обозначают?

    Зависит от контекста.
    Начнём с компонента, компонент, как мне представляется...

    Вот это "как мне представляется" будет зависеть от контекста => дальше можно не читать.

    А судя по схеме зависимостей компонентов (из раздела "принцип ацикличности зависимостей"), автор объединяет в компонент Controllers все контроллеры, в Entities все сущности:

    Если обратишь внимание на текст, то там написано "типичная диаграмма компонентов", а не "эталонная архитектура".

    Судя по всему у автора слой === компонент?

    Видимо. А есть Jimmy Bogart, который делает наоборот: https://www.youtube.com/watch?v=5kOzZz2vj2o

    PS: википедия
    Модуль (программирование) — функционально законченный фрагмент программы, оформленный в виде отдельного файла с исходным кодом или поименованной непрерывной её части.

    Модуль - это какая-то часть программы, которой дали имя. (например функция или класс)
    Видимо тут Модуль = Единица (Unit)

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

    Компонент - какая-то самодостаточная совокупность из модулей, которая может использоваться повторно.

    Но в других контекстах это может быть иначе.
    Ответ написан
    Комментировать
  • На что опереться при проектировании API (паттерны, концепции)?

    vabka
    @vabka
    Токсичный шарпист

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

    Может, да только это не по ресту будет.
    А если по ресту - тип и id и так передаются в URL.
    Но рест - это не стандарт и не Верховная истина,
    Если мешает иерархия, то никто не запрещает делать один ресурс доступным по нескольким разным путям.
    и при необходимости его можно нарушать - так появился jsonrpc например
    Ответ написан
    Комментировать
  • Что почитать по ТРПО?

    vabka
    @vabka
    Токсичный шарпист
    Выбирай интересующую тему:
    - Методологии
    - Менеджмент
    - Аналитика
    - Тестирование
    - Разработка
    - Эксплуатация
    - Проектирование

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

    vabka
    @vabka
    Токсичный шарпист
    Задача очень абстрактная и в такой постановке может выполняться на любом языке.

    Каждый разработчик будет хвалить своё болото, тк лучше его знает и хочет, чтобы вы наняли именно его.
    Ответ написан
    7 комментариев
  • Хорошая ли стратегия разбивать монолит джанго на микросервисы джанго?

    vabka
    @vabka
    Токсичный шарпист

    этот монолит очень тяжело поддерживать, обновлять код и дебажит.

    Распилив его на два микросервиса ты получишь два микросервиса, которые ещё тяжелее поддерживать, обновлять, и дебажить.

    В твоём случае будет лучше разобраться с первопричиной, тк монолитность сама по себе очень редко приводит к описанным проблемам.

    Дело пахнет скорее масштабным рефакторингом, чем разделением.
    Ответ написан
    1 комментарий
  • Какое место БД в Чистой Архитектуре?

    vabka
    @vabka
    Токсичный шарпист
    Где-то на одном из внутренних слоёв находится интерфейс для доступа к данным (репозиторий)
    А какой-нибудь из внешних слоёв этот интерфейс реализует.
    Ответ написан
    5 комментариев
  • Какой стек использовать для десктоп приложений в гос.предприятиях в 2023 году?

    vabka
    @vabka
    Токсичный шарпист
    Мне удобнее сделать всё на C#, .Net, WPF и в случае появления linux запускать всё под Mono.

    Ты под Mono не сможешь запустить приложение на WPF:)
    Тогда уж сразу лучше писать на Avalonia.
    Это раз.

    Два - если будет Linux, то очень велик шанс, что какой-нибудь особенный российский linux, у которого могут быть проблемы с совместимостью - нужно будет тестировать и как минимум писать инструкции по установке.

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

    vabka
    @vabka
    Токсичный шарпист
    Но насколько я понимаю, HTTP-связь между клиентом и сервером для многопользовательской игры совершенно некорректна.

    Зависит от того, что это за игра. Если это какой-то онлайн-шутер, то да, конечно это будет некорректно, но для какой-нибудь пошаговой стратегии - это будет вполне допустимо.

    Socket.io и SignalR сделаны поверх websocket, который является расширением для HTTP и построен поверх TCP.
    Lidgren network сделан поверх UDP и сейчас активно не поддерживается.

    Прежде чем определить, какой именно тебе протокол и подход будет применим тебе нужно ответить на следующие вопросы:
    1. Какие именно данные (сообщения) нужно передавать
    2. Сколько их будет генерировать один клиент
    3. Сколько клиентов должен держать сервер в рамках одной игровой сессии.
    4. Какие задержки допустимы для каждого из типов сообщений.
    5. Как себя должна вести игра при потере каких-то сообщений и как ты можешь попробовать их компенсировать
    6. Клиентом для тебя является браузер или же десктопное/мобильное приложение, или всё сразу.

    После всего этого ты сможешь определить, какой протокол тебе допустим - это будет http, вебсокеты, или вообще что-то кастомное поверх UDP или TCP.
    Причём для разных типов сообщений ты можешь использовать разный транспорт. Например, для передачи информации о покупках на внутриигровом рынке ты вполне можешь использовать http, а для передачи уведомлений об этих покупках - websocket, а для передвижений персонажей и их действий во внутриигровом мире - UDP, а для загрузки информации о мире и самих игроках - TCP.
    Ответ написан
    6 комментариев
  • Что такое бизнес логика и как их разделять с логикой приложения?

    vabka
    @vabka
    Токсичный шарпист
    На примере калькулятора бизнес-логикой будет собственно логика калькулятора - работа с переменными и математические операции.

    Логика приложения - всё что связано с взаимодействием с пользователем. Кнопки, формы, итд.

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

    Нет. Кнопки - это логика пользовательского интерфейса. Бизнес-логика - то, что за этими кнопками на самом деле стоит.
    Ответ написан
    1 комментарий