Professional Documents
Culture Documents
Wzorce Projektowe
Wzorce Projektowe
przykładach
Czyli jak dobrze programować obiektowo
Agenda
1. Wstęp
2. Czym są wzorce projektowe?
a. Zarys historyczny.
b. Rodzaje wzorców.
c. Czy warto stosować wzorce projektowe?
3. Przypomnienie zasad programowania obiektowego.
a. Cechy złego projektu obiektowego.
b. Podstawowe założenia programowania obiektowego.
c. Zasady SOLID.
4. Przedstawienie wybranych wzorców projektowych.
a. Wzorce konstrukcyjne.
b. Wzorce operacyjne.
c. Wzorce strukturalne.
Wstęp
Wstęp
SOLID OOP
Wstęp - Polecana literatura
Czym są wzorce projektowe?
Zarys historyczny
Czym są wzorce projektowe?
● Abstrakcja
● Hermetyzacja
● Polimorfizm
● Dziedziczenie
Hermetyzacja
● Każda odpowiedzialność jest osią zmian. Gdy zmienią się wymagania, będzie to
manifestowane poprzez zmianę odpowiedzialności pomiędzy klasami.
● Gdy klasa ma więcej niż jedną odpowiedzialność, to dochodzi do sprzężeń. Zmiany w
jednej odpowiedzialności mogą spowodować regresję w innej (kruchość).
OCP - Open Closed
“Klasa powinna być otwarta na rozszerzenie, ale zamknięta na modyfikacje.”
● Nowe funkcjonalności (np. polityka podatkowa w kraju nowego klienta) nie powinny
powodować zmiany kodu starych struktur poprzez dodanie kolejnego ifa. Nowa
funkcjonalność oznacza kolejną klasę rozszerzającą (polimorfizm).
● Zmiana w jednym miejscu nie powinna powodować kaskadowych zmian w innych
(hermetyzacja).
LSP - Liscov Substitution
“Musi istnieć możliwość podstawienia typów pochodnych za ich typy bazowe.”
● Każda nadklasa powinna przechodzić pozytywnie wszystkie testy, które przechodzą jej
podklasy.
ISP - Interface Segregation
“Wiele dedykowanych interfejsów jest lepsze niż jeden ogólny.”
● Lepiej jest tworzyć wiele małych interfejsów posiadających niewielką ilość metod. Duża
ilość metod powoduje brak spójności.
● Interfejs powinien być dostosowany do potrzeb klienta, który go używa. Interfejs jest
bardziej powiązany z klientem niż z implementacją. Zestaw metod zależy od potrzeb
klienta.
DIP - Dependency inversion
“Wysokopoziomowe moduły nie powinny zależeć od modułów
niskopoziomowych - zależność pomiędzy nimi powinna wynikać z abstrakcji.”
W przypadku ciężkich Singletonów chcemy, aby były tworzone wtedy gdy ich
potrzebujemy.
Singleton - przykład (lazy initialization)
“Określa zależność jeden do wielu między obiektami. Kiedy zmieni się stan
jednego z obiektów, wszystkie obiekty zależne od niego są automatycznie
powiadamiane i aktualizowane”
“In Null Object pattern, a null object replaces check of NULL object instance.
Instead of puttin if check for a null value, Null Object reflects a do nothing
relationship. Such Null object can also be used to provide default behaviour in
case data is not available”
~Tutorials Point
Pusty Obiekt - przykład
Pusty Obiekt
● Zwracanie wartości null z bazy danych lub fabryki powoduje powstanie
bardzo dużej ilości kodu defensywnego, który rozlewa się po całym systemie.
Programiści często zapominają o napisaniu go co powoduje błędy w
systemie.
● To, której instancji Pustego Obiektu użyjemy nie ma żadnego znaczenia,
ponieważ zawsze wykonuje on operacje zdefiniowane przez interfejs w
sposób neutralny, dlatego zaimplementowanie Pustego Obiektu jako
singletonu dodatkowo poprawia wydajność.
Pusty Obiekt - struktura
Pusty Obiekt - przykład
Pusty Obiekt - przykład
Wzorce strukturalne
Kompozyt
Fasada skrywa złożoność systemu wystawiając jednolity interfejs ułatwiający korzystanie z niego.
Fasada - przykład
Fasada - przykład
Fasada
● Fasada jest niezwykle prostym i intuicyjnym wzorcem projektowym.
● Przykłady jej wykorzystania można mnożyć zarówno na poziomie bibliotek jak
i architektury.
● Fasada oddziela kod klienta od kodu modułu i zapewnia pomiędzy nimi
luźniejsze powiązanie.
● Ułatwia podział systemu na moduły.
● Wszystko co jest izolowane fasadą powinny być niedostępne dla klientów
(dostęp pakietowy, którego w kotlinie nie ma :( ).
Dziękuje za uwagę
Czy są jakieś pytania?