Upload
future-processing
View
46
Download
0
Embed Size (px)
Citation preview
Mateusz Konieczny
O mnie
Mateusz Konieczny
Programowanie obiektowe Wzorce projektowe Hobby – Implementacje zagadnień matematycznych
Po co wymyślać koło na nowo – Lepsze wzorce projektowe
Mateusz Konieczny
O czym będzie ta prezentacja
Wzorce projektowe Rozwiązanie powtarzalnych problemów projektowych Uniwersalne Sprawdzone w praktyce
Po co wymyślać koło na nowo – Lepsze wzorce projektowe
Mateusz Konieczny
Dlaczego właśnie taki temat?
Za każdym razem implementujemy wzorce „od zera” (również stosując metodę Kopiego-Pasta)
Implementacje są trudne do zrozumienia i pielęgnacji Czy można implementować „lepsze” wzorce projektowe?
Po co wymyślać koło na nowo – Lepsze wzorce projektowe
Mateusz Konieczny
Przykład
Kompozyt Drzewo obiektów
Po co wymyślać koło na nowo – Lepsze wzorce projektowe
Mateusz Konieczny
Kompozyt
Po co wymyślać koło na nowo – Lepsze wzorce projektowe
Drzewo wyrażenia matematycznego Hierarchia miejsc
+
∗1
2 3
Wyznacz wartość wyrażenia Miejsca które są zamkami
Województwo Śląskie Gliwice
FP Forum
Ogrodzieniec Zamek
Katowice Spodek Silesia MCK
Mateusz Konieczny
Kompozyt
Po co wymyślać koło na nowo – Lepsze wzorce projektowe
+
∗1
2 3
Evalute() : int GetCastles() : Place[]
Województwo Śląskie Gliwice
FP Forum
Ogrodzieniec Zamek
Katowice Spodek Silesia MCK
Mateusz Konieczny
Kompozyt
Po co wymyślać koło na nowo – Lepsze wzorce projektowe
+
∗1
2 3
Evalute() : int
DoOperation(int[]) : int
SubOperations() : Operation[]
GetCastles() : Place[]
Województwo Śląskie Gliwice
FP Forum
Ogrodzieniec Zamek
Katowice Spodek Silesia MCK
Mateusz Konieczny
Kompozyt
Po co wymyślać koło na nowo – Lepsze wzorce projektowe
+
∗1
2 3
Evalute() : int
DoOperation(int[]) : int
SubOperations() : Operation[]
GetCastles() : Place[]
IsCastle() : bool
SubPlaces() : Place[]
Województwo Śląskie Gliwice
FP Forum
Ogrodzieniec Zamek
Katowice Spodek Silesia MCK
Mateusz Konieczny
Kompozyt – problemy
Po co wymyślać koło na nowo – Lepsze wzorce projektowe
+
∗1
2 3
Evalute() : int
DoOperation(int[]) : int
SubOperations() : Operation[]
GetCastles() : Place[]
IsCastle() : bool
SubPlaces() : Place[]Duplikacja
Województwo Śląskie Gliwice
FP Forum
Ogrodzieniec Zamek
Katowice Spodek Silesia MCK
Mateusz Konieczny
Kompozyt – problemy
Po co wymyślać koło na nowo – Lepsze wzorce projektowe
+
∗1
2 3
Evalute() : int
DoOperation(int[]) : int
SubOperations() : Operation[]
GetCastles() : Place[]
IsCastle() : bool
SubPlaces() : Place[]Duplikacja
Województwo Śląskie Gliwice
FP Forum
Ogrodzieniec Zamek
Katowice Spodek Silesia MCK
SRP SRP
Mateusz Konieczny
Kompozyt – problemy
Po co wymyślać koło na nowo – Lepsze wzorce projektowe
+
∗1
2 3
Evalute() : int
DoOperation(int[]) : int
SubOperations() : Operation[]
GetCastles() : Place[]
IsCastle() : bool
SubPlaces() : Place[]Duplikacja
Województwo Śląskie Gliwice
FP Forum
Ogrodzieniec Zamek
Katowice Spodek Silesia MCK
SRP SRP
Mateusz Konieczny
Kompozyt - rozwiązanie
Po co wymyślać koło na nowo – Lepsze wzorce projektowe
Kompozyt
Mateusz Konieczny
Kompozyt - rozwiązanie
Po co wymyślać koło na nowo – Lepsze wzorce projektowe
Kompozyt
Operation Place
Mateusz Konieczny
Kompozyt - rozwiązanie
Po co wymyślać koło na nowo – Lepsze wzorce projektowe
Kompozyt
Operation Place
Evaluate GetCastles
int Place[]
Mateusz Konieczny
Kompozyt - implementacja
Po co wymyślać koło na nowo – Lepsze wzorce projektowe
+
∗1
2 3
public class Composite<TDomain> : List<Composite<TDomain>> { public TDomain Entity { get; set; } }
var composite = new Composite<Operation>(new Add()); var subComposite = new Composite<Operation>(new Multiply());
composite.Add(subComposite); var enumerator = composite.GetEnumerator();composite.Entity.DoOperation(1, 6);
Kompozyt
Domena
Metody
+
+
Mateusz Konieczny
Procesorkompozytu
Po co wymyślać koło na nowo – Lepsze wzorce projektowe
Jeśli „1”, to zwróć liczbę 1 Jeśli „2”, to zwróć liczbę 2 Jeśli „+”, to zwróć sumę dwóch
argumentów Jeśli „*”, to zwróć iloczyn dwóch
argumentów
string Place
Jeśli IsCastle, to dodaj do zamków Zawsze, nie rób nic
Predykat - Akcja
Mateusz Konieczny
Command
Po co wymyślać koło na nowo – Lepsze wzorce projektowe
public class Command<TDomain> { public Action<TDomain> Execute { get; set; } public Predicate<TDomain> CanExecute { get; set; } }
Jeśli „1”, to zwróć liczbę 1 Jeśli „2”, to zwróć liczbę 2 Jeśli „+”, to zwróć sumę dwóch
argumentów Jeśli „*”, to zwróć iloczyn dwóch
argumentów
Jeśli IsCastle, to dodaj do zamków Zawsze, nie rób nic
Predykat - Akcja
var command = new Command<Place> { Execute = place => castles.Add(place), CanExecute = place => place.IsCastle() };
Command
Domena+
Mateusz Konieczny
Lista Commandów
Po co wymyślać koło na nowo – Lepsze wzorce projektowe
Jeśli „1”, to zwróć liczbę 1 Jeśli „2”, to zwróć liczbę 2 Jeśli „+”, to zwróć sumę dwóch
argumentów Jeśli „*”, to zwróć iloczyn dwóch
argumentów
+ Forum
Jeśli IsCastle, to dodaj do zamków Zawsze, nie rób nic
Mateusz Konieczny
Chain of responsibility
Po co wymyślać koło na nowo – Lepsze wzorce projektowe
Jeśli „1”, to zwróć liczbę 1 Jeśli „2”, to zwróć liczbę 2 Jeśli „+”, to zwróć sumę dwóch
argumentów Jeśli „*”, to zwróć iloczyn dwóch
argumentów
Jeśli IsCastle, to dodaj do zamków Zawsze, nie rób nic
public class ChainOfResponsibility<TDomain> : List<Command<TDomain>> { public void Handle(TDomain request) { var command = this.First(c => c.CanExecute(request)); command.Execute(request); } }
Chainof
Responsibility
Mateusz Konieczny
Procesor kompozytów - Calculator
Po co wymyślać koło na nowo – Lepsze wzorce projektowe
+
∗1
2 3
Kompozyt
ResultCalculate
Lista reguł(Chain of Responsibility)
Województwo Śląskie Gliwice
FP Forum
Ogrodzieniec Zamek
Katowice Spodek Silesia MCK
Jeśli „1”, to zwróć liczbę 1 Jeśli „2”, to zwróć liczbę 2 Jeśli „+”, to zwróć sumę dwóch argumentów Jeśli „*”, to zwróć iloczyn dwóch argumentów
Mateusz Konieczny
Lepsze wzorce projektowe
Rozdzielność zachowań Jedna implementacja wzorca Możliwość szybkiego tworzenia
Nowych wzorców Bardziej wyspecjalizowanych rozwiązań
Ułatwiona utrzymywalność Oszczędność czasu
Po co wymyślać koło na nowo – Lepsze wzorce projektowe
D P
W
Mateusz Konieczny
Hipoteza
Rozdzielność zachowań Jedna implementacja wzorca
Po co wymyślać koło na nowo – Lepsze wzorce projektowe
D P
W
Wzorzec generyczny
Jeśli elementy wzorzec – domena – procesor
są rozdzielne
Mateusz Konieczny
Hipoteza
Po co wymyślać koło na nowo – Lepsze wzorce projektowe
D P
W
Wzorzec generyczny
Jeśli elementy wzorzec – domena – procesor
są rozdzielne
W
D
P
Kompozyt
W
P W
Calculator Command
Chain of
Responsibility
Mateusz Konieczny
Interpreter
Wzorzec: zazwyczaj kompozyt Procesor: metoda interpret(Context)
Po co wymyślać koło na nowo – Lepsze wzorce projektowe
D P
W
Mateusz Konieczny
Strategia
Wzorzec: interfejs Domena: metoda domenowa
Po co wymyślać koło na nowo – Lepsze wzorce projektowe
D P
W
Mateusz Konieczny
Wnioski Nie każdy wzorzec da się w pełni zgeneralizować Rozdzielność zachowań łatwiejsze tworzenie i pielęgnacja Unikać duplikacji zachowań uniwersalne rozwiązanie
Po co wymyślać koło na nowo – Lepsze wzorce projektowe
D P
WRóżne technologie i języki wprowadzają wzorce generyczne