【发布时间】:2010-08-07 17:34:52
【问题描述】:
我有一个设计问题,我找不到干净又好的解决方案。我正在使用 PHP 进行开发,但我相信这可能会出现在任何语言中。我的基本问题是我有两个在某种间接级别上具有循环相互依赖关系的对象。这意味着我有一个实现 Facade 模式的类(称为 F),它包含一个(B 类的)对象,该对象本身需要创建 A 类的对象。类 A 的构造函数本身需要创建一个外观 F => 我有对象的循环相互依赖。
我相信我无法解决循环相互依赖(对象基本上实现了一个有限状态机,并使用状态模式进行循环),所以我正在寻找一个干净的解决方案。我自己提出了两种可能的解决方案,但我认为任何一种都不是特别优雅:
让类 A 实现一个 setFacade(F $facace) 方法并从构造函数中移除整个外观,并在创建 A 和外观之后设置它。 A 类的对象在没有外观的情况下无法工作,因此这实际上会创建一个 A 类的对象,该对象在调用 setFacade 之前无法执行任何操作,它会减少封装并允许在对象运行时替换外观,我也没有'不喜欢。
实现类似 Promise 的东西,它传递给 A 而不是外观,它稍后将能够在创建外观后立即解析它。我不喜欢介绍这个额外的间接层,特别是因为我没有比在 A 内部处理业务逻辑的方法中真正解决承诺的好地方,这可能 a) 产生可怕的错误并且(更重要的是)b) 需要每当调用业务逻辑时,我检查承诺是否已经解决,或者我现在是否需要解决它。在我看来,这只是糟糕的设计。
因此,如果有人能提出更好的解决方案,或者可以用一个好的论据来支持我的一种可能的解决方案,我真的很高兴。
【问题讨论】:
-
这似乎违反了 GRASP 模式。您可能在将职责分配给类时犯了一些错误。
-
这当然是可能的。正如我所说,我基本上是在实现一个有限状态机。我有一个保存当前状态的控制器(上下文)。每当控制器收到请求时,它会将其委托给状态,然后状态将返回自身(如果它是循环状态转移)或另一个状态(如果转移)。该“其他状态”必须为该州所知。如果两个状态以循环方式转移到另一个状态(这在 FSM 中绝对常见),它们将需要了解彼此的实例。 Bam - 循环依赖。
标签: php design-patterns oop object