2

我已经开始在我的新工作中与装饰师一起工作,并且发现他们真的很有帮助。我正在为我们的一位装饰师编写规范,并想知道是否有可能做到这一点......

设置(精简版):

我们有一个有两个孩子的主要对象。

 Main
 / \
A   B

当 Main 被装饰时,我们也装饰 B,但我们必须将 A 作为上下文传递。A 用于 B 的一些装饰器方法,但如上所述将 A 与 B 分开更合乎逻辑。

# in MainDecorator    
BDecorator.new(B, context: {a: A}) # all good

有时我们自己装饰 B(不通过 Main),过去我们忘记将 A 作为上下文传递。我们总是能抓住它,但一直打下去是个烦人的问题。

B.decorate # no context -> :(

问题:

是否可以验证 A 在 B 的装饰器中作为上下文传递?你能有一个装饰器验证器吗?

(我们考虑过让 A 成为 B 的子节点,但这对我们的应用程序没有意义。我同意它会起作用,但这不是我们想要的。)

4

1 回答 1

2

您可以重写初始化程序以验证上下文是否已传递:

class BDecorator
  def initialize(obj, options = {})
    raise "Must pass context" unless options.key? :context
    super
  end
end
于 2013-07-26T07:09:31.710 回答