如果我想在下面重命名我的jedi
对象,为什么我要创建一个使用设置方法rename
的名为name=
的实例方法?为什么不直接使用setter方法“ name =”?
为什么这样做:
class Skywalker
attr_accessor :name
def initialize(name)
@name = name
end
def rename(new_name)
self.name = new_name
end
end
jedi = Skywalker.new('Anakin')
puts jedi.name
jedi.rename('Luke')
puts jedi.name
什么时候可以做:
class Skywalker
attr_accessor :name
def initialize(name)
@name = name
end
end
jedi = Skywalker.new('Anakin')
puts jedi.name
jedi.name = 'Luke'
puts jedi.name
以上两个代码段都具有相同的功能,因此我想知道是否存在除setter方法rename
之外还具有实例方法name=
的情况。因为在我看来,它们似乎是多余的。
答案 0 :(得分:1)
#rename
隐藏实施细节。您公开了一个清晰明确的接口-可以重命名一个对象,但是调用者不必关心它是如何完成的。我建议使用attr_reader :name
而不是attr_accessor :name
以避免暴露设置者。
如果仅公开#name=
,则允许调用者更改对象内部。这可能会导致将来的更改更加困难(例如,如果将name
移动到单独的对象)。