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
To przede wszystkim wyzwanie organizacyjne, a w następnej kolejności techniczne
Po pierwsze zatrzymaj dalsze psucie, po drugie naprawiaj
Strategiczna refaktoryzacja
6. www.bnsit.pl
#Zidentyfikuj obszary refaktoryzacji
•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
Techniki
Strategiczna refaktoryzacja
6
7. www.bnsit.pl
Kto to napisał?
Kiedy to napisał?
Czym się kierował?
Jakie miał doświadczenie?
W jakich warunkach działał?
Ile miał czasu?
Kto go rozliczał?
Kontekst powstania tego kodu
Strategiczna refaktoryzacja
7
9. www.bnsit.pl
Problemy
Korzyści
Mapa problemy/korzyści/rozwiązanie
Strategiczna refaktoryzacja
9
Co mówią programiści, architekci?
Rozwiązanie
10. www.bnsit.pl
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
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. www.bnsit.pl
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
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. www.bnsit.pl
#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 – WIELE ŚRODOWISK, DUŻO MERGE’OWANIA
Analiza – identyfikacja problemów
Strategiczna refaktoryzacja
12
13. www.bnsit.pl
#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
Analiza – identyfikacja problemów
Strategiczna refaktoryzacja
13
17. www.bnsit.pl
Jak powinno być? Co się powinno dziać?
1.Przyjmuje request
2.Dokonuje złożonej 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
Blok budujący – View controller
Strategiczna refaktoryzacja
17
19. www.bnsit.pl
Wysoka złożoność/rzadkie zmiany Kod którego nie ruszamy
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
Co refaktoryzować? Kwadrant Feathersa
Strategiczna refaktoryzacja
19
Dodatkowo:
•wiedza plemienna
•prognozy biznesu
Częstość zmian
Złożoność
20. www.bnsit.pl
Repozytorium i wiedza plemienna
#Co warto wziąć pod uwagę?
•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?
#Czy pliki z commitów są rozsiane po całym repozytorium?
Wiedza plemienna
Strategiczna refaktoryzacja
20
22. www.bnsit.pl
#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
Kilka kontrowersyjnych wniosków
Strategiczna refaktoryzacja
22
24. www.bnsit.pl
#Zespoły deweloperskie
#Zespoły testerów
#Zespołu utrzymania
#Zaangażowanie biznesu
#Realność terminów
#Obsługa zmian w wymaganiach
Czemu przyjrzeć się na poziomie organizacyjnym?
Strategiczna refaktoryzacja
24
26. www.bnsit.pl
#Segregujemy metody z pomiędzy interfejsy
#Skupiamy się, na zatrzymaniu powstawania nowych zależności
Extract Responsibility Interface/Object
Strategiczna refaktoryzacja
26
27. www.bnsit.pl
if ( param == 4 ) { //workaround, do not touch!
position.setX( position.getX() + 1 );
}
Refaktoryzacja sposobu myślenia
Strategiczna refaktoryzacja
27
28. www.bnsit.pl
public InvalidCartesianXPatch extends Position {
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
28
29. www.bnsit.pl
public Position {
// 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
29
33. www.bnsit.pl
#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
Dziedziny
Strategiczna refaktoryzacja
33