最近我一直在阅读"Ruby中的实用面向对象设计",我注意到最好的做法之一是使用访问器方法而不是直接抓取@instance_variable.例如:
class Foo
attr_accessor :bar
def initialize(my_argument)
@bar = my_argument
end
# bad
# def lorem_ipsum
# @bar * 999
# end
# good
def lorem_ipsum
bar * 999
end
end
Run Code Online (Sandbox Code Playgroud)
将事情保持干燥是有道理的,并且,如果我需要@bar在实际获取其价值之前以某种方式处理.但是,我注意到该initialize方法@bar直接设置实例变量的值:
class Foo
attr_accessor :bar
def initialize(my_argument)
@bar = my_argument #<-- why isn't self.bar = my_argument used here?
end
Run Code Online (Sandbox Code Playgroud)
是否有一个原因?是不是应该使用setter方法而不是直接使用=运算符来设置实例变量的值?
你是对的,这样做会更有意义
class Foo
attr_accessor :bar
def initialize(my_argument)
self.bar = my_argument
end
end
Run Code Online (Sandbox Code Playgroud)
不同的参数,你是否应该尊重封装内的对象本身或没有,但如果你相信这一点,那么,是的,你应该这样做.