SlideShare a Scribd company logo
1 of 152
Download to read offline
Od frontu do backendu
dwa oblicza SOLIDnego kodu
Marcin Gajda

Frontend Developer
Bożena Pietrzak

PHP Developer
S O L I D
S O L I DObject Oriented Programming
Zasady
Reguły
Zasady
Reguły
Dobre
praktyki?
Single 

Responsibility 

Principle
Single 

Responsibility 

Principle
Single Responsibility Principle [PHP]
<—
Single Responsibility Principle [PHP]
<—
Single Responsibility Principle [PHP]
1
<—
Single Responsibility Principle [PHP]
1
2
<—
Single Responsibility Principle [PHP]
Single Responsibility Principle [PHP]
Single Responsibility Principle [PHP]
Single Responsibility Principle [PHP]
Single Responsibility Principle [PHP]
Single Responsibility Principle [PHP]
+
+
+
Single Responsibility Principle [PHP]
Single Responsibility Principle [PHP]
Single Responsibility Principle [PHP]
Single Responsibility Principle [JS]
Czym jest pojedyncza odpowiedzialność?
Single Responsibility Principle [JS]
Programista powinien mieć tylko
jedną motywację do zmiany czegoś.
Single Responsibility Principle [JS]
Programista powinien mieć tylko
jedną motywację do zmiany czegoś.
Single Responsibility Principle [JS]
Single Responsibility Principle [JS]
Pobieranie

danych
Single Responsibility Principle [JS]
Pobieranie

danych Przetwarzanie 

informacji
Single Responsibility Principle [JS]
Pobieranie

danych Przetwarzanie 

informacji
Wyświetlanie
Single Responsibility Principle [JS]
Pobieranie

danych Przetwarzanie 

informacji
Wyświetlanie
Single Responsibility Principle [JS]
Pobieranie

danych Przetwarzanie 

informacji
Wyświetlanie
Single Responsibility Principle [JS]
Pobieranie

danych Przetwarzanie 

informacji
Wyświetlanie
Single Responsibility Principle [JS]
Single Responsibility Principle [JS]
Single Responsibility Principle [JS]
Single Responsibility Principle [JS]
Single Responsibility Principle [JS]
Single Responsibility Principle [JS]
Single Responsibility Principle [JS]
Single Responsibility Principle [JS]
Single Responsibility Principle [JS]
Open Close 

Principle
Open Close Principle [PHP]
Otwarte na rozszerzenia
Open Close Principle [PHP]
Otwarte na rozszerzenia
Zamknięte na modyfikacje
Open Close Principle [PHP]
Zachowanie ponad budowę
Open Close Principle [PHP]
Zachowanie ponad budowę
Skupienie się na abstrakcjach a nie na konkretnych
klasach (implementacjach)
Open Close Principle [PHP]
Open Close Principle [PHP]
Open Close Principle [PHP]
Open Close Principle [PHP]
Open Close Principle [PHP]
Open Close Principle [PHP]
Open Close Principle [JS]
Open Close Principle [JS]
Open Close Principle [JS]
Open Close Principle [JS]
Open Close Principle [JS]
Higher Order Function
Open Close Principle [JS]
Higher Order Function
Array.map

Array.reduce

Array.filter
Open Close Principle [JS]
Higher Order Function
Array.map

Array.reduce

Array.filter
lodash.debounce
Open Close Principle [JS]
Open Close Principle [JS]
Open Close Principle [JS]
Open Close Principle [JS]
Open Close Principle [JS]
Liskov

Substitution
Principle
Liskov Substitution Principle [PHP]
Dopełnienie OCP
Liskov Substitution Principle [PHP]
Dopełnienie OCP
Gwarancja kontraktu
Liskov Substitution Principle [PHP]
Liskov Substitution Principle [PHP]
Liskov Substitution Principle [PHP]
Liskov Substitution Principle [PHP]
✓
Liskov Substitution Principle [PHP]
Liskov Substitution Principle [PHP]
✓
Liskov Substitution Principle [PHP]
Liskov Substitution Principle [PHP]
Liskov Substitution Principle [PHP]
X
Liskov Substitution Principle [PHP]
—>
Liskov Substitution Principle [PHP]
✓
Liskov Substitution Principle [PHP]
—>
Liskov Substitution Principle [PHP]
—>
Liskov Substitution Principle [PHP]
X
—>
Liskov Substitution Principle [JS]
Funkcje które używają wskaźników lub referencji
do klas bazowych, muszą być w stanie używać
również obiektów klas dziedziczących po klasach
bazowych, bez dokładnej znajomości tych
obiektów.
Liskov Substitution Principle [JS]
Funkcje które używają wskaźników lub referencji
do klas bazowych, muszą być w stanie używać
również obiektów klas dziedziczących po klasach
bazowych, bez dokładnej znajomości tych
obiektów.
Liskov Substitution Principle [JS]
Funkcje które używają wskaźników lub referencji
do klas bazowych, muszą być w stanie używać
również obiektów klas dziedziczących po klasach
bazowych, bez dokładnej znajomości tych
obiektów.
Liskov Substitution Principle [JS]
Funkcje korzystające z obiektu
nie powinny sprawdzać jego typu
Liskov Substitution Principle [JS]
Liskov Substitution Principle [JS]
Liskov Substitution Principle [JS]
Czy obiekt ma pole `url`?
Liskov Substitution Principle [JS]
Czy obiekt ma pole `url`?
TAK
Wyświetl jako link
Liskov Substitution Principle [JS]
Czy obiekt ma pole `url`?
Wyświetl jako link Wyświetl jako listę
TAK NIE
Liskov Substitution Principle [JS]
Czy obiekt ma pole `url`?
Wyświetl jako link Czy ma pole `children`?
TAK NIE
TAK NIE
Liskov Substitution Principle [JS]
Liskov Substitution Principle [JS]
Interface

Segregation
Principle
Interface Segregation Principle [PHP]
Interface Segregation Principle [PHP]
Interface Segregation Principle [PHP]
Interface Segregation Principle [PHP]
Interface Segregation Principle [PHP]
Interface Segregation Principle [PHP]
Interface Segregation Principle [PHP]
Interface Segregation Principle [PHP]
Interface Segregation Principle [JS]
Interfejsy
Interface Segregation Principle [JS]
Kontrakty
Interface Segregation Principle [JS]
Interface Segregation Principle [JS]
Jak narysować postać na ekranie?
Interface Segregation Principle [JS]
Interface Segregation Principle [JS]
Interface Segregation Principle [JS]
Jakie dane są wymagane do narysowania gracza?
Interface Segregation Principle [JS]
Jakie dane są wymagane do narysowania gracza?
Czy funkcja wyświetli imię?
Interface Segregation Principle [JS]
Jakie dane są wymagane do narysowania gracza?
Czy funkcja wyświetli imię?
Czy korzystamy z informacji o perkach?
Interface Segregation Principle [JS]
Interface Segregation Principle [JS]
Dependency 

Inversion
Principle
Dependency Inversion Principle [PHP]
Moduły wysokopoziomowe
Dependency Inversion Principle [PHP]
Moduły wysokopoziomowe
Moduły niskopoziomowe
Dependency Inversion Principle [PHP]
Dependency Inversion Principle [PHP]
+
+
+
Dependency Inversion Principle [PHP]
Dependency Inversion Principle [PHP]
+
Dependency Inversion Principle [PHP]
+
Dependency Inversion Principle [PHP]
+
+
+
+
+
Dependency Inversion Principle [PHP]
+
+
X
Dependency Inversion Principle [PHP]
+
+
+
+
+
Dependency Inversion Principle [PHP]
+
+
+
+
+
Dependency Inversion Principle [PHP]
+
+
+
+
+
✓
Dependency Inversion Principle [JS]
Dependency Inversion Principle [JS]
Dependency Inversion Principle [JS]
Dependency Inversion Principle [JS]
Dependency Inversion Principle [JS]
Dependency Inversion Principle [JS]
Dependency Inversion Principle [JS]
L IO DS
Dziękujemy za uwagę

More Related Content

More from The Software House

Feature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScriptFeature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScriptThe Software House
 
Typowanie nominalne w TypeScript
Typowanie nominalne w TypeScriptTypowanie nominalne w TypeScript
Typowanie nominalne w TypeScriptThe Software House
 
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLAutomatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLThe Software House
 
Serverless Compose vs hurtownia danych
Serverless Compose vs hurtownia danychServerless Compose vs hurtownia danych
Serverless Compose vs hurtownia danychThe Software House
 
Testy API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciTesty API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciThe Software House
 
Jak skutecznie read model. Case study
Jak skutecznie read model. Case studyJak skutecznie read model. Case study
Jak skutecznie read model. Case studyThe Software House
 
Firestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny KrzemowejFirestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny KrzemowejThe Software House
 
Jak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzachJak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzachThe Software House
 
O łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.jsO łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.jsThe Software House
 
Amazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurzeAmazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurzeThe Software House
 
Od Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki koduOd Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki koduThe Software House
 
Co QA może i czego nie powinien się bać?
Co QA może i czego nie powinien się bać?Co QA może i czego nie powinien się bać?
Co QA może i czego nie powinien się bać?The Software House
 
Zmigrujmy 30 tys. użytkowników ze starego systemu. Co może pójść nie tak?
Zmigrujmy 30 tys. użytkowników ze starego systemu. Co może pójść nie tak?Zmigrujmy 30 tys. użytkowników ze starego systemu. Co może pójść nie tak?
Zmigrujmy 30 tys. użytkowników ze starego systemu. Co może pójść nie tak?The Software House
 
Pierwsza wycieczka nad jezioro (danych)
Pierwsza wycieczka nad jezioro (danych)Pierwsza wycieczka nad jezioro (danych)
Pierwsza wycieczka nad jezioro (danych)The Software House
 
A w więc chcesz zostać frontend developerem?
A w więc chcesz zostać frontend developerem?A w więc chcesz zostać frontend developerem?
A w więc chcesz zostać frontend developerem?The Software House
 
DynamoDB – podstawy modelowania danych dla opornych
DynamoDB – podstawy modelowania danych dla opornychDynamoDB – podstawy modelowania danych dla opornych
DynamoDB – podstawy modelowania danych dla opornychThe Software House
 
Komunikacja oparta o zdarzenia z wykorzystaniem AWS Event Bridge
Komunikacja oparta o zdarzenia z wykorzystaniem AWS Event BridgeKomunikacja oparta o zdarzenia z wykorzystaniem AWS Event Bridge
Komunikacja oparta o zdarzenia z wykorzystaniem AWS Event BridgeThe Software House
 
Jak poprawić Core Web Vitals w aplikacji Next.js
Jak poprawić Core Web Vitals w aplikacji Next.jsJak poprawić Core Web Vitals w aplikacji Next.js
Jak poprawić Core Web Vitals w aplikacji Next.jsThe Software House
 

More from The Software House (20)

Feature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScriptFeature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScript
 
Typowanie nominalne w TypeScript
Typowanie nominalne w TypeScriptTypowanie nominalne w TypeScript
Typowanie nominalne w TypeScript
 
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLAutomatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
 
Serverless Compose vs hurtownia danych
Serverless Compose vs hurtownia danychServerless Compose vs hurtownia danych
Serverless Compose vs hurtownia danych
 
Testy API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciTesty API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięci
 
Jak skutecznie read model. Case study
Jak skutecznie read model. Case studyJak skutecznie read model. Case study
Jak skutecznie read model. Case study
 
Firestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny KrzemowejFirestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny Krzemowej
 
Jak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzachJak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzach
 
Jak poskromić AWS?
Jak poskromić AWS?Jak poskromić AWS?
Jak poskromić AWS?
 
O łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.jsO łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.js
 
Amazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurzeAmazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurze
 
Od Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki koduOd Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki kodu
 
Co QA może i czego nie powinien się bać?
Co QA może i czego nie powinien się bać?Co QA może i czego nie powinien się bać?
Co QA może i czego nie powinien się bać?
 
Zmigrujmy 30 tys. użytkowników ze starego systemu. Co może pójść nie tak?
Zmigrujmy 30 tys. użytkowników ze starego systemu. Co może pójść nie tak?Zmigrujmy 30 tys. użytkowników ze starego systemu. Co może pójść nie tak?
Zmigrujmy 30 tys. użytkowników ze starego systemu. Co może pójść nie tak?
 
Pierwsza wycieczka nad jezioro (danych)
Pierwsza wycieczka nad jezioro (danych)Pierwsza wycieczka nad jezioro (danych)
Pierwsza wycieczka nad jezioro (danych)
 
A w więc chcesz zostać frontend developerem?
A w więc chcesz zostać frontend developerem?A w więc chcesz zostać frontend developerem?
A w więc chcesz zostać frontend developerem?
 
DynamoDB – podstawy modelowania danych dla opornych
DynamoDB – podstawy modelowania danych dla opornychDynamoDB – podstawy modelowania danych dla opornych
DynamoDB – podstawy modelowania danych dla opornych
 
Komunikacja oparta o zdarzenia z wykorzystaniem AWS Event Bridge
Komunikacja oparta o zdarzenia z wykorzystaniem AWS Event BridgeKomunikacja oparta o zdarzenia z wykorzystaniem AWS Event Bridge
Komunikacja oparta o zdarzenia z wykorzystaniem AWS Event Bridge
 
DIY: React.js od zera
DIY: React.js od zeraDIY: React.js od zera
DIY: React.js od zera
 
Jak poprawić Core Web Vitals w aplikacji Next.js
Jak poprawić Core Web Vitals w aplikacji Next.jsJak poprawić Core Web Vitals w aplikacji Next.js
Jak poprawić Core Web Vitals w aplikacji Next.js
 

Od frontu po backend. Dwa oblicza SOLIDnego kodu