В чем разница между методом экземпляра, который используется для переименования объекта, и методом установки? - PullRequest
1 голос
/ 02 июля 2019

Если я хочу переименовать мой jedi объект ниже, зачем мне создавать экземплярный метод с именем rename, который использует метод setter name=?Почему бы просто не использовать метод сеттера `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

Оба кодафрагменты выше делают то же самое, поэтому мне интересно, есть ли ситуация, когда было бы полезно иметь метод экземпляра rename в дополнение к методу сеттера name=.Потому что мне кажется, что они излишни.

1 Ответ

1 голос
/ 02 июля 2019

#rename скрывает детали реализации. Вы предоставляете чистый и явный интерфейс - объект может быть переименован, но вызывающему не нужно заботиться о том, как это делается. Я бы рекомендовал использовать attr_reader :name вместо attr_accessor :name, чтобы избежать воздействия на сеттер.

Если вы выставляете только #name=, вы позволяете вызывающей стороне изменять внутренние объекты. Это может вызвать более серьезные изменения в будущем (например, если вы переместите name на отдельный объект).

...