在 Ruby 中定义访问器时,简洁(我们都喜欢)和最佳实践之间可能存在矛盾。
例如,如果我想在实例上公开一个值但禁止任何外部对象更新它,我可以执行以下操作:
class Pancake
attr_reader :has_sauce
def initialize(toppings)
sauces = [:maple, :butterscotch]
@has_sauce = toppings.size != (toppings - sauces).size
...
但是突然间我使用了一个原始的实例变量,这让我抽搐。我的意思是,如果我需要在设置未来日期之前处理 has_sauce,我可能需要做更多的重构,而不仅仅是覆盖访问器。来吧,原始实例变量?布莱赫。
我可以忽略这个问题并使用attr_accessor
. 我的意思是,如果他们真的想,任何人都可以设置属性;毕竟,这是 Ruby。但是后来我失去了数据封装的想法,对象的接口定义不太好,系统可能更加混乱。
另一种解决方案是在不同的访问修饰符下定义一对访问器:
class Pancake
attr_reader :has_sauce
private
attr_writer :has_sauce
public
def initialize(toppings)
sauces = [:maple, :butterscotch]
self.has_sauce = toppings.size != (toppings - sauces).size
end
end
这可以完成工作,但对于一个简单的访问器来说,这是一个样板文件,坦率地说:ew。
那么有没有更好、更 Ruby 的方式呢?