Что такое методы доступа (accessor methods)?ruby-9

Основные понятия

Методы доступа — это специальные методы для чтения и изменения состояния объекта. В Ruby они обеспечивают контролируемый доступ к переменным экземпляра (@vars).

Типы методов доступа

1. Геттер

Позволяет читать значение переменной:

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

  # Геттер
  def name
    @name
  end
end

person = Person.new("Alice")
puts person.name # => "Alice"

2. Сеттер

Позволяет изменять значение переменной:

class Person
  # Сеттер (обратите внимание на =)
  def name=(new_name)
    @name = new_name
  end
end

person.name = "Bob" # Вызов сеттера

3. Аксессор

Объединяет геттер и сеттер:

class Person
  def name
    @name
  end

  def name=(new_name)
    @name = new_name
  end
end

Встроенные методы для генерации accessors

Ruby предоставляет удобные макросы для создания методов доступа:

attr_reader - создает только геттер

class Person
  attr_reader :name # Эквивалентно def name; @name; end
end

attr_writer - создает только сеттер

class Person
  attr_writer :name # Эквивалентно def name=(v); @name=v; end
end

attr_accessor - создает и геттер, и сеттер

class Person
  attr_accessor :name # Создает оба метода
end

Кастомные методы доступа

Вы можете добавлять логику в методы доступа:

class BankAccount
  attr_reader :balance

  def balance=(amount)
    raise "Balance can't be negative" if amount < 0
    @balance = amount
  end
end

Преимущества методов доступа

  1. Инкапсуляция: Скрывает внутреннее представление данных
  2. Валидация: Возможность проверки значений
  3. Гибкость: Можно изменить реализацию без изменения API
  4. Ленивая инициализация:
class DataStore
  def data
    @data ||= load_data # Инициализация при первом доступе
  end
end

Особенности Ruby accessors

  1. Вызов сеттера:

    person.name = "Alice" # Синтаксический сахар для person.name=("Alice")
    
  2. Массовое создание:

    attr_accessor :name, :age, :email
    
  3. Наследование:

    class Admin < Person
      attr_accessor :privileges # Добавляет к унаследованным
    end
    

Резюмируем

  1. Методы доступа обеспечивают контролируемый доступ к данным объекта
  2. Основные типы:
    • attr_reader — только чтение
    • attr_writer — только запись
    • attr_accessor — чтение и запись
  3. Можно создавать кастомные accessors с дополнительной логикой
  4. Всегда используйте accessors вместо прямого доступа к @vars
  5. Помните про инкапсуляцию — это основа ООП

Правильное использование методов доступа делает код:

  • Более безопасным
  • Легче для модификации
  • Более понятным для других разработчиков