Есть ли шаблон проектирования для метода с несколькими действиями, выполняющего изменения одного объекта? - PullRequest
0 голосов
/ 24 мая 2018

Позвольте мне объяснить, что я имею в виду:

function hugeAction(...) {
   ... perform sub-action 1
   ... perform sub-action 2
   ... perform sub-action 3
   ... perform sub-action 4
   ... perform sub-action 5
}

Все действия выполняются с некоторыми Object, но могут быть помещены в различные функции.Порядок первых 2-3 методов имеет значение, порядок оставшихся методов - не имеет значения.Если я оставлю весь код в одном месте, я получу огромную и довольно сложную для обслуживания функцию с непростой логикой процесса.

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

Пример:

function hugeAction(...) {
  ... perform action 1
  ... perform action 2
  ... dispatch event XXX
}

class SubscriberXXX extends YYY {
  function performHugeActionPart3() { ... }
  function performHugeActionPart4() { ... }
  function performHugeActionPart5() { ... }
}

Чего я боюсь, так это того, что через некоторое время это решение ответит мне ... любые изменения в подписчике или добавленные дополнительные действия приведут меня в ситуацию, когда мне нужно будет запомнить всеструктура системы и то, как hugeAction() выполняет и обрабатывает один Object.

Позвольте мне также упомянуть, что все эти действия не связаны с Factory / Builder -шаблонами, этими действиями. help основной Object переход из состояния A в состояние B (пример: добавить системный комментарий, добавить системную платежную транзакцию, изменить статус проекта, отправить уведомление и т. Д.).

1 Ответ

0 голосов
/ 24 мая 2018

Не уверен, точно ли шаблон проектирования, но мое решение будет близко к вашему.

Я определю новый класс обслуживания PerfomHugeActionService, у меня в этой части происходит "ядро логики", какой переход (мне нравитсядля этого используйте компонент рабочего процесса Symfony ).Здесь мы выполняем изменение состояния с A на B, до / после этого перехода мы запускаем новое событие и используем подписчика для выполнения всех необходимых побочных эффектов (добавление комментария, добавление платежной транзакции ...).

С этимВы можете легко добавить любую вариацию побочных эффектов / превратить ее в очередь и обработать в фоновом режиме и т. д.

Для порядка выполнения - Вы можете иметь «приоритет» для ваших событий, который превратится в порядок, решая первые 2 действия, Symfony EventDispatcher уже поддерживает приоритет для событий .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...