Techniki, czyli przekształcenia refaktoryzacyjne pomagają transformować fragmenty kodu z jednej postaci w inną. Jednak duże refaktoryzacje to przede wszystkim przedsięwzięcie organizacyjne. Co warto refaktoryzować? Jak zidentyfikować kluczowe problemy? Kiedy nie podejmować działań? Czy w ogóle warto? Jakie heurystyki i strategie wysokopoziomowe możesz wykorzystać? Odpowiedzi na te pytania poznasz podczas prelekcji Strategiczna refaktoryzacja.
2. www.bnsit.pl
Strategiczna refaktoryzacja
To przede wszystkim wyzwanie
organizacyjne, a w następnej kolejności
techniczne
Po pierwsze zatrzymaj dalsze psucie,
po drugie naprawiaj
3. # refactoring.com, refactoring to the patterns, clean code
www.bnsit.pl
Przekształcenia kodu to za mało
Strategiczna refaktoryzacja 3
6. Techniki
# Zidentyfikuj obszary refaktoryzacji
www.bnsit.pl
• ARCHITECTURE ORIGIN
• PROBLEM/BENEFITS/SOLUTIONS
• ROOT CAUSE ANALYSIS
• ARCHITECTURAL MANTRA
• COMPLEXITY ANALYSIS
• FEATHER’S QUADRANT
• TRIBE KNOWLEDGE
# Zatrzymaj degradację kodu
• ORDERING
• REFACTORYOUR ORGANIZATION
• EXTRACT RESPONSIBILITY OBJECT
• WORKAROUNDS
• BRANCH BY ABSTRACTION
• FEATURE PORTING
• ANTICORRUPTION LAYER
• BUBBLES
# Utrzymuj architekturę przy życiu
• ARCHITECTURE EVOLUTION
• NATURAL COURSE OF REFACTORING
Strategiczna refaktoryzacja 6
7. www.bnsit.pl
Kontekst powstania tego kodu
Kto to napisał?
Kiedy to napisał?
Czym się kierował?
Jakie miał doświadczenie?
W jakich warunkach działał?
Ile miał czasu?
Kto go rozliczał?
Strategiczna refaktoryzacja 7
10. Nie możemy zmieniać GUI
Nie możemy wyjść z hosta serwującego
aplikację
Nie jesteśmy w stanie pracować w stylu
klient-serwer
Monolityczny kod, wielki model
Brak możliwości selektywnego
wyciągania danych. Zawsze trzeba to
robić programistycznie
www.bnsit.pl
Logika niezależna od GUI
Różne kanały dostępu do logiki: web,
iPad, client-sever
Logika niezależna od GUI
Różne kanały dostępu do logiki: web,
iPad, client-sever
Chcemy budować złożone, przekrojowe zapytania o dane
Strategiczna refaktoryzacja 10
11. Nie możemy zmieniać GUI
Nie możemy wyjść z hosta serwującego
aplikację
Nie jesteśmy w stanie pracować w stylu
klient-serwer
Monolityczny kod, wielki model
Brak możliwości selektywnego
wyciągania danych. Zawsze trzeba to
robić programistycznie
www.bnsit.pl
Logika niezależna od GUI
Różne kanały dostępu do logiki: web,
telefon, client-sever
Różne kanały dostępu do logiki: web,
telefon, client-sever
Chcemy budować złożone, przekrojowe zapytania o dane
Strategiczna refaktoryzacja 11
12. Analiza – identyfikacja problemów
# BRAK WSPÓLNYCH ZASAD ODNOŚNIE ARCHITEKTURY
# BRAK WSPÓLNYCH ZASAD ODNOŚNIE MECHANIZMÓW
W SYSTEMIE:
• jak/gdzie walidować;
• jak/gdzie autoryzować;
• utilsy;
# SKOMPLIKOWANY PROCES PRACY Z REPOZYTORIUM –
www.bnsit.pl
WIELE ŚRODOWISK, DUŻO MERGE’OWANIA
Strategiczna refaktoryzacja 12
13. # BRAK WSPÓLNYCH ZASAD CZYTELNOŚCI KODU ORAZ
BRAK ICH KODYFIKACJI;
# BRAK PODZIAŁU NA MODUŁY NA POZIOMIE
REPOZYTORIUM – podział techniczny a nie
dziedzinowy
# BRAK PROCESU WYMIANY WIEDZY O ARCHITEKTURZE
www.bnsit.pl
Analiza – identyfikacja problemów
Strategiczna refaktoryzacja 13
17. Blok budujący – View controller
Jak powinno być? Co się
powinno dziać?
1. Przyjmuje request
2. Dokonuje złożonej
www.bnsit.pl
walidacji
3. Składa dane do
wywołania serwisu
4. Wywołuje serwis
5. Wynik pakuje w JSONa
6. Określa kolejny widok
Czego nie powinno być?
# Prostej walidacji (gdyż do tego
celu wykorzystujemy framework
webowy)
# Złożonego przetwarzania JSONa
(z serwisu nie powinien
przychodzić JSON)
# Logiki dziedzinowej np.
decydowanie na podstawie
danych czy zlecenie ma być
wykonane
Strategiczna refaktoryzacja 17
19. www.bnsit.pl
Co refaktoryzować? Kwadrant Feathersa
Wysoka
złożoność/rzadkie
zmiany
Kod którego nie
ruszamy
Złożoność
Wysoka
złożoność/częste
zmiany
Tu
refaktoryzujemy
Niska
złożoność/rzadkie
zmiany
Utilsy, dobre do
eksperymentów
Niska
złożoność/częste
zmiany
Heaven
Dodatkowo:
• wiedza
plemienna
• prognozy
biznesu
Częstość zmian
Strategiczna refaktoryzacja 19
20. Wiedza plemienna
Repozytorium i wiedza plemienna
# Co warto wziąć pod uwagę?
www.bnsit.pl
• najczęściej zmieniające się fragmenty
• fragmenty, na które raportowanych jest najwięcej
błędów
• fragmenty, z którymi programiści mają najwięcej
problemów
• fragmenty najmniej/najbardziej pokryte testami
# Czy więcej pracujemy w infrastrukturze czy w
dziedzinie?
# Gdzie są duże pliki?
Strategiczna refaktoryzacja 20
22. # Koncepcje wysokiego poziomu są trudne
# Do kiepskiego kodu ludzie się przyzwyczajają
# Kłopot sprawia brak wiedzy biznesowej
Uporządkowanie wystarcza
# Nie za dużo kodu w jednym miejscu
# Nie za dużo powiązań między klasami
# Brak cyklicznych powiązań na wyższym poziomie
www.bnsit.pl
Kilka kontrowersyjnych wniosków
Strategiczna refaktoryzacja 22
24. # Zespoły deweloperskie
# Zespoły testerów
# Zespołu utrzymania
# Zaangażowanie biznesu
# Realność terminów
# Obsługa zmian w wymaganiach
www.bnsit.pl
Czemu przyjrzeć się na poziomie organizacyjnym?
Strategiczna refaktoryzacja 24
26. if ( param == 4 ) { //workaround, do not touch!
www.bnsit.pl
position.setX( position.getX() + 1 );
}
Refaktoryzacja sposobu myślenia
Strategiczna refaktoryzacja 26
27. public InvalidCartesianXPatch extends Position {
www.bnsit.pl
private Position patchedPosition ;
public InvalidCartesianXPatch( Position patchedPosition ) {
this.patchedPosition = patchedPosition;
}
@Override
public int getX() {
return param == 4 ? patchedPosition.getX() + 1 :
patchedPosition.getX();
}
}
Nazwij problem inaczej - Patch
Strategiczna refaktoryzacja 27
28. public Position {
www.bnsit.pl
// nowi klienci
public static Position createPosition(int x, int y) {
return new InvalidCartesianXPatch( new Position(x, y) );
}
@Deprecated
public Position(int x, int y) {
//...
}
@Deprecated
public Position( ... ) { }
}
Dostosuj oryginał
Strategiczna refaktoryzacja 28
30. # Segregujemy metody z pomiędzy interfejsy
# Skupiamy się, na zatrzymaniu powstawania
nowych zależności
www.bnsit.pl
Branch by Abstraction
Strategiczna refaktoryzacja 30
35. # Core domain – to co jest ściśle związane ze
strategią firmy
# Support domain – wspiera główną dziedzinę,
ale bezpośrednio nie należy do niej
# Generic domain – powszechnie występujące
dziedziny
www.bnsit.pl
Dziedziny
Strategiczna refaktoryzacja 35