Що таке інкапсуляція в Ruby?

Інкапсуляція в Ruby - це один з ключових принципів об’єктно-орієнтованого програмування, який полягає в тому, щоб приховати внутрішню реалізацію об’єкта від зовнішнього світу та надати доступ до даних лише через інтерфейси (методи), що контролюються.

У Ruby інкапсуляція досягається за допомогою використання методів доступу (getter і setter) та застосування обмежень доступу до змінних класу.

Використання getter і setter методів. В Ruby ви можете визначити спеціальні методи для отримання (getter) та встановлення (setter) значень змінних об’єкта. Наприклад:

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

  # Getter метод
  def name
    @name
  end

  # Setter метод
  def name=(new_name)
    @name = new_name
  end
end

person = Person.new("John")
puts person.name # Виведе "John"
person.name = "Alice"
puts person.name # Виведе "Alice"

Використання атрибутів. В Ruby ви також можете використовувати ключове слово [attr_accessor](https://rubydevelopers.org/t/attr-accessor/72) , [attr_reader](https://rubydevelopers.org/t/attr-reader/70) , або [attr_writer](https://rubydevelopers.org/t/attr-writer/71) для автоматичного створення getter/setter методів для змінних класу. Наприклад:

class Person
  attr_accessor :name

  def initialize(name)
    @name = name
  end
end

person = Person.new("John")
puts person.name # Виведе "John"
person.name = "Alice"
puts person.name # Виведе "Alice"

Обидва ці підходи дозволяють контролювати доступ до даних об’єкта, щоб забезпечити коректну роботу програми та зменшити ймовірність помилок.

Основна мета інкапсуляції полягає в тому, щоб приховати внутрішню реалізацію об’єкта від зовнішнього світу та надати контрольований доступ до даних через публічні методи.

У Ruby, крім getter і setter методів, інші способи досягнення інкапсуляції включають:

Приватні та захищені методи. Ви можете визначити методи, які доступні лише в межах класу або його підкласів (захищені методи) або лише в межах класу (приватні методи). Це дозволяє приховати функціональність, яка не повинна бути доступною зовнішнім частинам програми.

class MyClass
  def public_method
    # Цей метод доступний публічно
  end

  private

  def private_method
    # Цей метод доступний тільки всередині класу
  end

  protected

  def protected_method
    # Цей метод доступний тільки всередині класу та його підкласів
  end
end

Використання модулів. Модулі можуть бути використані для групування функціональності та використання її в різних класах. Ви можете включити модуль в клас за допомогою ключового слова include , але ці методи будуть доступні лише як публічні методи класу.

module MyModule
  def my_method
    # Цей метод доступний у всіх класах, які включають цей модуль
  end
end

class MyClass
  include MyModule
end

Інкапсуляція включає будь-які прийоми, що дозволяють приховати деталі реалізації класу від користувачів класу та інших класів.