首页 > 解决方案 > 对单个对象执行更改的多动作方法是否有任何设计模式?

问题描述

让我解释一下我的意思:

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

所有的动作都是用 some 执行的Object,但可以放在不同的函数中。前 2-3 个方法的顺序确实很重要,其余方法的顺序 - 无关紧要。如果我将所有代码留在一个地方,我将获得一个庞大且非常难以维护的功能,而没有简单的流程逻辑。

目前,我在 + 事件订阅者中使用具有 2 个主要操作的解决方案,以便在所有订阅者所在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模式无关,这些动作有助于从状态 A 到状态 B的主要Object转换(例如:添加系统评论、添加系统支付交易、更改项目状态、发送通知等)。

标签: phpsymfony

解决方案


不确定是否完全是设计模式,但我的解决方案将接近您的解决方案。

我将定义新的类服务PerfomHugeActionService,这部分发生在“核心逻辑”,即转换(我喜欢为此使用Symfony 工作流组件)。在这里,我们执行从 A 到 B 的状态更改,在此转换之前/之后我们触发新事件并使用订阅者执行所有必需的副作用(添加评论,添加支付交易......)。

有了这个,您可以轻松地添加副作用的任何变化/使其进入队列并在后台处理等。

对于运行顺序 - 您可以为您的事件设置“优先级”,这将使其按顺序排列,解决前 2 个动作。Symfony EventDispatcher 已经支持事件的优先级


推荐阅读