如何避免到处传递上下文对象?

Bor*_*lov 5 php oop design-patterns

可能的重复:
依赖地狱 - 如何将依赖关系传递给深度嵌套的对象

最近我一直在为这个特殊问题而苦苦挣扎。出于测试和管理的原因,我认为向需要它的人注入像 $config 这样的对象将是一个更好的选择。虽然一开始还好,但后来就开始污染代码了。例如:对象A使用对象B来完成其工作,对象B使用策略对象C,对象C使用对象D,这需要$config对象。所以,我必须继续将 $config 传递到整个链中

在我的代码中,我有两个这样的对象要传递,这使得构造函数很大,有重复的代码,而且通常味道不对。如果您能帮助重构这种关系,我将不胜感激。

Seb*_*ach 2

而不是(伪代码作为一般建议)...

config <-- ...

A.constructor (config) {
   this.foo = config.foo
   this.bar = config.bar
   this.objectB = createB (config)
}

B.constructor (config) {
   this.frob = config.frob
   this.objectC = createC (config)
}

C.constructor (config) {
   this.frobnicate = config.frobnicate
   this.objectD = createC (configD)
}
Run Code Online (Sandbox Code Playgroud)

你应该只传递真正需要的内容:

config <-- ...

A.constructor (foo, bar, frob, frobnicate) {
   this.foo = foo
   this.bar = bar
   this.objectB = createB (frob, frobnicate)
}

B.constructor (frob, frobnicate) {
   this.frob = frob
   this.objectC = createC (frobnicate)
}

C.constructor (frobnicate) {
   this.frobnicate = frobnicate
}
Run Code Online (Sandbox Code Playgroud)

让您所在的州尽可能本地化。全局状态是无限数量的调试恐怖场景的根源(正如我闻到你刚刚遇到的那样)。

或者,许多类不必知道它们的对象是什么样子,它们只对公共接口感兴趣。您可以应用依赖倒置,然后:

config <-- ...
objectC = createC (config.frobnicate)
objectB = createB (config.frob, objectC)
objectA = createA (config.foo, config.bar, objectB)
Run Code Online (Sandbox Code Playgroud)

使用依赖倒置意味着您的类不再需要了解太多信息。例如, aCar不需要知道Trailer及其组成,它只需要知道CouplingDevice

trailer        = createTrailer (...)
couplingDevice = createCouplingDevice (...)

car.install (couplingDevice)

couplingDevice.attach (trailer)
Run Code Online (Sandbox Code Playgroud)

  • 除非上面的伪代码代表工厂或构建器,否则协作者不应创建自己的依赖项。另外,在 ctor 中工作会产生代码味道。 (2认同)