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

    qonand
    @qonand
    Software Engineer
    Не стоит путать паттерны и проектирование. Да паттерны используются в проектировании систем, но они сами по себе не есть проектирование. Очень часто люди прочитают пару книжек по паттернам и начинают их использовать где нужно и где не нужно и считают что все их система имеет хорошую архитектуру - но в результате от такой "архитектура" возникает больше проблем чем пользы. Поэтому мой Вам совет отложите паттерны на потом: почитайте что-нибудь именно о проектировании, и его принципах. Хотя бы того же Роберта Мартина. Бесспорно обе книги стоит прочитать, но как по мне их нужно читать имея уже определенные навыки
    Ответ написан
    2 комментария
  • Как решить проблему построения нескольких типов сущностей с возможностью неполного заполнения сущности из одной таблицы бд?

    qonand
    @qonand
    Software Engineer
    Без описания самих параметров сложно осознать разницу между сущностями, вообще правильность Вашего решения и дать более менее адекватные комментарии. Единственное что могу предположить, исходя из Вашего описания, так это то что Вы не правильно построили иерархию наследования. Если бы она была правильной подобных вопросов не возникало бы. Поэтому Вам стоит ее пересмотреть и заново обдумать
    Ответ написан
    Комментировать
  • Вопрос организации архитектуры. Производительность или поддерживаемость?

    qonand
    @qonand
    Software Engineer
    Не стоит зацикливаться на принципах и слепо им следовать. Выбирать между производительностью и поддерживаемостью всегда стоит исходя из особенностей проекта. Стоит задуматься насколько вообще важна поддерживаемость в конкретном проекте и насколько ее могут ухудшить решения улучшающие производительность. Если проект мелкий или разрабатывается как какое-то временное решение, тогда маловероятно что производительный код сильно ухудшить поддерживаемость. Если же проект большой и в будущем в него будут активно вноситься изменения - стоит предпочесть поддерживаемость производительности
    Ответ написан
    Комментировать
  • Формировать отчёт целиком и "на лету", или по мере прихода данных?

    qonand
    @qonand
    Software Engineer
    все зависит от проекта ... если у Вас небольшой проект с маленьким объемом данных (имею ввиду данные по которым нужно строить отчет) которым будут пользоваться пару юзеров - тогда проще всего строить отчет на лету.. Если же проект с большим объемом данным, которым постоянно будет пользоваться большое количество юзеров - тогда вполне уместно заранее формировать отчет в БД.
    Ответ написан
    Комментировать
  • В какой сущности хранить результаты игры?

    qonand
    @qonand
    Software Engineer
    Результат игры это часть информации о игре, а не пользователе. Результат игры в свою очередь состоит из информации о том сколько очков у каждого пользователя. Соответственно результат игры должен быть отдельной сущностью входящую в состав сущности "Игра"
    Ответ написан
    Комментировать
  • Как реализовать масштабируемую таблицу?

    qonand
    @qonand
    Software Engineer
    в случае использования реляционной базы можно использовать EAV-модель для хранения подобных данных, либо же переходить на NoSQL базу
    Ответ написан
    Комментировать
  • Как реализовать автопродление подписки?

    qonand
    @qonand
    Software Engineer
    По поводу сервисов google не скажу, но делать продление после завершения текущей подписки не очень хороший вариант. Есть риск что процесс продления задержится, либо произойдет какой-то сбой при ее продлении, а это соответственно приведет к тому что пользователь какое-то время не сможет юзать необходимый ему функционал. Поэтому лучше реализовывать продление подписки за ранее, скажем за 5-10 минут до момента окончания текущей подписки (соответственно делать это все через демон).
    Ответ написан
    Комментировать
  • Как спроектировать систему уведомлений (смс, почта и т.п.) для магазина?

    qonand
    @qonand
    Software Engineer
    1. Правильнее что бы за отложенные сообщения отвечал сам сервер очередей. Если конечно Ваш сервер очередей не поддерживает отложенные сообщения нужно "химичить", вот например одно из возможных решений для RabbitMQ.
    2. Думаю уместнее было бы разместить логику обработки параметров сообщения в хендлере
    3. Ну тут так и не ответить, нужно понимать какие параметры есть, а потом уже думать как их распределять. Но в общем случае что мешает сделать настройки параметров как в хендлере так и в сообщении?
    Ответ написан
    2 комментария
  • Какой подход для поиска лучше?

    qonand
    @qonand
    Software Engineer
    Лучше не изобретать велосипед и воспользоваться ElasticSearch или Sphinx
    Ответ написан
    8 комментариев
  • Как правильно использовать DTO в реальных проектах asp.net core WebAPI?

    qonand
    @qonand
    Software Engineer
    Другими словами: нужен ли еще один класс, реализующий IUser, используемый как DTO в работе самого WebAPI?

    В Вашей ситуации слой сервисов должен возвращать в WebApi DTO, но реализовывать его как IUser не стоит. Разделение системы на слои подразумевает что каждый слой может знать только о нижележащем слое (точнее о его интерфейсах). Если DTO, возвращаемое в WebAPI, будет реализовывать IUser относящийся к DAL произойдет нарушение порядка слоев, что как бы ни разу не тру.
    Получается 3 почти идентичных куска кода: IUser, User (DB), UserViewModel (WebApi).

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

    Есть немного другой путь: не использовать EntityFramework (вполне реальные кейсы), взять, например, Dapper. Там в классе User не будет атрибутов, он будет чистым DTO. И теоретически, мог бы использоваться в WebAPI, но тогда придется сделать прямую ссылку на Project.Data.Impl.

    Если User останеться в DAL - тогда проблема не решиться, у Вас по прежнему будет нарушение порядка слоев ...
    Ответ написан
  • Нужен ли слой с бизнес логикой?

    qonand
    @qonand
    Software Engineer
    Полностью согласен с Толстый Лорри и Arkadiy Parinov, от себя хотелось бы добавить
    Планировалось использовать все эти модули в проекте с API, а всю логику прописывать в контроллерах. Хорошая ли это идея?

    Это плохая идея которая противоречит MVC. Контроллер не должен содержать бизнес-логики, он должен лишь содержать логику обработки запроса пользователя и все.
    Или лучше создать отдельный проект, в котором будет описана вся бизнес логика, и в проекте с API использовать его?

    Нужно ли выносить бизнес-логику в отдельные проект или нет - зависит от того будет ли необходимо ее использование в других проектах или нет. Но вот изолировать слой бизнес-логики от UI-слоя и слоя доступа данных стоит однозначно
    Если создать отдельный проект для БЛ, то как быть с моделями? Получается, что будут модели БД, модели бизнес логики и модели, которые я буду отдавать/получать от пользователя в API.

    Почитайте про разбитие приложение на слои, DDD и эти вопросы отпадут сами по себе.
    Ответ написан
    Комментировать
  • Путь к ИТ архитектору?

    qonand
    @qonand
    Software Engineer
    Доброго времени суток. Я junior web developer. В данный момент пишу на php. Хочу спросить совета у опытных людей, как начинать двигаться в сторону ИТ архитектор

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

    qonand
    @qonand
    Software Engineer
    В случае с работкой игры имеет смысл делать тонкий клиент и толстый сервер. То есть стараться реализовывать максимум функционала на сервере, а клиент использовать только для визуализации
    Ответ написан
    3 комментария
  • YII2 Как создать гибкую модульную архитектуру?

    qonand
    @qonand
    Software Engineer
    Вы по моему не совсем правильно разделили Вашу систему на модули: Главная, О компании, Контакты - это обычные страницы сайта тут вопросов нет, но новости это не просто страницы - это отдельный модуль который может иметь свой специфический функционал - поиск, теги, лайки и т.п. Соответственно я бы Вам рекомендовал разделить эту задачу на два модуля:
    1. Модуль статического контента - который будет содержать информационные страницы сайта, такие как "о компании", "контакты" и т.п.
    2. Модуль новостей - содержащий собственно все новости
    Ответ написан
    6 комментариев
  • Какие есть хорошие практики автоматизации повтора действий завершившихся с ошибкой?

    qonand
    @qonand
    Software Engineer
    обычно для реализации повторных попыток в случае неудачного выполнения операции используется паттерн Retryer
    Ответ написан
    Комментировать
  • Как правильно спроектировать архитектуру сайта агентства недвижимости?

    qonand
    @qonand
    Software Engineer
    не совсем понятно - в вопросе идет речь именно о характеристиках категорий или о характеристиках объектов в рамках категорий?
    Но вообще тут нужно понимать насколько критичным для Вас является хранение этой информации в реляционной БД (какие ее преимущества Вам нужны?). Если использование реляционной БД не критично лучше перейти на документо-ориентированную базу данных. Если критично тогда у Вас есть следующие варианты:
    1. Использовать EAV
    2. Использовать одну таблицу для хранения всех объектов, отводя под каждое свойство отдельный столбец
    3. Использовать для объектов каждой категорию свою таблицу с перечнем свойств (но в таком случае придется динамически создавать/редактировать таблицы)
    Как по мне более правильным будет использование все-таки EAV
    Ответ написан
    3 комментария
  • Как грамотно спроектировать структуру приложения?

    qonand
    @qonand
    Software Engineer
    ох что-то Вы не понятное пытаетесь построить. Судя по вопросу у Вас набор паттернов а не архитектура. Что Вы хотите получить в итоге? слоенную архитектуру? так она так не строиться. DTO - это объект для передачи данных, он не хранит бизнес-логики, репозиторий и Active Record как правило не используются совместно. В общем судя из постановки задачи могу сказать что Вы не совсем понимаете как строить подобную архитектуру, поэтому рекомендую Вам вначале почитать про слоеную архитектуру (например у того же Фаулера), про модель предметной области, про DDD, а потом уже переходить к практике. Для начала можете пробежаться для начала по этим статьям:
    статья 1
    статья 2
    статья 3
    статья 4
    Ответ написан
    2 комментария
  • Как правильно соединить mvc и 3х слойную архитектуру?

    qonand
    @qonand
    Software Engineer
    Преподаватель требует для сдачи лабораторной реализовать в нем и объяснить 3х слойную арихитектуру

    а преподаватель объяснял как ее делать? может просто стоит перечитать конспекты?

    Я предположил что все модели моего приложения можно отнести к уровню доступа к данным

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

    А все контролеры к уровню бизнес-логики

    контроллер не имеет отношения к бизнес-логике. Контролер (согласно MVC) отвечает лишь за обработку запросов пользователей и все. Он не должен содержать ни бизнес-логики ни доступа к данным.

    Объяснить Вам как построить подобную архитектуру в рамках ответа на вопрос не получиться, так как тема довольно обширна, поэтому рекомендую изучить пару статей:
    статья 1
    статья 2
    статья 3
    Ответ написан
    Комментировать
  • Когда следует триггерить события ДО и ПОСЛЕ какого-то необратимого действия?

    qonand
    @qonand
    Software Engineer
    1. Генерацию события EVENT_AFTER_REMOVE стоит разместить сразу после коммита. Если размещать генерацию после блока try/catch может возникнуть ситуация когда в процессе удаления возник какой-то эксепшен, Вы его поймали и откатили транзакцию. Т.е. удаления по факту не произошло, а событие сгенерируется - это не совсем правильно
    2. Не стоит, подписчики должны сами обрабатывать ошибки
    Ответ написан
    Комментировать
  • Много составных индексов или один на много полей?

    qonand
    @qonand
    Software Engineer
    Что лучше дальше пытаться подобрать оптимальные варианты составных индексов,

    Здесь нужно знать меру, не стоит забывать - чем больше индексов тем больше будет места на сервере занимать база и тем медленнее будет производиться запись данных.
    или сделать один составной индекс сразу на 10 полей от А до G например?

    в этом случае индекс не будет использоваться, читайте как устроены индексы в MySQL ruhighload.com/post/%D0%A0%D0%B0%D0%B1%D0%BE%D1%82...

    вообще рекомендовал бы Вам посмотреть в сторону поисковых движков...
    Ответ написан