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

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Это нечто хаотичное и похожее на вентилятор, лежащий на столе.
    Это соединение сущностей связями без понимания процесса из телефонного разговора/чата.

    Просто ничего непонятно! Для чего пользователю с тонким клиентом путешествовать к толстому и обратно через 4-х кратную балансировку?!
    Ответ написан
  • Как в микросервисах ограничивать доступ на уровне сущностей?

    xmoonlight
    @xmoonlight Куратор тега Информационная безопасность
    https://sitecoder.blogspot.com
    1. Создайте общее "дерево" зависимостей сущностей (work-flow).
    2. Создайте роли для разных объектов (пользователей/групп/сервисов и т.д.).
    3. Создайте битовые ACL-"маски" для конкретных объектов и привяжите их к нужным узлам "дерева".
    4. Если нужно управлять доступами динамически: создайте доп."маски" доступов (service override ACL) и меняйте их конкретным сервисом.
    Ответ написан
  • Как не переборщить с желанием все спроектировать прежде чем писать код?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Проектирование даёт "карту самого быстрого наступления" к первому релизу.
    А именно: возможность грамотно спланировать весь процесс разработки и своевременно его корректировать (дополнять, реструктурировать архитектуру и т.д.): какие блоки сделать сейчас, какие можно доделать потом; что можно выполнять параллельно, а что - только последовательно и т.д.

    Здесь основные этапы проектирования, без которых сложные проекты не смогут долго существовать и поддерживаться.
    Ответ написан
  • Как правильно синхронизировать данные между клиентскими приложениями?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Если у Вас есть синхронизация на клиенте, то следует различать работу с базой и модификацию базы:
    1. Работа - это SELECT.
    2. Модификация - это всё остальное.

    При модификации: считайте логическую "разницу" между текущей и модифицированной локальной базой и сохраняйте в отложенный стек модифицирующих запросов (для запуска на центральной БД после отправки).

    Пример: Добавили запись и тут же её удалили - "разница" значимых данных равна нулю. Изменений в модифицирующих запросах - нет.

    После появления сети (или по тайм-ауту) - отправляйте все модифицирующие запросы на сервер центральной БД для их последующего запуска там.

    Перед модификацией очередных данных - проверяйте сразу конфликты между всеми клиентами (пришедшими стеками). При конфликте - берите стек самого последнего (нового по timestamp) клиента с модификацией этих данных.

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

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Или под каждого создается своя база данных, но исполнительный код php и дизайна лежит в одном месте и все пользователи пользуются им.
    Именно так и никак иначе.
    Ответ написан
  • Какие существуют подходы для загрузки файлов к посту, до того как пост создан?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Создание поста - это как транзакция: в 3 этапа.
    1-й этап: это создание "контейнера" публикации и наполнение всей нужной информацией (текст, картинки, ролики, код и т.д.)
    2-й этап: это сохранение текущей актуальной версии и добавление предыдущей к архиву изменений (версионность)
    3-й этап: публикация для всех - релиз поста.
    Ответ написан
  • Какой стек технологий выбрать для такого сайта?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    1. Ранжирование по горячести - сортировка отношений общего количества просмотров за прошедший промежуток времени.
    2. Выборка для наполнения ленты пользователя - выборка ID-постов по пользовательским предпочтениям вместе с нужным ранжированием.
    3. Отображение ленты - это п.2 + таблица прочитанных ID-постов конкретным пользователем (для исключения уже прочитанных).
    Ответ написан
  • Как сделать товары с разными характеристиками и ценой?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Такой вид товарного предложения называется "вариативное товарное предложение".

    1. Создаётся унифицированный товар, как дополнительный подраздел в нужной категории товаров и, желательно, помечается флагом "унифицированный товар".
    2. Создаются все доступные к приобретению варианты сочетаний, как отдельные товарные предложения.
    3. В скобках наименования указываем все параметры попарно через двоеточие с разделением точки с запятой.
    Пример: Портативный SSD (объем:128Gb;цвет:красный)
    4. Затем, в эту категорию помещаются все созданные сочетания товарных предложений.
    5. При отображении товара из категории "унифицированный товар" (или, если есть в наименовании товара двоеточие в скобках) - определяем, что товар - вариативный.
    6. Если это так - делаем выборку, предварительно исключив скобки (или проще: все товары этой категории) из БД.
    7. Если таких товаров несколько - отображаем варианты для выбора.
    8. При изменении одного из вариативных параметров пользователем - меняем товар через ajax (или полностью перегружаем страницу, что хуже...)

    Еще раз, повторюсь: если пометить категорию в п.1 не представляется возможным, можно просто ориентироваться на скобки и двоеточие, и создавать селекторы по этим признакам.

    ----------

    Если делаете с нуля, всё просто:
    1. Добавляете к разделу флаговое поле в БД: "вариативный товар"
    2. Добавляете отдельную таблицу вариативных характеристик, в которой присутствуют связки:
    ID раздела "вариативный товар", ID одной характеристики товара, тип поля (лучше ID поля и доп.таблицу, канешн, но не так критично, если вариантов не много)
    3. Если товаров из нужного вариативного раздела с такими характеристиками у нас несколько - отображаем выбор параметров.
    4. см. п.8 (из предыдущего раздела)
    Ответ написан
  • Что должен знать системный архитектор?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Чтобы быть системным архитектором, нужно иметь за плечами большой опыт не только в написании кода, но и владеть знаниями различных интеграционных технологий.
    Архитектор строит комплексную систему с полным пониманием требуемых нужных архитектурных блоков и информационного обмена между ними. Архитектор также рассчитывает нагрузку на эти блоки и каналы передачи данных, прогнозирует максимальные характеристики без масштабирования и закладывает архитектуру масштабирования такой системы на следующий этап развития.

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

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Как я понял: речь про баланс: контроль игрового мира <-> объём передаваемых данных по сети.
    Вопрос хороший.
    Не всегда нужно делать всё на сервере, иначе объём трафика - возрастёт дико во время игры. Но также, нельзя доверять клиентским данным.
    Поэтому, всегда делается аппроксимация: промежуточная визуализация - вычисляется на клиенте, а пришедшие на сервер данные - всегда тщательно проверяются сервером в рамках логики(модели) работы игрового мира. И если отклонения слишком велики - фиксируется "читерство", иначе - по получению новых позиций объектов, клиент плавно, но с ускорением ("параболически") устраняет расхождения с серверным игровым миром: синхронизирует актуальное состояние мира сервера с отображаемым пользователю.
    Это происходит в 99% случаев незаметно для глаз игрока за монитором.

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

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Дерево зависимостей: USER => Роль (Role/"User type") => Права доступа (ACL)

    Создадим 2 колонки в таблице аккаунтов: Role и ACL.

    1. Role в таблице аккаунта (на основе битовой маски / набор на основе степеней "2"-ки):
    0 - public
    1 - guest
    2 - user
    4 - editor
    8 - ...
    65536 - SUPER USER / SUPER ADMIN

    2. ACL в таблице аккаунта (на основе битовой маски / набор на основе степеней "2"-ки):
    0 - нет доступа никуда
    1 - доступ к 1-му разделу
    2 - доступ ко 2-му разделу
    4 -
    8 -
    ....

    Теперь, складываем:
    ACL: 1 = 1 => доступ к 1-у разделу.
    ACL: 1+2 = 3 => доступ к 1-у и 2-му разделу.
    Ответ написан
  • Сложная бизнес-логика. Как всё учесть?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    - есть около 20 сущностей (корабль, флот, пользователь...)
    - 50 типов запросов от пользователей (модернизировать корабль, создать флот...)
    - 5 realtime обработчиков (полёты, бои, добыча...).
    По пунктам:
    1. сущность = существительное
    2. свойства объекта = прилагательное
    3. тип запроса на действие к объекту = действие/глагол
    4. real-time обработчик = триггер/heart-beat/time-tracker

    Теперь, чтобы добавить что-то новое, просто используйте наследование объекта нужного архитектурного паттерна проектирования связей, созданного заранее.
    Ответ написан
  • Какую связку технологий выбрать для реализации проекта с 5000 онлайном?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Если Вы думаете, что всё там в Real-Time - это заблуждение.
    Командами с клиента - Вы лишь отдаёте изменение состояний серверу.
    А время - оно одинаково течёт и на сервере и на клиенте.
    Поэтому просто стоит привязка к таймеру и синхронизация времени и получение/обновление новых событий время от времени.

    Всё развитие - это изменение значений во времени по определённым правилам, что автоматически означает, что это не online-шуттер или аркада, где от постоянного изменения координат зависит состояния других объектов за короткий промежуток времени.
    Такое - потянет даже самый слабый хостинг, т.к. это просто POST-запросы к серверному API для обмена данными в формате json (например).

    Серверное API проще всего сделать на простом PHP.
    Конечно, можно сделать и на WebSocket, но для такого типа игр - это overwork.
    Ответ написан
  • Как документировать поля форм (в т.ч. валидацию, логику), api, БД?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Все эти поля связаны кучерявой логикой.
    Возможно руки растут так
    Улыбчиво)))

    Идите от роли:
    Роль/объект в системе (или класс) - это будет существительное => сущность в БД (товар, пользователь, статья/публикация, комментарий и т.д.).
    Свойства роли (или свойства объекта класса) - это прилагательное => свойства сущности в БД (цвет, вес и т.д.).
    Манипулятор (возможные действия роли/объекта; методы объекта класса) - это глагол => таблица Activity сущности в БД.

    Затем - делаете обычное документирование этих классов (оно же API).

    Всё, что у Вас в находится в полях форм в различные моменты времени - это частный случай взаимодействия объектов классов и/или других вспомогательных блоков.
    Поэтому, каждая форма - документируется в виде перечня параметров с указанием типа поля и класса со свойством для каждого поля формы.
    А вот переходы между формами - уже оформляются как схема бизнес-процесса.
    Ответ написан
  • В каком месте MVC-концепции веб-приложения нужно фильтровать HTML-спецсимволы?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    В этом месте:
    на представлении при вставке текста в HTML;

    Аргументация: потому, что данные могут быть абсолютно любыми и их нужно обработать, а проблема может возникнуть только при выводе в браузере пользователя.

    Если более детально: вот схема. (блоки "Подготовка выходных данных модуля" и "Подготовка выходных данных приложения")
    Ответ написан
  • Как избавиться от привычки усложнять задачу?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Делите на базовый и расширенный функционал.
    Базовый - это тот минимум, без которого невозможно пользоваться системой.
    Расширенный - то, что можно "навесить" после запуска основного.
    Ответ написан
  • Как правильно строить архитектуру PHP сайта?

    xmoonlight
    @xmoonlight Куратор тега PHP
    https://sitecoder.blogspot.com
    я останавливаюсь на простой ошибке и сижу над ней полдня, как это исправить?
    Варианта 3:
    1. Вы не понимаете английский язык
    2. Вы не понимаете терминов, выводящихся в ошибке из-за слабых знаний языка.
    3. Вы не понимаете логики работы своего же кода.
    Нужно устранять эти "пробелы" через понимание и запоминание.

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