ГоловнаВсі публікаціїКатегоріїПро проєкт

Що таке PORO в Ruby?

Обкладинка нотатки: Що таке PORO в Ruby?
Зміст дописунатисність на посилання, щоб перейти до потрібного місця
У Ruby часто згадується термін PORO (Plain Old Ruby Object), але що це таке і чому він важливий?

PORO: простими словами

PORO — це просто звичайний об'єкт Ruby. Він не успадковується від специфічних бібліотек або класів фреймворків, таких як ActiveRecord, ActionController чи інші. PORO — це об'єкт, який:
  1. Легкий і мінімалістичний.
  2. Має лише ті методи, які потрібні для вирішення конкретної задачі.
  3. Не залежить від зовнішніх фреймворків чи бібліотек.

Переваги PORO

  • Простота: PORO дозволяє зберігати код чистим і зрозумілим.
  • Гнучкість: Ви можете використовувати PORO у будь-якому Ruby-проєкті без прив'язки до фреймворків.
  • Покриття тестами: PORO легко тестувати, оскільки вони не мають залежностей від складної екосистеми фреймворків.

Коли використовувати PORO?

  1. Коли вам потрібно реалізувати специфічну бізнес-логіку, яка не підходить до моделей, контролерів або хелперів.
  2. Коли ви хочете створити маленькі, самостійні класи.
  3. Коли вам потрібно зменшити залежність від фреймворків і зробити код більш модульним.
PORO важливий для гнучкого дизайну, оскільки дозволяє створювати незалежні компоненти, які не залежать від фреймворків, таких як Rails. Наприклад, уявіть бізнес-логіку для розрахунку зарплати. Якщо вона прив’язана до ActiveRecord, її використання залежить від доступу до бази даних. Це ускладнює тестування та обмежує можливість повторного використання в інших контекстах, таких як API або мікросервіси.
Завдяки PORO ви можете винести логіку в окремий об’єкт, який працює лише з вхідними даними та не має прив’язок до зовнішніх залежностей. Такий підхід спрощує тестування, підвищує модульність коду та дозволяє легко адаптувати його для нових потреб. Це робить PORO ефективним інструментом для створення чистої архітектури додатків.

Використання PORO в Rails

Уявімо, що у вашому Rails-проекті є потреба обчислити загальну вартість замовлення:
class OrderTotalCalculator
  def initialize(order)
    @order = order
  end

  def total
    @order.items.sum { |item| item.price * item.quantity }
  end
end

# Використання:
order = Order.find(1) # Приклад ActiveRecord моделі
calculator = OrderTotalCalculator.new(order)
puts calculator.total
У цьому прикладі OrderTotalCalculator є PORO. Він відокремлений від моделей і контролерів Rails, що робить його незалежним і легким для тестування.

Як тестувати PORO?

Завдяки своїй простоті, PORO легко тестувати за допомогою RSpec чи MiniTest:
RSpec.describe DiscountCalculator do
  it 'розраховує правильну ціну зі знижкою' do
    calculator = DiscountCalculator.new(100, 10)
    expect(calculator.final_price).to eq(90.0)
  end
end
PORO — це основа чистого і простого дизайну в Ruby. Вони (прості об'єкти без залежностей) допомагають створювати гнучкі, незалежні компоненти, які легко розширювати, підтримувати та тестувати.
Що означає реляційний (в контексті реляційних баз даних)?
21.09.2024 08:27

Що означає реляційний (в контексті реляційних баз даних)?

meme code
meme code@memecode
Що таке RDBMS (relational database management system / реляційна система управління базами даних)?
21.09.2024 08:56

Що таке RDBMS (relational database management system / реляційна система управління базами даних)?

meme code
meme code@memecode
 Що означає ACID принцип у програмуванні?
24.09.2024 20:31

Що означає ACID принцип у програмуванні?

meme code
meme code@memecode
Що таке Сonvention over Сonfiguration (в контексті RoR і не тільки)?
26.09.2024 07:47

Що таке Сonvention over Сonfiguration (в контексті RoR і не тільки)?

meme code
meme code@memecode
Округлення десяткових чисел: математичні правила, JavaScript і Ruby
18.10.2024 12:59

Округлення десяткових чисел: математичні правила, JavaScript і Ruby

meme code
meme code@memecode
[Фікс] Factory not registered: "user" (KeyError) (FactoryBot / Rails 7)
07.12.2024 10:46

[Фікс] Factory not registered: "user" (KeyError) (FactoryBot / Rails 7)

meme code
meme code@memecode
Чим відрізняються spec_helper.rb і rails_helper.rb у RSpec?
08.12.2024 13:53

Чим відрізняються spec_helper.rb і rails_helper.rb у RSpec?

meme code
meme code@memecode
09.12.2024 14:50

[Фікс] No such file or directory @ rb_sysopen - tmp/pids/server.pid

meme code
meme code@memecode
Що потрібно знати, щоб побудувати успішну кар'єру на фрілансі в IT
23.12.2024 16:03

Що потрібно знати, щоб побудувати успішну кар'єру на фрілансі в IT

meme code
meme code@memecode
Віртуальний хмарний сервер: що це таке та в чому його особливість
03.01.2025 10:58

Віртуальний хмарний сервер: що це таке та в чому його особливість

meme code
meme code@memecode
[Fix] Heroku / SearchBox addon - помилка ідексації "The client is unable to verify that the server is Elasticsearch"
31.01.2025 13:09

[Fix] Heroku / SearchBox addon - помилка ідексації "The client is unable to verify that the server is Elasticsearch"

meme code
meme code@memecode
06.02.2025 15:31

Фікс помилки [DEPRECATION] #adapters is deprecated. Use #profiles instead. (Codecov / docile)

meme code
meme code@memecode