gpt4 book ai didi

ruby - rubyists 是否从 mixin 中引用访问器?

转载 作者:数据小太阳 更新时间:2023-10-29 07:38:36 26 4
gpt4 key购买 nike

从混合方法中引用扩展对象的访问器是否被认为是不好的做法?一个简单的例子:

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 不应该知道任何状态。如果它需要了解状态,我通常会退回到以下两种选择之一:

  • 将状态放在一个类中,并通过组合添加它,而不是通过继承层次结构。我对此的问题是我了解 ruby​​ists有创建访问状态的 mixin,这使得设计更具可读性,但(对我而言)不太直观。

  • 将喉舌作为参数传递给模块。即使我也能看出这似乎使设计变得困惑,并且感觉像是 ruby​​ 世界观中的可憎行为。

这段代码会打扰其他人吗?我知道有很多聪明人在那里使用 ruby​​,所以我认为问题出在我身上。我错过了什么?我只需要放松一下吗? 会做什么?

最佳答案

我认为这与猴子修补相同:可以这样做,但是您必须首先确保没有其他选择(即您不能使用您的接口(interface)修改类),其次,您必须对此非常明确(确保文档、评论和界面提到 this our that 方法是必需的并且将被调用)并且如果不是则抛出有用的错误消息

关于ruby - rubyists 是否从 mixin 中引用访问器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4937514/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com