29
Po co wymyślać koło na nowo – Lepsze wzorce projektowe Mateusz Konieczny

[FDD 2016] Mateusz Konieczny - Po co wymyślać koło na nowo? - Lepsze wzorce projektowe

Embed Size (px)

Citation preview

Po co wymyślać koło na nowo – Lepsze wzorce projektowe

Mateusz Konieczny

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

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

Mateusz Konieczny

Po co wymyślać koło na nowo – Lepsze wzorce projektowe

[email protected]