从 mixin 方法中引用扩展对象上的访问器是否被认为是不好的做法?一个简单的例子:
module WindInstrument
def play
mouthpiece.blow #requires a mouthpiece
end
end
class Saxophone
attr_reader :mouthpiece
def initialize
@mouthpiece = Mouthpiece.new
end
include WindInstrument
end
Saxophone.new.play
在这种情况下,我实际上只是将喉舌的需求直接移至 WindInstrument 模块,但在更复杂的场景中,访问器真正存在于扩展对象上才有意义呢?这只是一个不适当的关注点分离问题吗?
Mixin 对于添加不需要了解扩展对象状态的封装行为很有用。事实上,我的直觉告诉我,mixin 不应该了解任何状态。如果它需要状态知识,我通常会选择以下两种选择之一:
将状态放在一个类中,并通过组合而不是通过继承层次结构添加它。我的问题是,我知道rubyists 正在创建访问状态的 mixin,这使得设计更具可读性,如果不那么直观(对我来说)。
将喉舌作为参数传递给模块。甚至我都可以看出这似乎使设计变得混乱,并且在红宝石世界观中感觉像是可憎的。
这段代码会打扰其他人吗?我知道那里有很多聪明的人在使用 ruby,所以我认为问题出在我的身上。我错过了什么?我只需要冷静一下吗?你会怎么做?