Cała oryginalna treść jest tworzona po ukraińsku. Nie wszystkie treści zostały jeszcze przetłumaczone. Niektóre posty mogą być dostępne tylko po ukraińsku.Dowiedz się więcej

Co to jest PORO w Ruby?

Okładka posta: Co to jest PORO w Ruby?
Ta treść została automatycznie przetłumaczona z ukraińskiego.
W Ruby często wspomina się termin PORO (Plain Old Ruby Object), ale co to takiego i dlaczego jest ważne?

PORO: prostymi słowami

PORO — to po prostu zwykły obiekt Ruby. Nie dziedziczy od specyficznych bibliotek ani klas frameworków, takich jak ActiveRecord, ActionController czy innych. PORO — to obiekt, który:
  1. Jest lekki i minimalistyczny.
  2. Ma tylko te metody, które są potrzebne do rozwiązania konkretnego zadania.
  3. Nie zależy od zewnętrznych frameworków ani bibliotek.

Zalety PORO

  • Prostota: PORO pozwala utrzymać kod czystym i zrozumiałym.
  • Elastyczność: Możesz używać PORO w każdym projekcie Ruby bez związania z frameworkami.
  • Pokrycie testami: PORO łatwo testować, ponieważ nie mają zależności od skomplikowanej ekosystemu frameworków.

Kiedy używać PORO?

  1. Kiedy musisz zaimplementować specyficzną logikę biznesową, która nie pasuje do modeli, kontrolerów lub helperów.
  2. Kiedy chcesz stworzyć małe, samodzielne klasy.
  3. Kiedy musisz zmniejszyć zależność od frameworków i uczynić kod bardziej modułowym.
PORO jest ważny dla elastycznego designu, ponieważ pozwala tworzyć niezależne komponenty, które nie zależą od frameworków, takich jak Rails. Na przykład, wyobraź sobie logikę biznesową do obliczania wynagrodzenia. Jeśli jest związana z ActiveRecord, jej użycie zależy od dostępu do bazy danych. To utrudnia testowanie i ogranicza możliwość ponownego użycia w innych kontekstach, takich jak API czy mikroserwisy.
Dzięki PORO możesz wydzielić logikę do osobnego obiektu, który działa tylko z danymi wejściowymi i nie ma powiązań z zewnętrznymi zależnościami. Takie podejście upraszcza testowanie, zwiększa modułowość kodu i pozwala łatwo dostosować go do nowych potrzeb. To sprawia, że PORO jest skutecznym narzędziem do tworzenia czystej architektury aplikacji.

Użycie PORO w Rails

Wyobraźmy sobie, że w Twoim projekcie Rails istnieje potrzeba obliczenia całkowitego kosztu zamówienia:
class OrderTotalCalculator
  def initialize(order)
    @order = order
  end

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

# Użycie:
order = Order.find(1) # Przykład modelu ActiveRecord
calculator = OrderTotalCalculator.new(order)
puts calculator.total
W tym przykładzie OrderTotalCalculator jest PORO. Jest oddzielony od modeli i kontrolerów Rails, co czyni go niezależnym i łatwym do testowania.

Jak testować PORO?

Dzięki swojej prostocie, PORO łatwo testować za pomocą RSpec lub MiniTest:
RSpec.describe DiscountCalculator do
  it 'oblicza prawidłową cenę ze zniżką' do
    calculator = DiscountCalculator.new(100, 10)
    expect(calculator.final_price).to eq(90.0)
  end
end
PORO — to podstawa czystego i prostego designu w Ruby. Pomagają one (proste obiekty bez zależności) tworzyć elastyczne, niezależne komponenty, które są łatwe do rozszerzenia, utrzymania i testowania.

Ten post nie ma jeszcze żadnych dodatków od autora.

Co oznacza relacyjny (w kontekście baz danych relacyjnych)?
21 wrz 08:27

Co oznacza relacyjny (w kontekście baz danych relacyjnych)?

meme code
meme code@memecode
Czym jest RDBMS (relacyjny system zarządzania bazami danych)?
21 wrz 08:56

Czym jest RDBMS (relacyjny system zarządzania bazami danych)?

meme code
meme code@memecode
Co oznacza zasada ACID w programowaniu?
24 wrz 20:31

Co oznacza zasada ACID w programowaniu?

meme code
meme code@memecode
Czym jest Konwencja nad Konfiguracją (w kontekście RoR i nie tylko)?
26 wrz 07:47

Czym jest Konwencja nad Konfiguracją (w kontekście RoR i nie tylko)?

meme code
meme code@memecode
Zaokrąglanie liczb dziesiętnych: zasady matematyczne, JavaScript i Ruby
18 paź 12:59

Zaokrąglanie liczb dziesiętnych: zasady matematyczne, JavaScript i Ruby

meme code
meme code@memecode
[Fix] Fabryka nie zarejestrowana: "user" (KeyError) (FactoryBot / Rails 7)
7 gru 10:46

[Fix] Fabryka nie zarejestrowana: "user" (KeyError) (FactoryBot / Rails 7)

meme code
meme code@memecode
Czym różnią się spec_helper.rb i rails_helper.rb w RSpec?
8 gru 13:53

Czym różnią się spec_helper.rb i rails_helper.rb w RSpec?

meme code
meme code@memecode
9 gru 14:50

[Fix] Nie ma takiego pliku ani katalogu @ rb_sysopen - tmp/pids/server.pid

meme code
meme code@memecode
Co należy wiedzieć, aby zbudować udaną karierę w IT jako freelancer
23 gru 16:03

Co należy wiedzieć, aby zbudować udaną karierę w IT jako freelancer

meme code
meme code@memecode
Wirtualny serwer chmurowy: czym jest i jaka jest jego specyfika
3 sty 10:58

Wirtualny serwer chmurowy: czym jest i jaka jest jego specyfika

meme code
meme code@memecode
[Fix] Heroku / SearchBox addon - błąd indeksowania "Klient nie może zweryfikować, że serwer to Elasticsearch"
31 sty 13:09

[Fix] Heroku / SearchBox addon - błąd indeksowania "Klient nie może zweryfikować, że serwer to Elasticsearch"

meme code
meme code@memecode
6 lut 15:31

Poprawka błędu [DEPRECATION] #adapters jest przestarzałe. Użyj zamiast tego #profiles. (Codecov / docile)

meme code
meme code@memecode