Задать вопрос
Ответы пользователя по тегу PHP
  • Где хранить данные об уровне доступа пользователя, в Сессии или в Базе данных?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    Как правило, информацию о доступе пользователя проверяют каждый раз при поступлении от него нового запроса. Делается это из-за того, что с момента предыдущего запроса пользователя могли блокировать, или изменить его права. Если хранить информацию об уровне доступа в сессии, то до её истечения заблокированный пользователь будет продолжать пользоваться всеми разрешениями, которые у него были на момент начала сессии. А при умелом пользовании запросами сессия может жить очень долго )))
    Ответ написан
    1 комментарий
  • Как правильно хранить большие объекты с вложенными сущностями?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    Очень похоже на многомерный куб. Смотрите в сторону OLAP и, соответственно, в сторону схемы БД "звезда". Хотя, в Вашем случае может быть более приемлемой "снежинка".
    Создаёте одну таблицу объектов со сложным ключом, содержащим поля со ссылками на таблицы измерений. Измерения - это расположение, оферы, коммуникации и т.п. Нормализация пострадает, увеличатся затраты на регистрацию/изменение/удаление объекта, но анализ в таком кубе будет идти оптимальнее.
    Ответ написан
    Комментировать
  • Передача параметров в конструктор аргументами функции или массивом?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    Массив используется там, где нужна гибкость. Т.е. там, где разработчик не может предугадать, сколько параметров придёт при вызове метода, какие типы данных будут иметь передаваемые значения и т.п. За такую гибкость разработчик должен платить, создавая код обработки массива, что может быть весьма нетривиальной задачей. Кроме трудоёмкости и сложности кода получите ещё и потерю производительности. Излишней гибкости следует избегать.

    В общем случае лучше передавать либо несколько параметров, либо строго типизированный объект с заданными полями. Причём при передаче большого количества параметров тоже могут быть просадки с производительностью.
    Ответ написан
  • Где можно использовать паттерн observer?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    В одной нашей системе используется событийная модель. События возникают при:
    - запуске, останове или иных изменениях состояния приложения/сервиса;
    - запуске, останове и завершении каждого этапа бизнес-процессов;
    - исключениях;
    - приходе данных из внешних систем;
    - действиях пользователей или поступлении запросов к внешнему API;
    - и т.п.

    На события подписываются несколько наблюдателей: логгеры (журналирование в файл/БД/system event log), агент системы мониторинга (контролирует работоспособность системы), контроль состояния бизнес-процессов и другие. Каждый наблюдатель реагирует на свой набор событий, состав которых определяется настройками. Например, в файл логируются все события, а в event log - только критические ошибки и важные события. Наблюдателей можно отключать (например, можно отключить отсылку уведомлений на почту администраторам или в систему мониторинга), настраивать (менять размещение и название файла журнала, например) и т.д.

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

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    Я отношусь к паттернам проще. Паттерн - это некий компонент архитектуры (логической, физической, поведения и т.п.), который я как архитектор могу многократно применять при работе над архитектурой системы. Есть компоненты, которые известны всем, и есть те, которые нужны только мне вследствие специфики разрабатываемых мной систем. Я могу объединять неколько паттернов в один, могу дорабатывать существующий паттерн до нужной мне кондиции, могу что-то сделать совсем своё.

    Некоторые из общеизвестных Вы перечислили. Ещё можно посмотреть, например, здесь: Catalog of Patterns of Enterprise Application Arch.... Возможно, многие из этих паттернов Вы тоже используете, только не называли их в своём вопросе. Но со временем, возможно, у Вас накопятся собственные наработки.
    Ответ написан
    Комментировать
  • Как бороться с тем, что клиент не узнает о смене состояния сервера из-за таймаута?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    Ещё как вариант рассмотрите возможность асинхронного выполнения операций на сервере. Нужно организовать два-три метода в API. Первый метод запускает процесс изменения состояния (с валидацией текущего состояния и возможности его изменения) и не требует обязательного возврата результата. Второй метод (не обязательный) возвращает прогресс изменения состояния сервера. Третий - возвращает результат - текущее состояние сервера. В этом случае даже если на один из запросов не придёт ответа, клиент может запрос повторить.
    Ответ написан
    Комментировать
  • Как избавится от дублирования кода?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    Я бы создал класс AbstractClass, чтобы CommonClass и ConcreteClass1 наследовались от него. ConcreteClass2 должен наследоваться от ConcreteClass1. В AbstractClass вынес бы из CommonClass те члены, которые должны быть общими для всех классов. Всё.
    Ответ написан
    Комментировать
  • Как получить доступ к объекту А содержащего объект Б из объекта Б?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    Всё просто. Делаете класс для объекта А. Затем - класс для объекта Б. В классе Б объявляете поле a типа А. В классе А - поле b типа Б. Изначально при создании экземпляра класса А ссылка на объект класса Б в поле b будет пустой (null). При создании экземпляра класса Б его поле a со ссылкой на объект класса А тоже будет содержать пустое значение null. Пусть для объекта А задан метод Link, который в качестве параметра получает ссылку на объект класса Б. Внутри этого метода можно присвоить полю A.b указанную ссылку на объект Б, а затем полю Б.а можно присвоить ссылку на объект А, метод Link которого был вызван.

    Объект Б можно создавать в конструкторе объекта А, тогда там же задавайте значения полям.

    Аналогично, можно в классе А задать поле типа массив объектов Б. При внесении нового объекта в массив можно задавать ссылку на А в поле Б.a.
    Ответ написан
    Комментировать
  • С чего начинать проектировать приложение?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    Предположим, что с будущей функциональностью Вы определились. Тогда Вы точно знаете, кто или что будет поставлять данные, и кто/что будет их потреблять.

    Теперь выясните, кто будет обращаться к вашей системе, чтобы передать или забрать данные, а к чему будет обращаться Ваша программа. Те системы или пользователи, которые обращаются к программе сами, нарисуйте схематически на листе бумаги вверху. Те, к которым будет обращаться программа (включая БД), - снизу.

    Теперь нарисуйте под каждым нарисованным сверху субъектом прямоугольник с названием UI или API - это интерфейсы, к которым будет обращаться пользователь или внешняя управляющая система. Иногда UI тоже может обращаться к API. Объедините все прямоугольники с UI одним контуром и обзовите слоем UI. Объедините все прямоугольники с API и обзовите слоем сервисов.

    Для систем, нарисованных снизу, укажите компоненты, которые будут отвечать за доступ к этим системам. Объедините все эти компоненты одним контуром и обзовите слоем доступа к данным.

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

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

    Получите логическую архитектуру. Разбросайте слои по серверам - получите физическую архитектуру.

    А дальше - детально прорабатывайте каждый маленький квадратик. Всё.
    Ответ написан
    2 комментария