Недавно я начал замечать тенденцию определения приватных attr_accessor в коде Ruby и, честно говоря, рассматриваю их как артефакт других языков программирования. Это то, что последовало за разработчиком после того, как они перешли на использование Ruby.

Когда-то, когда я изучал объектно-ориентированное программирование с использованием Java, меня учили определять частный геттер и сеттер для класса. В конце концов, это имеет смысл в языке с очень строгой типизацией, таком как Java, поскольку вам может потребоваться перегрузить сеттеры для приведения типов для каждого типа ожидаемого аргумента.

Однако, поскольку Ruby не является строго типизированным, а перегрузка методов в Ruby не является чем-то особенным, я не думаю, что необходимо иметь приватный attr_accessor.

Рассмотрим этот простой пример:

class Person
  def initialize(name)
    self.name = name
  end
  private
    attr_accessor :name
end

Нет никакой разницы между приведенным выше примером и приведенным ниже примером, в котором просто используется переменная экземпляра:

class Person
  def initialize(name)
    @name = name
  end
end

Не кажется ли вам, что вторая версия также выглядит более чистой и лаконичной?

Я считаю, что пришло время остановить эту частную attr_accessor тенденцию и просто получить доступ к переменной экземпляра в классе так, как это задумано.

  1. Я думаю, что если вам нужна логика для приведения или преобразования значения, вполне нормально определить частный сеттер. Полностью прекратив использование простого сеттера, вы на самом деле избавите себя от необходимости проверять свой код, если сеттер на самом деле простой или имеет дополнительную логику. Если вы увидите присваивание переменной экземпляра, вы сразу поймете, что это простое присваивание!
  2. Я знаю, что сейчас вы можете делать private attr_accessor :name на Ruby. Однако весьма вероятно, что в этом классе у вас будут и другие приватные методы, которые вы обычно переключаете на тип объявления begin-here.