SlideShare a Scribd company logo
Andrzej Krzywda, Arkency, from DRUG to PRUG with ❤ 2022
Service objecty to za mało
Jak żyć z Railsami?
Ruby w Polsce


jednoczmy się w Ruby User Groups
historia Ruby w Polsce
Z Railsami szybko się startuje
Optymalizacja pod dodawanie
nowych kolumn w bazie danych
Railsy optymalizują pod pierwsze
10 ticketów w Jirze
Potem mamy już
"zacementowany design"
Coupling everywhere
Mądrze wybieraj pierwsze 10
ficzerów
DHH mówi:


logika do modelów


oraz concerny
Community wybrało service
objecty
Ale każdy je robi po swojemu
I każdy je inaczej nazywa


commandy, serwisy, serwisobdżekty, usecase'y,
interactory, simplekomandy
Zaleta serwisów:


oddzielenie się od warstwy http railsów
Zwykle zostaje coupling do
ActiveRecord
Chociaż niektórzy opakowują
ActiveRecord warstwą repozytoriów
Serwisy i repozytoria


to taki etap serwisy+
Często też dochodzą takie wzorce
jak form object czy presenter pattern
I co dalej?


Czy etap serwisy+ nas zadowala?
Możnaby powiedzieć, że mamy
oddzielone app layer od frameworka
Ale nadal nie mamy domain layer
Czy eliminuje to couplingi?
Typowe problemy etapu serwisy+
Czy serwis może wywoływać
inny serwis?
Czy rozróżniamy nadserwisy i
podserwisy?
Czy prezentowanie danych (aka
query) to też serwis?
Czy dziedziczkonko serwisów
jest OK?
Czy wybieramy framework do
serwisów?
Czy mamy spójne zachowania
serwisów, czy mają stałe API?
Czy rzucamy wyjątki jak coś w
serwisie się nie powiedzie?
Czy używamy monady?
Gdzie szukamy odpowiedzi i
dlaczego tylko w świecie Rails?
Najważniejsze pytanie
Co chcesz w życiu robić?
aka


Co dalej?


Dokąd zmierzamy?
Do niedawna nie było tu łatwej
rady co dalej
Serwisy to gateway drug
Prawdziwa zabawa zaczyna się
jak sięgniesz po kolejne narkotyki
Te narkotyki to tak naprawdę rozbicie
serwis objectów na dalsze części
pierwsze - decoupling
Zapoznaj się jak wygląda świat
dużo głębiej
Rails+


DDD+CQRS+Events
Rails+


DDD+CQRS+Events
•To są uniwersalne metody, nic
wymyślonego tylko w świecie Ruby


•Sprawdzone w Java, .NET, PHP, Python


•Mamy dostęp do nich wszystkich z
dylematami
Rails+CQRS


Command Query Responsibility
Segregation
Rails+CQRS


Command Query Responsibility
Segregation
• Railsy idealnie pasują do podziału na odczyty i zapisy


• Odczyty to dedykowane zdenormalizowane "modele" per raport (read model)


• szybsze niż cache


• bez join'ów


• OrderList


• CustomerList


• Ledger


• Trudne do zaakceptowania dla Railsowca, bo:


• dużo denormalizacji danych


• DRY złamane


• Używamy ActiveRecord ale bez walidacji, callbacków itp


• Zapisy to komendy wysyłane do modułów biznesowych (DDD)
Domain Driven Design
Domain Driven Design
•Moduły biznesowe odzwierciedlające biznesowe działy


•Mówimy wtedy językiem biznesowym


•Nie ma tu zależności do frameworka


•Dużo duplikacji, bo:


•Order w każdym module znaczy co innego


•podobnie Customer


•podobnie Product


•Każda zmiana jest propagowana jako event, bo:


•inne moduły są tym zainteresowane


•eventy zastępują nam persistence (event sourcing
Event sourcing
•Odtwarzamy stan agregatów z krótkiej
listy eventów


•Pełna historia


•Minus:


•Trzeba nauczyć się radzić ze zmianą
schematu eventów (wersjonowanie)
Wiem, że nic z tego nie kumacie
poka kodzik
Arkency Ecommerce


https://github.com/RailsEventStore/ecommerce
nietrywialny projekt DDD + CQRS
+ Event Sourcing
Wskocz tam aby przekonać się
czy faktycznie to takie dobre
szybkie przejście przez UI
wrażliwych TheRailsWay'owców ostrzegam 😂


kodzik potencjalnie offensive
• Katalog z Rails nie jest root'em

• Równolegle "mamy" hanami

• Cała domena w ecommerce/
• Nie ma app/services

• app/models puste

• app/read_models
Controller actions - albo
komendy albo read model
Komendy to już świat domeny -
wejście/input do modułu biznesowego
Moduły biznesowe
Komendy to struktury danych
Command handler


to co pozostaje z service objectów
Agregaty - obiekty domenowe


pilnują przejścia stanów, to tutaj wpadają biznesowe
walidacje
Read modele
Dane, bez logiki
Read modele
Procesy biznesowe
Procesy biznesowe
Dyryguje procesami pomiędzy
działami biznesowymi
Procesy biznesowe
Dużo tego, ale warto
Małe moduły biznesowe
Małe read modele
Mega łatwo testowalne (in
memory)
Dużo deklaratywnego kodziku
Mało if'ków
Duża zgodność z biznesem
Performance!
Event log - łatwe debugowanie
Eventy - odtwarzanie systemu na
dzień konkretny
Gotowe klocki - RailsEventStore,
Event Browser, domeny, starter app
RailsEventStore
"Rails" tak trochę dla marketingu
zaprojektowany aby łatwo używać w
istniejących (legacy) Railsowych appkach
Pełne otestowanie domen


mutation testing!
Modular monolith


modulith


(no microservices, db transactions)
Wiadomo, gdzie "wkładać"
kodzik - oczywiste szufladki
Czy kogoś przekonałem, że
warto zajrzeć na to repo?
Arkency Ecommerce


https://github.com/RailsEventStore/ecommerce
https://blog.arkency.com
https://arkency.com/newsletter/
jeśli lubisz dostawać maile
Dzięki!

More Related Content

Similar to [PL] PRUG Luty 2022 - Service objecty to za mało - jak żyć z Railsami?

GET.NET - Osiołkowi w żłobie dano, czyli o tym jak hostować aplikacje na Mic...
GET.NET -  Osiołkowi w żłobie dano, czyli o tym jak hostować aplikacje na Mic...GET.NET -  Osiołkowi w żłobie dano, czyli o tym jak hostować aplikacje na Mic...
GET.NET - Osiołkowi w żłobie dano, czyli o tym jak hostować aplikacje na Mic...
Michal Furmankiewicz
 
Clean code w Ruby
Clean code w RubyClean code w Ruby
Clean code w Ruby
Rafal Piekarski
 
Tomasz Kopacz MTS 2012 Azure - Co i kiedy użyć (IaaS vs paas vshybrid cloud v...
Tomasz Kopacz MTS 2012 Azure - Co i kiedy użyć (IaaS vs paas vshybrid cloud v...Tomasz Kopacz MTS 2012 Azure - Co i kiedy użyć (IaaS vs paas vshybrid cloud v...
Tomasz Kopacz MTS 2012 Azure - Co i kiedy użyć (IaaS vs paas vshybrid cloud v...Tomasz Kopacz
 
Wprowadzenie do Kubernetesa. K8S jako nowy Linux.
Wprowadzenie do Kubernetesa. K8S jako nowy Linux.Wprowadzenie do Kubernetesa. K8S jako nowy Linux.
Wprowadzenie do Kubernetesa. K8S jako nowy Linux.
Wojciech Barczyński
 
Aplikacje internetowe (2010)
Aplikacje internetowe (2010)Aplikacje internetowe (2010)
Aplikacje internetowe (2010)
Adrian Kalbarczyk
 
Wzorce projektowe (w ASP.NET i nie tylko)
Wzorce projektowe (w ASP.NET i nie tylko)Wzorce projektowe (w ASP.NET i nie tylko)
Wzorce projektowe (w ASP.NET i nie tylko)
Bartlomiej Zass
 
Produkcja aplikacji internetowych
Produkcja aplikacji internetowychProdukcja aplikacji internetowych
Produkcja aplikacji internetowych
Tomasz Borowski
 
4Developers 2015: Baza danych w aplikacji typu SaaS - błędy w projektowaniu -...
4Developers 2015: Baza danych w aplikacji typu SaaS - błędy w projektowaniu -...4Developers 2015: Baza danych w aplikacji typu SaaS - błędy w projektowaniu -...
4Developers 2015: Baza danych w aplikacji typu SaaS - błędy w projektowaniu -...
PROIDEA
 
Marek Sokołowski @ "Usługi PaaS oraz IaaS - przegląd dostępnego osprzętu i am...
Marek Sokołowski @ "Usługi PaaS oraz IaaS - przegląd dostępnego osprzętu i am...Marek Sokołowski @ "Usługi PaaS oraz IaaS - przegląd dostępnego osprzętu i am...
Marek Sokołowski @ "Usługi PaaS oraz IaaS - przegląd dostępnego osprzętu i am...
Ewa Stepien
 
Websites vs Cloud Services - OLMUG
Websites vs Cloud Services - OLMUGWebsites vs Cloud Services - OLMUG
Websites vs Cloud Services - OLMUG
Bart Zaremba
 
1st Silesian Code Camp - Czy jesteśmy gotowi na SQL Azure?
1st Silesian Code Camp - Czy jesteśmy gotowi na SQL Azure?1st Silesian Code Camp - Czy jesteśmy gotowi na SQL Azure?
1st Silesian Code Camp - Czy jesteśmy gotowi na SQL Azure?Tobias Koprowski
 
Praktyczne użycie Repository Pattern w Laravel cz. I
Praktyczne użycie Repository Pattern w Laravel cz. IPraktyczne użycie Repository Pattern w Laravel cz. I
Praktyczne użycie Repository Pattern w Laravel cz. I
Laravel Poland MeetUp
 
Laravel Poznań Meetup #7 - "Praktyczne użycie Repository Pattern w Laravel cz...
Laravel Poznań Meetup #7 - "Praktyczne użycie Repository Pattern w Laravel cz...Laravel Poznań Meetup #7 - "Praktyczne użycie Repository Pattern w Laravel cz...
Laravel Poznań Meetup #7 - "Praktyczne użycie Repository Pattern w Laravel cz...
HighSolutions Sp. z o.o.
 
REvolution, czyli o bardziej obiektowym podejściu w Railsach
REvolution, czyli o bardziej obiektowym podejściu w RailsachREvolution, czyli o bardziej obiektowym podejściu w Railsach
REvolution, czyli o bardziej obiektowym podejściu w Railsach
The Software House
 
Roman Czarko-Wasiutycz- Projektowanie baz danych
Roman Czarko-Wasiutycz- Projektowanie baz danychRoman Czarko-Wasiutycz- Projektowanie baz danych
Roman Czarko-Wasiutycz- Projektowanie baz danych
Women in Technology Poland
 
Podstawy programowania w Drupalu - Drupal idzie na studia - Jarosław Sobiecki
Podstawy programowania w Drupalu - Drupal idzie na studia - Jarosław SobieckiPodstawy programowania w Drupalu - Drupal idzie na studia - Jarosław Sobiecki
Podstawy programowania w Drupalu - Drupal idzie na studia - Jarosław Sobiecki
Grzegorz Bartman
 
Ewolucja architektury Getresponse Api
Ewolucja architektury Getresponse ApiEwolucja architektury Getresponse Api
Ewolucja architektury Getresponse Api
Michal Giergielewicz
 
PLNOG16: Integracja Ceph w OpenStack - status i przyszłość, Paweł Stefański
PLNOG16: Integracja Ceph w OpenStack - status i przyszłość, Paweł StefańskiPLNOG16: Integracja Ceph w OpenStack - status i przyszłość, Paweł Stefański
PLNOG16: Integracja Ceph w OpenStack - status i przyszłość, Paweł Stefański
PROIDEA
 
Jak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyJak stworzyć udany system informatyczny
Jak stworzyć udany system informatyczny
qbeuek
 
Serverless w Chmurze. Azure Functions vs AWS Lambda. Porównanie dwóch najwięk...
Serverless w Chmurze. Azure Functions vs AWS Lambda. Porównanie dwóch najwięk...Serverless w Chmurze. Azure Functions vs AWS Lambda. Porównanie dwóch najwięk...
Serverless w Chmurze. Azure Functions vs AWS Lambda. Porównanie dwóch najwięk...
Michal Furmankiewicz
 

Similar to [PL] PRUG Luty 2022 - Service objecty to za mało - jak żyć z Railsami? (20)

GET.NET - Osiołkowi w żłobie dano, czyli o tym jak hostować aplikacje na Mic...
GET.NET -  Osiołkowi w żłobie dano, czyli o tym jak hostować aplikacje na Mic...GET.NET -  Osiołkowi w żłobie dano, czyli o tym jak hostować aplikacje na Mic...
GET.NET - Osiołkowi w żłobie dano, czyli o tym jak hostować aplikacje na Mic...
 
Clean code w Ruby
Clean code w RubyClean code w Ruby
Clean code w Ruby
 
Tomasz Kopacz MTS 2012 Azure - Co i kiedy użyć (IaaS vs paas vshybrid cloud v...
Tomasz Kopacz MTS 2012 Azure - Co i kiedy użyć (IaaS vs paas vshybrid cloud v...Tomasz Kopacz MTS 2012 Azure - Co i kiedy użyć (IaaS vs paas vshybrid cloud v...
Tomasz Kopacz MTS 2012 Azure - Co i kiedy użyć (IaaS vs paas vshybrid cloud v...
 
Wprowadzenie do Kubernetesa. K8S jako nowy Linux.
Wprowadzenie do Kubernetesa. K8S jako nowy Linux.Wprowadzenie do Kubernetesa. K8S jako nowy Linux.
Wprowadzenie do Kubernetesa. K8S jako nowy Linux.
 
Aplikacje internetowe (2010)
Aplikacje internetowe (2010)Aplikacje internetowe (2010)
Aplikacje internetowe (2010)
 
Wzorce projektowe (w ASP.NET i nie tylko)
Wzorce projektowe (w ASP.NET i nie tylko)Wzorce projektowe (w ASP.NET i nie tylko)
Wzorce projektowe (w ASP.NET i nie tylko)
 
Produkcja aplikacji internetowych
Produkcja aplikacji internetowychProdukcja aplikacji internetowych
Produkcja aplikacji internetowych
 
4Developers 2015: Baza danych w aplikacji typu SaaS - błędy w projektowaniu -...
4Developers 2015: Baza danych w aplikacji typu SaaS - błędy w projektowaniu -...4Developers 2015: Baza danych w aplikacji typu SaaS - błędy w projektowaniu -...
4Developers 2015: Baza danych w aplikacji typu SaaS - błędy w projektowaniu -...
 
Marek Sokołowski @ "Usługi PaaS oraz IaaS - przegląd dostępnego osprzętu i am...
Marek Sokołowski @ "Usługi PaaS oraz IaaS - przegląd dostępnego osprzętu i am...Marek Sokołowski @ "Usługi PaaS oraz IaaS - przegląd dostępnego osprzętu i am...
Marek Sokołowski @ "Usługi PaaS oraz IaaS - przegląd dostępnego osprzętu i am...
 
Websites vs Cloud Services - OLMUG
Websites vs Cloud Services - OLMUGWebsites vs Cloud Services - OLMUG
Websites vs Cloud Services - OLMUG
 
1st Silesian Code Camp - Czy jesteśmy gotowi na SQL Azure?
1st Silesian Code Camp - Czy jesteśmy gotowi na SQL Azure?1st Silesian Code Camp - Czy jesteśmy gotowi na SQL Azure?
1st Silesian Code Camp - Czy jesteśmy gotowi na SQL Azure?
 
Praktyczne użycie Repository Pattern w Laravel cz. I
Praktyczne użycie Repository Pattern w Laravel cz. IPraktyczne użycie Repository Pattern w Laravel cz. I
Praktyczne użycie Repository Pattern w Laravel cz. I
 
Laravel Poznań Meetup #7 - "Praktyczne użycie Repository Pattern w Laravel cz...
Laravel Poznań Meetup #7 - "Praktyczne użycie Repository Pattern w Laravel cz...Laravel Poznań Meetup #7 - "Praktyczne użycie Repository Pattern w Laravel cz...
Laravel Poznań Meetup #7 - "Praktyczne użycie Repository Pattern w Laravel cz...
 
REvolution, czyli o bardziej obiektowym podejściu w Railsach
REvolution, czyli o bardziej obiektowym podejściu w RailsachREvolution, czyli o bardziej obiektowym podejściu w Railsach
REvolution, czyli o bardziej obiektowym podejściu w Railsach
 
Roman Czarko-Wasiutycz- Projektowanie baz danych
Roman Czarko-Wasiutycz- Projektowanie baz danychRoman Czarko-Wasiutycz- Projektowanie baz danych
Roman Czarko-Wasiutycz- Projektowanie baz danych
 
Podstawy programowania w Drupalu - Drupal idzie na studia - Jarosław Sobiecki
Podstawy programowania w Drupalu - Drupal idzie na studia - Jarosław SobieckiPodstawy programowania w Drupalu - Drupal idzie na studia - Jarosław Sobiecki
Podstawy programowania w Drupalu - Drupal idzie na studia - Jarosław Sobiecki
 
Ewolucja architektury Getresponse Api
Ewolucja architektury Getresponse ApiEwolucja architektury Getresponse Api
Ewolucja architektury Getresponse Api
 
PLNOG16: Integracja Ceph w OpenStack - status i przyszłość, Paweł Stefański
PLNOG16: Integracja Ceph w OpenStack - status i przyszłość, Paweł StefańskiPLNOG16: Integracja Ceph w OpenStack - status i przyszłość, Paweł Stefański
PLNOG16: Integracja Ceph w OpenStack - status i przyszłość, Paweł Stefański
 
Jak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyJak stworzyć udany system informatyczny
Jak stworzyć udany system informatyczny
 
Serverless w Chmurze. Azure Functions vs AWS Lambda. Porównanie dwóch najwięk...
Serverless w Chmurze. Azure Functions vs AWS Lambda. Porównanie dwóch najwięk...Serverless w Chmurze. Azure Functions vs AWS Lambda. Porównanie dwóch najwięk...
Serverless w Chmurze. Azure Functions vs AWS Lambda. Porównanie dwóch najwięk...
 

More from Andrzej Krzywda

Audit log with event sourcing
Audit log with event sourcingAudit log with event sourcing
Audit log with event sourcing
Andrzej Krzywda
 
Event driven without microservices
Event driven without microservicesEvent driven without microservices
Event driven without microservices
Andrzej Krzywda
 
From legacy to DDD - 5 starting steps
From legacy to DDD - 5 starting stepsFrom legacy to DDD - 5 starting steps
From legacy to DDD - 5 starting steps
Andrzej Krzywda
 
Slack protips from Arkency
Slack protips from ArkencySlack protips from Arkency
Slack protips from Arkency
Andrzej Krzywda
 
From Rails legacy to DDD - Pivorak, Lviv
From Rails legacy to DDD - Pivorak, LvivFrom Rails legacy to DDD - Pivorak, Lviv
From Rails legacy to DDD - Pivorak, Lviv
Andrzej Krzywda
 
From legacy to DDD (slides for the screencast)
From legacy to DDD (slides for the screencast)From legacy to DDD (slides for the screencast)
From legacy to DDD (slides for the screencast)
Andrzej Krzywda
 
From legacy to DDD
From legacy to DDDFrom legacy to DDD
From legacy to DDD
Andrzej Krzywda
 
DCI - the architecture from the future
DCI - the architecture from the futureDCI - the architecture from the future
DCI - the architecture from the future
Andrzej Krzywda
 
Refactoring Rails applications with RubyMine
Refactoring Rails applications with RubyMineRefactoring Rails applications with RubyMine
Refactoring Rails applications with RubyMine
Andrzej Krzywda
 
Beyond The Rails Way
Beyond The Rails WayBeyond The Rails Way
Beyond The Rails Way
Andrzej Krzywda
 
Service objects in Rails tests - factory_girl replacement
Service objects in Rails tests - factory_girl replacementService objects in Rails tests - factory_girl replacement
Service objects in Rails tests - factory_girl replacement
Andrzej Krzywda
 
Developer oriented
Developer orientedDeveloper oriented
Developer oriented
Andrzej Krzywda
 
Can you TDD Rails?
Can you TDD Rails?Can you TDD Rails?
Can you TDD Rails?
Andrzej Krzywda
 
A programmer or a business consultant?
A programmer or a business consultant?A programmer or a business consultant?
A programmer or a business consultant?
Andrzej Krzywda
 
Rails refactoring call for help
Rails refactoring call for helpRails refactoring call for help
Rails refactoring call for help
Andrzej Krzywda
 
[Polish] Praca zdalna, praca asynchroniczna
[Polish] Praca zdalna, praca asynchroniczna[Polish] Praca zdalna, praca asynchroniczna
[Polish] Praca zdalna, praca asynchronicznaAndrzej Krzywda
 
Use cases in the code with AOP
Use cases in the code with AOPUse cases in the code with AOP
Use cases in the code with AOP
Andrzej Krzywda
 
Single Page Applications with CoffeeScript [Polish]
Single Page Applications with CoffeeScript [Polish]Single Page Applications with CoffeeScript [Polish]
Single Page Applications with CoffeeScript [Polish]
Andrzej Krzywda
 

More from Andrzej Krzywda (20)

Audit log with event sourcing
Audit log with event sourcingAudit log with event sourcing
Audit log with event sourcing
 
Event driven without microservices
Event driven without microservicesEvent driven without microservices
Event driven without microservices
 
From legacy to DDD - 5 starting steps
From legacy to DDD - 5 starting stepsFrom legacy to DDD - 5 starting steps
From legacy to DDD - 5 starting steps
 
Slack protips from Arkency
Slack protips from ArkencySlack protips from Arkency
Slack protips from Arkency
 
From Rails legacy to DDD - Pivorak, Lviv
From Rails legacy to DDD - Pivorak, LvivFrom Rails legacy to DDD - Pivorak, Lviv
From Rails legacy to DDD - Pivorak, Lviv
 
From legacy to DDD (slides for the screencast)
From legacy to DDD (slides for the screencast)From legacy to DDD (slides for the screencast)
From legacy to DDD (slides for the screencast)
 
From legacy to DDD
From legacy to DDDFrom legacy to DDD
From legacy to DDD
 
DCI - the architecture from the future
DCI - the architecture from the futureDCI - the architecture from the future
DCI - the architecture from the future
 
Refactoring Rails applications with RubyMine
Refactoring Rails applications with RubyMineRefactoring Rails applications with RubyMine
Refactoring Rails applications with RubyMine
 
Beyond The Rails Way
Beyond The Rails WayBeyond The Rails Way
Beyond The Rails Way
 
Service objects in Rails tests - factory_girl replacement
Service objects in Rails tests - factory_girl replacementService objects in Rails tests - factory_girl replacement
Service objects in Rails tests - factory_girl replacement
 
Developer oriented
Developer orientedDeveloper oriented
Developer oriented
 
Can you TDD Rails?
Can you TDD Rails?Can you TDD Rails?
Can you TDD Rails?
 
A programmer or a business consultant?
A programmer or a business consultant?A programmer or a business consultant?
A programmer or a business consultant?
 
Rails refactoring call for help
Rails refactoring call for helpRails refactoring call for help
Rails refactoring call for help
 
[Polish] Praca zdalna, praca asynchroniczna
[Polish] Praca zdalna, praca asynchroniczna[Polish] Praca zdalna, praca asynchroniczna
[Polish] Praca zdalna, praca asynchroniczna
 
Use cases in the code with AOP
Use cases in the code with AOPUse cases in the code with AOP
Use cases in the code with AOP
 
Single Page Applications with CoffeeScript [Polish]
Single Page Applications with CoffeeScript [Polish]Single Page Applications with CoffeeScript [Polish]
Single Page Applications with CoffeeScript [Polish]
 
Madeleine on Rails
Madeleine on RailsMadeleine on Rails
Madeleine on Rails
 
TDD with Rails
TDD with RailsTDD with Rails
TDD with Rails
 

[PL] PRUG Luty 2022 - Service objecty to za mało - jak żyć z Railsami?