SlideShare une entreprise Scribd logo
1  sur  133
QUALITY EXCITES 2015
30 MAJA 2015
GRZEGORZ GAŁĘZOWSKI
MOTOROLA SOLUTIONS
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?
I argue that there are not different
kinds of TDD. There are different
design conventions, and you pick the
testing techniques and tools most
appropriate for the conventions you’re
working in.
Nat Pryce
https://groups.google.com/forum/#!topic/clean-code-discussion/A6sJQjnwvnA
PROJEKTOWANIE
KOMPOZYCJONALNEPO CO (TAK NAPRAWDĘ) MI TE MOCKI?
31 MAJA 2014
GRZEGORZ GAŁĘZOWSKI
MOTOROLA SOLUTIONS
KOMPOZYCYJNOŚĆ
I ZASTĘPOWALNOŚĆ
Z PERSPEKTYWY OBIEKTU
KOMPOZYCJA = ZACHOWANIE
KONTEKST, ROLE, INTERFEJSY
ROLA 2
ROLA 3
ROLA 1
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?
ROLA 2
ROLA 3
ROLA 1
KOMPOZYCYJNOŚĆ
ROLA 2
ROLA 3
ROLA 1
ZASTĘPOWALNOŚĆ
KOMPOZYCYJNOŚĆKOMPOZYCYJNOŚĆMIN MAX
......MIN MAX
......MIN MAX
KOMPOZYCYJNOŚĆKOMPOZYCYJNOŚĆMIN MAX
......MIN MAX
......MIN MAX
KOMPOZYCYJNOŚĆKOMPOZYCYJNOŚĆMIN MAX
......MIN MAX
......MIN MAX
Kompozycyjność:
Używaj interfejsów jako
„nazwanych slotów”
Kompozycyjność:
Używaj interfejsów jako
„nazwanych slotów”
KOMPOZYCYJNOŚĆKOMPOZYCYJNOŚĆMIN MAX
......MIN MAX
......MIN MAX
Kompozycyjność:
Optymalizuj design pod kątem
łatwej zmiany kontekstu
Kompozycyjność:
Optymalizuj design pod kątem
łatwej zmiany kontekstu
SIEĆ
OBIEKTÓW
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?
Interakcje:
Ważniejsza od obiektów jest
komunikacja między nimi
Interakcje:
Ważniejsza od obiektów jest
komunikacja między nimi
ŁĄCZENIE
OBIEKTÓW
public class Sender
{
readonly Recipient recipient;
public Sender()
{
recipient = new ConcreteRecipient();
}
...
}
Tworzenie
Użycie
Tworzenie
Użycie
UżycieUżycie
public class Sender
{
Recipient recipient;
public Sender(Recipient recipient)
{
this.recipient = recipient;
}
...
}
KONSTRUKTOR
public class Sender
{
List<Recipient> observers
= new List<Recipient>();
public ReportAllTo(Recipient observer)
{
this.observers.Add(observer);
}
...
}
REJESTRACJA
public class Sender
{
public void Do(Recipient recipient)
{
recipient.Help();
}
...
}
PRZEKAZANIE W WIADOMOŚCI
public class Sender
{
RecipientFactory factory;
public void Do(Context context)
{
recipient = factory.CreateFrom(context);
recipient.Help();
}
...
}
FABRYKA
ROLA 4
ROLA 3
ROLA 1
ROLA 2
ROLA 4
ROLA 3
ROLA 1
ROLA 2
Oddziel tworzenie od użycia:
Otwórz logikę na różne implementacje
Oddziel tworzenie od użycia:
Otwórz logikę na różne implementacje
UżycieUżycie
TworzenieTworzenie
KORZEŃ
KOMPOZYCJI
new SecureArea(
new OfficeBuilding(
new DayNightSwitchedAlarm(
new SilentAlarm("222-333-444"),
new LoudAlarm()
)
),
new StorageBuilding(
new HybridAlarm(
new SilentAlarm("222-333-444"),
new LoudAlarm()
)
),
new GuardsBuilding(
new HybridAlarm(
new SilentAlarm("919"), //call police
new LoudAlarm()
)
)
);
INTERFEJSY
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?
INTERFEJSY
●
STABILNOŚĆ
DOBRA ABSTRAKCJA?
public interface EmployeeRepository
{
IEnumerable<Employee> Load(MsSqlConnection c);
}
DOBRA ABSTRAKCJA?
public interface EmployeeRepository
{
IEnumerable<Employee> Load();
}
DOBRA ABSTRAKCJA?
public interface Employee
{
int GetAge();
string GetName();
string GetSurname();
decimal GetPay();
void SetPay(decimal newPay);
PayGrade GetPayGrade();
}
DOBRA ABSTRAKCJA?
public interface Employee
{
bool IsEligibleForRetirement();
bool IsAt(PayGrade payGrade);
EmployeeName GetName();
Money GetPay();
void SetPay(Money money);
}
DOBRA ABSTRAKCJA?
public interface Employee
{
void GiveRaise(RaiseFactor factor);
void EvaluateRetirement();
void SendTo(Destination d);
}
DOBRA ABSTRAKCJA?
public class NullEmployee : Employee
{
void GiveRaise(RaiseFactor factor) {}
void EvaluateRetirement() {}
void SendTo(Destination d) {}
}
DOBRA ABSTRAKCJA?
public class NullEmployee : Employee
{
void GiveRaise(RaiseFactor factor) {}
void EvaluateRetirement() {}
void SendTo(Destination d) {}
} Stabilne Interfejsy:
optymalizuj pod kątem łatwości
tworzenia nowych implementacji
Stabilne Interfejsy:
optymalizuj pod kątem łatwości
tworzenia nowych implementacji
INTERFEJSY
●
ROZMIAR
Read()
Modify()
Read()
Modify()
Read()
Modify()
Read()
Modify()
Read()
Modify()
Read()
Write()
Małe interfejsy:
agresywnie refaktoryzuj interfejsy
do łatwiej implementowalnych
Małe interfejsy:
agresywnie refaktoryzuj interfejsy
do łatwiej implementowalnych
PROTOKOŁY
public class Message
{
private byte[] data;
//...
public void SendThrough(Connection c)
{
c.Open();
c.Send(data);
c.Close();
}
//...
}
public class WrongConnection : Connection
{
//...
public void Open()
{
this.socket.Close();
}
public void Send(byte[] data) { ... }
public void Close()
{
this.socket.Open();
}
}
STABILNOŚĆ
PROTOKOŁÓW
GetX()
return x;
IsY()
return true;
GetZ()
return z;
IsV()
return false;
GetX()
return x;
IsY()
return true;
GetZ()
return z;
IsV()
return false;
GetZ()
return z;
IsV()
return false;
Open()
Send(data)
Close()
Open()
Send(data)
Close()
Open()
Send(data)
Close()
Open()
Send(data)
Close()
Stabilne Protokoły:
protokoły powinny wytrzymać zmianę
detali implementacji
Stabilne Protokoły:
protokoły powinny wytrzymać zmianę
detali implementacji
Open()
Send(data)
Close()
„DETAL IMPLEMENTACYJNY”..?
STABILNE
PROTOKOŁY
●
PROSTE
●
ABSTRAKCYJNE
●
LOGICZNE
●
DOMENOWE
STABILNE
PROTOKOŁY
●
INTENCJA NADAWCY
accessGuard.SetLogin(login);
accessGuard.SetPassword(password);
accessGuard.LogIn();
„MOŻE KTOŚ, KIEDYŚ...”
accessGuard.LogInWith(login, password);
JEDNA WIADOMOŚĆ
STABILNE
PROTOKOŁY
●
TELL DON'T ASK
bool wasWrittenInAmericanEnglish = message
.GetWrappedFrame()
.GetHeader()
.GetLocale() == "en-US";
TRUDNO ZASTĄPIĆ
messagemessage .GetWrappedFrame() .GetHeader().GetHeader() .GetLocale().GetLocale()
messagemessage
TRUDNO ZASTĄPIĆ
.GetWrappedFrame() .GetHeader().GetHeader() .GetLocale().GetLocale()
TRUDNO ZASTĄPIĆ
messagemessage .GetWrappedFrame() .GetHeader().GetHeader() .GetLocale().GetLocale()
STABILNE
PROTOKOŁY
●
ZGODNE Z DZIEDZINĄ
PROBLEMU
public void OnAlarmTriggered()
{
try
{
gates.CloseAll();
sirens.TurnOn();
specialForces.NotifyWith(Priorities.High);
}
catch(SecurityFailure failure)
{
powerSystem.TurnOffBecauseOf(failure);
}
}
public void OnAlarmTriggered()
{
try
{
gates.CloseAll();
sirens.TurnOn();
specialForces.NotifyWith(Priorities.High);
}
catch(SecurityFailure failure)
{
powerSystem.TurnOffBecauseOf(failure);
}
}
Modelowanie dziedziny:
protokoły naśladujące dziedzinę
problemu mają jej stabilność
Modelowanie dziedziny:
protokoły naśladujące dziedzinę
problemu mają jej stabilność
STABILNE
PROTOKOŁY
●
MAŁE I ABSTRAKCYJNE
MAŁY INTERFEJS
public interface Interpreter
{
void Execute(string command);
}
DUŻY PROTOKÓŁ
public void RunScript()
{
this.interpreter.Execute("cd dir1");
this.interpreter.Execute("copy *.cs ../../dir2/src");
this.interpreter.Execute("copy *.xml ../../dir2/config");
this.interpreter.Execute("cd ../../dir2/");
this.interpreter.Execute("compile *.cs");
this.interpreter.Execute("cd dir3");
this.interpreter.Execute("copy *.cs ../../dir4/src");
this.interpreter.Execute("copy *.xml ../../dir4/config");
this.interpreter.Execute("cd ../../dir4/");
this.interpreter.Execute("compile *.cs");
this.interpreter.Execute("cd dir5");
this.interpreter.Execute("copy *.cs ../../dir6/src");
this.interpreter.Execute("copy *.xml ../../dir6/config");
this.interpreter.Execute("cd ../../dir6/");
this.interpreter.Execute("compile *.cs");
}
KLASY
●
POJEDYNCZA
ODPOWIEDZIALNOŚĆ
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?
Jedna Odpowiedzialność:
Odpowiedzialności
są jednostkami kompozycji
Jedna Odpowiedzialność:
Odpowiedzialności
są jednostkami kompozycji
KLASY
●
STATYCZNI WSPÓŁPRACOWNICY
KONTEKST, ROLE, INTERFEJSY
ROLA
<<static>>
KONTEKST, ROLE, INTERFEJSY
<<static>>
KONTEKST, ROLE, INTERFEJSY
<<static>>
OGRANICZONA KOMPOZYCYJNOŚĆ
<<static>>
MY CHCEMY TEGO!
MY CHCEMY TEGO!
Usuń statyczne zależności:
ograniczają kompozycyjność
Usuń statyczne zależności:
ograniczają kompozycyjność
JĘZYK
WYŻSZEGO
POZIOMU
new SecureArea(
new OfficeBuilding(
new DayNightSwitchedAlarm(
new SilentAlarm("222-333-444"),
new LoudAlarm()
)
),
new StorageBuilding(
new HybridAlarm(
new SilentAlarm("222-333-444"),
new LoudAlarm()
)
),
new GuardsBuilding(
new HybridAlarm(
new SilentAlarm("919"), //call police
new LoudAlarm()
)
)
);
new SecureArea(
new OfficeBuilding(
new DayNightSwitchedAlarm(
new SilentAlarm("222-333-444"),
new LoudAlarm()
)
),
new StorageBuilding(
Both(
new SilentAlarm("222-333-444"),
new LoudAlarm()
)
),
new GuardsBuilding(
Both(
new SilentAlarm("919"), //call police
new LoudAlarm()
)
)
);
new SecureArea(
new OfficeBuilding(
new DayNightSwitchedAlarm(
new SilentAlarm("222-333-444"),
new LoudAlarm()
)
),
new StorageBuilding(
Both(
new SilentAlarm("222-333-444"),
new LoudAlarm()
)
),
new GuardsBuilding(
Both(
new SilentAlarm("919"), //call police
new LoudAlarm()
)
)
);
new SecureArea(
new OfficeBuilding(
new DayNightSwitchedAlarm(
Call("222-333-444"),
new LoudAlarm()
)
),
new StorageBuilding(
Both(
Call("222-333-444"),
new LoudAlarm()
)
),
new GuardsBuilding(
Both(
Call("919"), //call police
new LoudAlarm()
)
)
);
new SecureArea(
new OfficeBuilding(
new DayNightSwitchedAlarm(
Call("222-333-444"),
new LoudAlarm()
)
),
new StorageBuilding(
Both(
Call("222-333-444"),
new LoudAlarm()
)
),
new GuardsBuilding(
Both(
Call("919"), //call police
new LoudAlarm()
)
)
);
new SecureArea(
new OfficeBuilding(
new DayNightSwitchedAlarm(
Call("222-333-444"),
PlaySirens()
)
),
new StorageBuilding(
Both(
Call("222-333-444"),
PlaySirens()
)
),
new GuardsBuilding(
Both(
Call("919"), //call police
PlaySirens()
)
)
);
new SecureArea(
new OfficeBuilding(
new DayNightSwitchedAlarm(
Call("222-333-444"),
PlaySirens()
)
),
new StorageBuilding(
Both(
Call("222-333-444"),
PlaySirens()
)
),
new GuardsBuilding(
Both(
Call("919"), //call police
PlaySirens()
)
)
);
new SecureArea(
new OfficeBuilding(
DependingOnTimeOfDay(
duringDay: Call("222-333-444"),
atNight: PlaySirens()
)
),
new StorageBuilding(
Both(
Call("222-333-444"),
PlaySirens()
)
),
new GuardsBuilding(
Both(
Call("919"), //call police
PlaySirens()
)
)
);
new SecureArea(
OnOfficeEntered(
DependingOnTimeOfDay(
duringDay: Call("222-333-444"),
atNight: PlaySirens()
)
),
OnStorageEntered(
Both(
Call("222-333-444"),
PlaySirens()
)
),
OnGuardsBuildingEntered(
Both(
Call("919"), //call police
PlaySirens()
)
)
);
new SecureArea(
OnOfficeEntered(
DependingOnTimeOfDay(
duringDay: Call("222-333-444"),
atNight: PlaySirens()
)
),
OnStorageEntered(
Both(
Call("222-333-444"),
PlaySirens()
)
),
OnGuardsBuildingEntered(
Both(
Call("919"), //call police
PlaySirens()
)
)
);
new SecureArea(
OnOfficeEntered(
DependingOnTimeOfDay(
duringDay: Call(Guards),
atNight: PlaySirens()
)
),
OnStorageEntered(
Both(
Call(Guards),
PlaySirens()
)
),
OnGuardsBuildingEntered(
Both(
Call(Police),
PlaySirens()
)
)
);
new SecureArea(
OnOfficeEntered(
DependingOnTimeOfDay(
duringDay: Call(Guards),
atNight: PlaySirens()
)
),
OnStorageEntered(
Both(
Call(Guards),
PlaySirens()
)
),
OnGuardsBuildingEntered(
Both(
Call(Police),
PlaySirens()
)
)
);
Język Wyższego Poziomu:
Programuj na wyższym
poziomie abstrakcji
Język Wyższego Poziomu:
Programuj na wyższym
poziomie abstrakcji
Z CZEGO SKŁADAMY SAMOCHODY?
●
SILNIK
●
KOŁA
●
TARCZE
●
WYCIERACZKI
●
NIE MYŚLIMY W KATEGORIACH
ŚRUBEK!
Z CZEGO SKŁADAMY SAMOCHODY?
●
SILNIK
●
KOŁA
●
TARCZE
●
WYCIERACZKI
●
NIE MYŚLIMY W KATEGORIACH
ŚRUBEK!
Kompozycjonalność:
Dodawaj reguły dziedziny
używając komponentów dziedziny
Kompozycjonalność:
Dodawaj reguły dziedziny
używając komponentów dziedziny
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?
public ConfigUpdates CreateUpdates()
{
return ConfigurationUpdates(
Of(log),
Of(localSettings),
OfResource(Devices()),
OfResource(Groups())
);
}
public ConfigUpdates CreateUpdates()
{
return ConfigurationUpdates(
Of(log),
Of(localSettings),
OfResource(Devices()),
OfResource(Groups())
);
}
Języki, nie język:
Podziel kompozycję na serię
małych specyficznych języków
Języki, nie język:
Podziel kompozycję na serię
małych specyficznych języków
WNIOSKI
Interakcje to nie detal
implementacyjny
Testowanie protokołów ma sens
Testowanie w kontekście
który łatwo kontrolować
Testowanie w kontekście
bez efektów ubocznych
Projektowanie protokołów
„od zewnątrz”
Odkrywanie interfejsów
na podstawie potrzeby
SUTSUT
SUTSUT
MOCK
MOCK
MOCK MOCK
TESTTEST
[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?

Contenu connexe

En vedette

العرض التكنولوجيا الأطفال
العرض التكنولوجيا الأطفال العرض التكنولوجيا الأطفال
العرض التكنولوجيا الأطفال hadeel88
 
[Quality Meetup #9] Testowanie w świecie ontologii - A. Ostaszewska-Smykała, ...
[Quality Meetup #9] Testowanie w świecie ontologii - A. Ostaszewska-Smykała, ...[Quality Meetup #9] Testowanie w świecie ontologii - A. Ostaszewska-Smykała, ...
[Quality Meetup #9] Testowanie w świecie ontologii - A. Ostaszewska-Smykała, ...Future Processing
 
العرض
العرضالعرض
العرضhadeel88
 
العرض
العرضالعرض
العرضhadeel88
 
العرض
العرضالعرض
العرضhadeel88
 
[QE 2015] Mateusz Sulima - Kręta droga do dobrych testów
[QE 2015] Mateusz Sulima - Kręta droga do dobrych testów[QE 2015] Mateusz Sulima - Kręta droga do dobrych testów
[QE 2015] Mateusz Sulima - Kręta droga do dobrych testówFuture Processing
 
[QE 2015] Sam Elamin - Monoliths to microservices - a journey
[QE 2015] Sam Elamin - Monoliths to microservices - a journey[QE 2015] Sam Elamin - Monoliths to microservices - a journey
[QE 2015] Sam Elamin - Monoliths to microservices - a journeyFuture Processing
 
New microsoft office power point presentation (3)
New microsoft office power point presentation (3)New microsoft office power point presentation (3)
New microsoft office power point presentation (3)swpuri319
 
Jenkins – przyjaciel każdego testera.
Jenkins – przyjaciel każdego testera.Jenkins – przyjaciel każdego testera.
Jenkins – przyjaciel każdego testera.Future Processing
 
العرض
العرضالعرض
العرضhadeel88
 
العرض
العرضالعرض
العرضhadeel88
 
[QE 2015] Krystian Kaczor - Wymagania w Agile
[QE 2015] Krystian Kaczor - Wymagania w Agile[QE 2015] Krystian Kaczor - Wymagania w Agile
[QE 2015] Krystian Kaczor - Wymagania w AgileFuture Processing
 
Galileo galiliei by daniela garcia
Galileo galiliei by daniela garciaGalileo galiliei by daniela garcia
Galileo galiliei by daniela garciadgarcia0662
 
[FDD 2016] Kamil Dworak - Przetwarzanie danych pomiarowych w tle z wykorzysta...
[FDD 2016] Kamil Dworak - Przetwarzanie danych pomiarowych w tle z wykorzysta...[FDD 2016] Kamil Dworak - Przetwarzanie danych pomiarowych w tle z wykorzysta...
[FDD 2016] Kamil Dworak - Przetwarzanie danych pomiarowych w tle z wykorzysta...Future Processing
 

En vedette (14)

العرض التكنولوجيا الأطفال
العرض التكنولوجيا الأطفال العرض التكنولوجيا الأطفال
العرض التكنولوجيا الأطفال
 
[Quality Meetup #9] Testowanie w świecie ontologii - A. Ostaszewska-Smykała, ...
[Quality Meetup #9] Testowanie w świecie ontologii - A. Ostaszewska-Smykała, ...[Quality Meetup #9] Testowanie w świecie ontologii - A. Ostaszewska-Smykała, ...
[Quality Meetup #9] Testowanie w świecie ontologii - A. Ostaszewska-Smykała, ...
 
العرض
العرضالعرض
العرض
 
العرض
العرضالعرض
العرض
 
العرض
العرضالعرض
العرض
 
[QE 2015] Mateusz Sulima - Kręta droga do dobrych testów
[QE 2015] Mateusz Sulima - Kręta droga do dobrych testów[QE 2015] Mateusz Sulima - Kręta droga do dobrych testów
[QE 2015] Mateusz Sulima - Kręta droga do dobrych testów
 
[QE 2015] Sam Elamin - Monoliths to microservices - a journey
[QE 2015] Sam Elamin - Monoliths to microservices - a journey[QE 2015] Sam Elamin - Monoliths to microservices - a journey
[QE 2015] Sam Elamin - Monoliths to microservices - a journey
 
New microsoft office power point presentation (3)
New microsoft office power point presentation (3)New microsoft office power point presentation (3)
New microsoft office power point presentation (3)
 
Jenkins – przyjaciel każdego testera.
Jenkins – przyjaciel każdego testera.Jenkins – przyjaciel każdego testera.
Jenkins – przyjaciel każdego testera.
 
العرض
العرضالعرض
العرض
 
العرض
العرضالعرض
العرض
 
[QE 2015] Krystian Kaczor - Wymagania w Agile
[QE 2015] Krystian Kaczor - Wymagania w Agile[QE 2015] Krystian Kaczor - Wymagania w Agile
[QE 2015] Krystian Kaczor - Wymagania w Agile
 
Galileo galiliei by daniela garcia
Galileo galiliei by daniela garciaGalileo galiliei by daniela garcia
Galileo galiliei by daniela garcia
 
[FDD 2016] Kamil Dworak - Przetwarzanie danych pomiarowych w tle z wykorzysta...
[FDD 2016] Kamil Dworak - Przetwarzanie danych pomiarowych w tle z wykorzysta...[FDD 2016] Kamil Dworak - Przetwarzanie danych pomiarowych w tle z wykorzysta...
[FDD 2016] Kamil Dworak - Przetwarzanie danych pomiarowych w tle z wykorzysta...
 

Similaire à [QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?

JDD2015: DDD w praktyce, czyli jak wdrażamy i uczymy się DDD w Allegro - Krzy...
JDD2015: DDD w praktyce, czyli jak wdrażamy i uczymy się DDD w Allegro - Krzy...JDD2015: DDD w praktyce, czyli jak wdrażamy i uczymy się DDD w Allegro - Krzy...
JDD2015: DDD w praktyce, czyli jak wdrażamy i uczymy się DDD w Allegro - Krzy...PROIDEA
 
[PL] Jak programować aby nie zwariować
[PL] Jak programować aby nie zwariować[PL] Jak programować aby nie zwariować
[PL] Jak programować aby nie zwariowaćJakub Marchwicki
 
Patterns for organic architecture
Patterns for organic architecturePatterns for organic architecture
Patterns for organic architectureJaroslaw Palka
 
MVP - Model View Presenter (polish)
MVP - Model View Presenter (polish)MVP - Model View Presenter (polish)
MVP - Model View Presenter (polish)Przemyslaw Lusnia
 
Wykorzystanie chmury Microsoft Azure w scenariuszach dev&test
Wykorzystanie chmury Microsoft Azure w scenariuszach dev&testWykorzystanie chmury Microsoft Azure w scenariuszach dev&test
Wykorzystanie chmury Microsoft Azure w scenariuszach dev&testJarek Sokolnicki
 
Tworzenie i utrzymywanie czystego kodu
Tworzenie i utrzymywanie czystego koduTworzenie i utrzymywanie czystego kodu
Tworzenie i utrzymywanie czystego kodupabloware
 
WUD 2009 - Testowanie użyteczności aplikacji translatorskich na przykładzie t...
WUD 2009 - Testowanie użyteczności aplikacji translatorskich na przykładzie t...WUD 2009 - Testowanie użyteczności aplikacji translatorskich na przykładzie t...
WUD 2009 - Testowanie użyteczności aplikacji translatorskich na przykładzie t...World Usability Day Tour 2009
 
Krzysztof Moskwa - Podstawy metod zwinnych: jak to działa? Story points, czyl...
Krzysztof Moskwa - Podstawy metod zwinnych: jak to działa? Story points, czyl...Krzysztof Moskwa - Podstawy metod zwinnych: jak to działa? Story points, czyl...
Krzysztof Moskwa - Podstawy metod zwinnych: jak to działa? Story points, czyl...PMI Szczecin
 

Similaire à [QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki? (11)

JDD2015: DDD w praktyce, czyli jak wdrażamy i uczymy się DDD w Allegro - Krzy...
JDD2015: DDD w praktyce, czyli jak wdrażamy i uczymy się DDD w Allegro - Krzy...JDD2015: DDD w praktyce, czyli jak wdrażamy i uczymy się DDD w Allegro - Krzy...
JDD2015: DDD w praktyce, czyli jak wdrażamy i uczymy się DDD w Allegro - Krzy...
 
DSL - DYI
DSL - DYIDSL - DYI
DSL - DYI
 
C#. Wzorce projektowe
C#. Wzorce projektoweC#. Wzorce projektowe
C#. Wzorce projektowe
 
[PL] Jak programować aby nie zwariować
[PL] Jak programować aby nie zwariować[PL] Jak programować aby nie zwariować
[PL] Jak programować aby nie zwariować
 
Patterns for organic architecture
Patterns for organic architecturePatterns for organic architecture
Patterns for organic architecture
 
MVP - Model View Presenter (polish)
MVP - Model View Presenter (polish)MVP - Model View Presenter (polish)
MVP - Model View Presenter (polish)
 
Wykorzystanie chmury Microsoft Azure w scenariuszach dev&test
Wykorzystanie chmury Microsoft Azure w scenariuszach dev&testWykorzystanie chmury Microsoft Azure w scenariuszach dev&test
Wykorzystanie chmury Microsoft Azure w scenariuszach dev&test
 
Tworzenie i utrzymywanie czystego kodu
Tworzenie i utrzymywanie czystego koduTworzenie i utrzymywanie czystego kodu
Tworzenie i utrzymywanie czystego kodu
 
WUD 2009 - Testowanie użyteczności aplikacji translatorskich na przykładzie t...
WUD 2009 - Testowanie użyteczności aplikacji translatorskich na przykładzie t...WUD 2009 - Testowanie użyteczności aplikacji translatorskich na przykładzie t...
WUD 2009 - Testowanie użyteczności aplikacji translatorskich na przykładzie t...
 
01 - Wprowadzenie do TDD
01 - Wprowadzenie do TDD01 - Wprowadzenie do TDD
01 - Wprowadzenie do TDD
 
Krzysztof Moskwa - Podstawy metod zwinnych: jak to działa? Story points, czyl...
Krzysztof Moskwa - Podstawy metod zwinnych: jak to działa? Story points, czyl...Krzysztof Moskwa - Podstawy metod zwinnych: jak to działa? Story points, czyl...
Krzysztof Moskwa - Podstawy metod zwinnych: jak to działa? Story points, czyl...
 

Plus de Future Processing

DPTO_Inżynieria oprogramowania to proces uczenia się.pdf
DPTO_Inżynieria oprogramowania to proces uczenia się.pdfDPTO_Inżynieria oprogramowania to proces uczenia się.pdf
DPTO_Inżynieria oprogramowania to proces uczenia się.pdfFuture Processing
 
DPTO_QA w świecie wartości biznesowych.pdf
DPTO_QA w świecie wartości biznesowych.pdfDPTO_QA w świecie wartości biznesowych.pdf
DPTO_QA w świecie wartości biznesowych.pdfFuture Processing
 
DPTO_Hello_Clean_Architekture.pdf
DPTO_Hello_Clean_Architekture.pdfDPTO_Hello_Clean_Architekture.pdf
DPTO_Hello_Clean_Architekture.pdfFuture Processing
 
[Quality Meetup #20] Michał Górski - Continuous Deployment w chmurze
[Quality Meetup #20] Michał Górski - Continuous Deployment w chmurze[Quality Meetup #20] Michał Górski - Continuous Deployment w chmurze
[Quality Meetup #20] Michał Górski - Continuous Deployment w chmurzeFuture Processing
 
[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake
[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake
[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shakeFuture Processing
 
[Quality Meetup #19] Magdalena Drechsler-Nowak - Tester w pułapce myślenia
[Quality Meetup #19] Magdalena Drechsler-Nowak - Tester w pułapce myślenia[Quality Meetup #19] Magdalena Drechsler-Nowak - Tester w pułapce myślenia
[Quality Meetup #19] Magdalena Drechsler-Nowak - Tester w pułapce myśleniaFuture Processing
 
[Quality Meetup #19] Adrian Gonciarz - Testerska ruletka
[Quality Meetup #19] Adrian Gonciarz - Testerska ruletka[Quality Meetup #19] Adrian Gonciarz - Testerska ruletka
[Quality Meetup #19] Adrian Gonciarz - Testerska ruletkaFuture Processing
 
[FDD 2018] Krzysztof Sikora - Jak Service Fabric rozwiąże twoje problemy z mi...
[FDD 2018] Krzysztof Sikora - Jak Service Fabric rozwiąże twoje problemy z mi...[FDD 2018] Krzysztof Sikora - Jak Service Fabric rozwiąże twoje problemy z mi...
[FDD 2018] Krzysztof Sikora - Jak Service Fabric rozwiąże twoje problemy z mi...Future Processing
 
[FDD 2018] Ł. Turchan, A. Hulist, M. Duchnowski - CUDA - results over coffee ...
[FDD 2018] Ł. Turchan, A. Hulist, M. Duchnowski - CUDA - results over coffee ...[FDD 2018] Ł. Turchan, A. Hulist, M. Duchnowski - CUDA - results over coffee ...
[FDD 2018] Ł. Turchan, A. Hulist, M. Duchnowski - CUDA - results over coffee ...Future Processing
 
[FDD 2018] Lech Kalinowski - Prywatny Blockchain
[FDD 2018] Lech Kalinowski - Prywatny Blockchain[FDD 2018] Lech Kalinowski - Prywatny Blockchain
[FDD 2018] Lech Kalinowski - Prywatny BlockchainFuture Processing
 
[FDD 2018] W. Malara, K. Kotowski - Autoenkodery – czyli zalety funkcji F(X)≈X
[FDD 2018] W. Malara, K. Kotowski - Autoenkodery – czyli zalety funkcji F(X)≈X[FDD 2018] W. Malara, K. Kotowski - Autoenkodery – czyli zalety funkcji F(X)≈X
[FDD 2018] W. Malara, K. Kotowski - Autoenkodery – czyli zalety funkcji F(X)≈XFuture Processing
 
[FDD 2018] Jarosław Ogiegło - Ludzie, zabezpieczajcie się! Wprowadzenie do OA...
[FDD 2018] Jarosław Ogiegło - Ludzie, zabezpieczajcie się! Wprowadzenie do OA...[FDD 2018] Jarosław Ogiegło - Ludzie, zabezpieczajcie się! Wprowadzenie do OA...
[FDD 2018] Jarosław Ogiegło - Ludzie, zabezpieczajcie się! Wprowadzenie do OA...Future Processing
 
[JuraSIC! Meetup] Krzysztof Sikora- Jak Service Fabric rozwiąże twoje problem...
[JuraSIC! Meetup] Krzysztof Sikora- Jak Service Fabric rozwiąże twoje problem...[JuraSIC! Meetup] Krzysztof Sikora- Jak Service Fabric rozwiąże twoje problem...
[JuraSIC! Meetup] Krzysztof Sikora- Jak Service Fabric rozwiąże twoje problem...Future Processing
 
[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET
[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET
[JuraSIC! Meetup] Mateusz Stasch - Monady w .NETFuture Processing
 
[QE 2018] Aleksandra Kornecka – Kognitywne podejście do testowania aplikacji ...
[QE 2018] Aleksandra Kornecka – Kognitywne podejście do testowania aplikacji ...[QE 2018] Aleksandra Kornecka – Kognitywne podejście do testowania aplikacji ...
[QE 2018] Aleksandra Kornecka – Kognitywne podejście do testowania aplikacji ...Future Processing
 
[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...
[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...
[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...Future Processing
 
[QE 2018] Łukasz Gawron – Testing Batch and Streaming Spark Applications
[QE 2018] Łukasz Gawron – Testing Batch and Streaming Spark Applications[QE 2018] Łukasz Gawron – Testing Batch and Streaming Spark Applications
[QE 2018] Łukasz Gawron – Testing Batch and Streaming Spark ApplicationsFuture Processing
 
[QE 2018] Marek Puchalski – Web Application Security Test Automation
[QE 2018] Marek Puchalski – Web Application Security Test Automation[QE 2018] Marek Puchalski – Web Application Security Test Automation
[QE 2018] Marek Puchalski – Web Application Security Test AutomationFuture Processing
 
[QE 2018] Rob Lambert – How to Thrive as a Software Tester
[QE 2018] Rob Lambert – How to Thrive as a Software Tester[QE 2018] Rob Lambert – How to Thrive as a Software Tester
[QE 2018] Rob Lambert – How to Thrive as a Software TesterFuture Processing
 
[QE 2018] Paul Gerrard – Automating Assurance: Tools, Collaboration and DevOps
[QE 2018] Paul Gerrard – Automating Assurance: Tools, Collaboration and DevOps[QE 2018] Paul Gerrard – Automating Assurance: Tools, Collaboration and DevOps
[QE 2018] Paul Gerrard – Automating Assurance: Tools, Collaboration and DevOpsFuture Processing
 

Plus de Future Processing (20)

DPTO_Inżynieria oprogramowania to proces uczenia się.pdf
DPTO_Inżynieria oprogramowania to proces uczenia się.pdfDPTO_Inżynieria oprogramowania to proces uczenia się.pdf
DPTO_Inżynieria oprogramowania to proces uczenia się.pdf
 
DPTO_QA w świecie wartości biznesowych.pdf
DPTO_QA w świecie wartości biznesowych.pdfDPTO_QA w świecie wartości biznesowych.pdf
DPTO_QA w świecie wartości biznesowych.pdf
 
DPTO_Hello_Clean_Architekture.pdf
DPTO_Hello_Clean_Architekture.pdfDPTO_Hello_Clean_Architekture.pdf
DPTO_Hello_Clean_Architekture.pdf
 
[Quality Meetup #20] Michał Górski - Continuous Deployment w chmurze
[Quality Meetup #20] Michał Górski - Continuous Deployment w chmurze[Quality Meetup #20] Michał Górski - Continuous Deployment w chmurze
[Quality Meetup #20] Michał Górski - Continuous Deployment w chmurze
 
[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake
[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake
[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake
 
[Quality Meetup #19] Magdalena Drechsler-Nowak - Tester w pułapce myślenia
[Quality Meetup #19] Magdalena Drechsler-Nowak - Tester w pułapce myślenia[Quality Meetup #19] Magdalena Drechsler-Nowak - Tester w pułapce myślenia
[Quality Meetup #19] Magdalena Drechsler-Nowak - Tester w pułapce myślenia
 
[Quality Meetup #19] Adrian Gonciarz - Testerska ruletka
[Quality Meetup #19] Adrian Gonciarz - Testerska ruletka[Quality Meetup #19] Adrian Gonciarz - Testerska ruletka
[Quality Meetup #19] Adrian Gonciarz - Testerska ruletka
 
[FDD 2018] Krzysztof Sikora - Jak Service Fabric rozwiąże twoje problemy z mi...
[FDD 2018] Krzysztof Sikora - Jak Service Fabric rozwiąże twoje problemy z mi...[FDD 2018] Krzysztof Sikora - Jak Service Fabric rozwiąże twoje problemy z mi...
[FDD 2018] Krzysztof Sikora - Jak Service Fabric rozwiąże twoje problemy z mi...
 
[FDD 2018] Ł. Turchan, A. Hulist, M. Duchnowski - CUDA - results over coffee ...
[FDD 2018] Ł. Turchan, A. Hulist, M. Duchnowski - CUDA - results over coffee ...[FDD 2018] Ł. Turchan, A. Hulist, M. Duchnowski - CUDA - results over coffee ...
[FDD 2018] Ł. Turchan, A. Hulist, M. Duchnowski - CUDA - results over coffee ...
 
[FDD 2018] Lech Kalinowski - Prywatny Blockchain
[FDD 2018] Lech Kalinowski - Prywatny Blockchain[FDD 2018] Lech Kalinowski - Prywatny Blockchain
[FDD 2018] Lech Kalinowski - Prywatny Blockchain
 
[FDD 2018] W. Malara, K. Kotowski - Autoenkodery – czyli zalety funkcji F(X)≈X
[FDD 2018] W. Malara, K. Kotowski - Autoenkodery – czyli zalety funkcji F(X)≈X[FDD 2018] W. Malara, K. Kotowski - Autoenkodery – czyli zalety funkcji F(X)≈X
[FDD 2018] W. Malara, K. Kotowski - Autoenkodery – czyli zalety funkcji F(X)≈X
 
[FDD 2018] Jarosław Ogiegło - Ludzie, zabezpieczajcie się! Wprowadzenie do OA...
[FDD 2018] Jarosław Ogiegło - Ludzie, zabezpieczajcie się! Wprowadzenie do OA...[FDD 2018] Jarosław Ogiegło - Ludzie, zabezpieczajcie się! Wprowadzenie do OA...
[FDD 2018] Jarosław Ogiegło - Ludzie, zabezpieczajcie się! Wprowadzenie do OA...
 
[JuraSIC! Meetup] Krzysztof Sikora- Jak Service Fabric rozwiąże twoje problem...
[JuraSIC! Meetup] Krzysztof Sikora- Jak Service Fabric rozwiąże twoje problem...[JuraSIC! Meetup] Krzysztof Sikora- Jak Service Fabric rozwiąże twoje problem...
[JuraSIC! Meetup] Krzysztof Sikora- Jak Service Fabric rozwiąże twoje problem...
 
[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET
[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET
[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET
 
[QE 2018] Aleksandra Kornecka – Kognitywne podejście do testowania aplikacji ...
[QE 2018] Aleksandra Kornecka – Kognitywne podejście do testowania aplikacji ...[QE 2018] Aleksandra Kornecka – Kognitywne podejście do testowania aplikacji ...
[QE 2018] Aleksandra Kornecka – Kognitywne podejście do testowania aplikacji ...
 
[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...
[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...
[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...
 
[QE 2018] Łukasz Gawron – Testing Batch and Streaming Spark Applications
[QE 2018] Łukasz Gawron – Testing Batch and Streaming Spark Applications[QE 2018] Łukasz Gawron – Testing Batch and Streaming Spark Applications
[QE 2018] Łukasz Gawron – Testing Batch and Streaming Spark Applications
 
[QE 2018] Marek Puchalski – Web Application Security Test Automation
[QE 2018] Marek Puchalski – Web Application Security Test Automation[QE 2018] Marek Puchalski – Web Application Security Test Automation
[QE 2018] Marek Puchalski – Web Application Security Test Automation
 
[QE 2018] Rob Lambert – How to Thrive as a Software Tester
[QE 2018] Rob Lambert – How to Thrive as a Software Tester[QE 2018] Rob Lambert – How to Thrive as a Software Tester
[QE 2018] Rob Lambert – How to Thrive as a Software Tester
 
[QE 2018] Paul Gerrard – Automating Assurance: Tools, Collaboration and DevOps
[QE 2018] Paul Gerrard – Automating Assurance: Tools, Collaboration and DevOps[QE 2018] Paul Gerrard – Automating Assurance: Tools, Collaboration and DevOps
[QE 2018] Paul Gerrard – Automating Assurance: Tools, Collaboration and DevOps
 

[QE 2015] Grzegorz Gałęzowski - Projektowanie kompozycjonalne – po co (tak naprawdę) mi te mocki?