Інкапсуляція в 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 , attr_reader , або attr_writer для автоматичного створення 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
Інкапсуляція включає будь-які прийоми, що дозволяють приховати деталі реалізації класу від користувачів класу та інших класів.