用于重命名对象的实例方法和 setter 方法有什么区别?
What is the difference between an instance method used to rename an object and a setter method?
如果我想在下面重命名我的 jedi
对象,为什么我要创建一个名为 rename
的实例方法,它使用 setter 方法 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
实例方法 rename
是否有用 name=
。因为在我看来它们是多余的。
#rename
隐藏了实现细节。您公开了一个干净明确的接口——一个对象可以重命名,但调用者不必关心它是如何完成的。我建议使用 attr_reader :name
而不是 attr_accessor :name
以避免暴露 setter.
如果您只公开 #name=
,您可以让调用者更改对象内部结构。这可能会导致未来的变化更加困难(例如,如果您将 name
移动到一个单独的对象)。
如果我想在下面重命名我的 jedi
对象,为什么我要创建一个名为 rename
的实例方法,它使用 setter 方法 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
实例方法 rename
是否有用 name=
。因为在我看来它们是多余的。
#rename
隐藏了实现细节。您公开了一个干净明确的接口——一个对象可以重命名,但调用者不必关心它是如何完成的。我建议使用 attr_reader :name
而不是 attr_accessor :name
以避免暴露 setter.
如果您只公开 #name=
,您可以让调用者更改对象内部结构。这可能会导致未来的变化更加困难(例如,如果您将 name
移动到一个单独的对象)。