用于重命名对象的实例方法和setter方法之间有什么区别?

时间:2019-07-02 11:45:54

标签: ruby oop methods instance setter

如果我想在下面重命名我的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=的情况。因为在我看来,它们似乎是多余的。

1 个答案:

答案 0 :(得分:1)

#rename隐藏实施细节。您公开了一个清晰明确的接口-可以重命名一个对象,但是调用者不必关心它是如何完成的。我建议使用attr_reader :name而不是attr_accessor :name以避免暴露设置者。

如果仅公开#name=,则允许调用者更改对象内部。这可能会导致将来的更改更加困难(例如,如果将name移动到单独的对象)。