Дисклеймер

Інформація на сайті tseivo.com є суб'єктивною та відображає особисті погляди та досвід авторів та авторок блогів.

Використовуйте цей ресурс як одне з декількох джерел інформації під час своїх досліджень та прийняття рішень. Завжди застосовуйте критичне мислення. Людина сама несе відповідальність за свої рішення та дії.

Контроль видимості в Ruby (public, private і protected)

В Ruby доступ до методів контролюється за допомогою трьох ключових слів: public, private і protected. Ці ключові слова використовуються для контролю видимості методів у класі (інкапсуляції).

Public (Публічні методи)

Щодо публічних методів - треба запам'ятати декілька основних моментів. Методи, оголошені як публічні, можуть бути викликані будь-ким - як всередині, так і поза класом. За замовчуванням всі методи в класі є публічними. Можна вказати, що метод є публічним, але для скорочення та спрощення коду цього не робиться.
class MyClass
  def public_method_name
    # Цей метод за замовчуванням публічний
  end

  public :public_method_name  # Явно вказуємо його як публічний, але можна й не вказувати
end
class MyClass
  def public_method_name
    # Цей метод за замовчуванням публічний
  end
end
Приклади технічно ідентичні - public_method_name це публічний метод. 

Private (Приватні методи)

Методи, оголошені як приватні, можуть бути викликані тільки всередині того класу, де вони визначені. Їх не можна викликати ззовні класу, навіть з екземпляра цього класу.
class MyClass
  private # всі методи що йдуть після цієї строки - приватні

  def private_method_name
    # Цей метод приватний
  end
end

Protected (Захищені методи)

Методи, оголошені як protected (захищені), можуть бути викликані тільки всередині того самого класу або екземплярів його підкласів. Cхоже на приватний доступ, але забезпечує доступ для підкласів.
class MyClass
  protected # всі методи що йдуть після цієї строки - захищені

  def protected_method
    # Цей метод захищений
  end
end
Питання про public, private та protected доволі часто зустрічаються на співбесідах. Краще за все ця інформація засвоюється коли вчишся на прикладах / вправах. Наприклад:

Вправа на вивчення public, private та protected методів

Створіть клас "Користувач" (User):
  • Створіть клас User із наступними властивостями: ім'я (name) та вік (age).
  • Всі властивості повинні бути приватними.
Додайте методи:
  • Додайте метод вітатися (greet), який виводить повідомлення: "Привіт, як справи?"
  • Додайте метод доступ_до_віку (access_age), який повертає вік користувача.
Змініть рівні доступу:
  • Зробіть метод greet публічним.
  • Зробіть метод access_age захищеним.
Створіть підклас "Адміністратор" (Admin):
  • Створіть підклас Admin, який успадковує клас User.
Перевірте роботу:
  • Створіть об'єкт класу User та об'єкт класу Admin.
  • Викличте метод greet на об'єктах обох класів.
  • Спробуйте отримати доступ до віку за допомогою методу access_age на об'єкті класу User та спробуйте це саме на об'єкті класу Admin.
Запишіть свої спостереження:
  • Запишіть, які методи ви викликали успішно, а які призвели до помилки.
  • Визначте, які методи можна викликати ззовні класу, а які ні.
Оптимізуйте код (рефакторінг)
  • організуйте код
  • змініть назви методів на більш зрозумілі (access_age -> age)
Ось скелет коду, який вам може трохи допомогти зорієнтуватись:
class User
  def initialize(name, age)
    @name = name
    @age = age
  end

  def greet
    puts "Привіт, як справи?"
  end

  def access_age
    @age
  end

  private

  def private_method
    puts "Це приватний метод"
  end

  protected

  def protected_method
    puts "Це захищений метод"
  end
end

class Admin < User
  # Admin успадковує всі властивості та методи з User
end

# Створення об'єктів
user = User.new("Користувач", 25)
admin = Admin.new("Адміністратор", 30)

# Виклик публічного методу
user.greet
admin.greet

# Спроба викликати захищений метод
# user.protected_method  # Призведе до помилки

# Спроба викликати приватний метод
# user.private_method  # Призведе до помилки

# Вивід віку
puts "Вік користувача: #{user.access_age}"
puts "Вік адміністратора: #{admin.access_age}"
Якщо ця вправа здається заважкою - поверніться до неї через деякий час. Повторіть як працюють класи, що таке initialize, що таке екземпляр класу тощо.

🙌 Підтримати блог @memecode

Ви можете поширити цей допис у соцмережах, чим допоможете платформі цейво розвиватись (* ^ ω ^)

Які можливі наслідки при створенні всіх методів з модифікатором доступу public?

Якщо всі методи матимуть модифікатор доступу public, це призведе до того, що всі інші класи та компоненти програми матимуть безперешкодний доступ до цих методів.

Це може призвести до непередбачуваних конфліктів у програмі.

З іншого боку, це може полегшити взаємодію між класами та сприяти швидкої розробці, але такий підхід не завжди є безпечним і може породжувати проблеми зі збереженням даних та конфіденційністю.
📝 Більше публікацій: