在Ruby中定义访问者时,可能会在简洁(我们都爱)和最佳实践之间产生紧张关系。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方法?
**哪些工作可以完成**错!你的initialize()方法中的has_sauce是一个局部变量 - 不是一个实例变量。你甚至没有测试你的代码(它也有另一个错误)。 **我的意思是,如果我在未来的日期设置之前需要处理has_sauce,那么我可能需要做更多的重构,而不是重写访问器。**通过设置setter来设置实例变量是一种很好的做法,并且使用两个访问修饰符是实现只读实例变量的方法。 – 7stud 2014-08-29 17:45:26
未经测试的代码最深切的歉意,并很好的发现。现在修复,fwiw。另外,我很高兴你同意这是一个很好的做法,但是这种实现感觉有点不好意思。可能只是我。 – 2014-09-02 09:49:39