http://www.devcastzone.com/course,refaktoryzacja-kodu-w-jezyku-php
Devcast "Refaktoryzacja kodu w języku PHP" przedstawia treści związane z refaktoryzacją kodu, ze specjalnym uwzględnieniem języka PHP. Są w nim omówione podstawowe zasady i pojęcia związane z refaktoryzacją. W dalszej części przedstawiamy zapachy kodu – sytuacje, w których należy podjąć refaktoryzację. Omawiamy także podstawowe metody refaktoryzacji. Oprócz tego analizujemy najważniejsze wzorce projektowe. Rozważamy także największe problemy i zagrożenia, jakie są związane z zagadnieniem refaktoryzacji.
3. Treśd modułu
1. Przygotowanie do refaktoryzacji
2. Klasy
3. Metody
4. Wartości i pola
5. Parametry i zmienne
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 3
4. Przygotowanie do refaktoryzacji
• Zastosowanie frameworka do testów w celu
szybkiego sprawdzenia zmian wprowadzonych w
kodzie
• PHP – np. PHPUnit i SimpleTest
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 4
5. Klasy
• Podstawowy problem – realizacja zbyt wielu funkcji
przez jedną klasę
• Niespełnianie wstępnych założeo
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 5
6. Klasy
• Extract Class:
o Podziel funkcjonalnośd na bazową i do wydzielenia
o Utwórz nową klasę
o Zastosuj Move Field/Method na elementach do
przeniesienia (testuj po każdym przeniesieniu)
o W miarę potrzeb, zaktualizuj interfejsy aktualnej i nowej
klasy
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 6
7. Klasy
• Extract Subclass:
o Stwórz nową podklasę dla klasy.
o Zmieo wywołania konstruktora tam, gdzie chcesz
skorzystad z nowej klasy
o Jeśli klasa bazowa nie jest już używana, zdefiniuj ją jako
abstrakcyjna
o Przesuo pola/metody za pomocą Push Down Field/Method
(test po każdym przesunięciu)
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 7
8. Klasy
• Extract Subclass (c.d.):
o Jeśli jakieś pole opisuje typ obiektu, podstaw na jego
miejsce akcesory zwracające stałą wartośd. Wszystkie
wyrażenia warunkowe korzystające z tego pola powinny
zostad usunięte (ponieważ podklasa opisuje tylko jeden typ
obiektu).
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 8
9. Klasy
• Extract Superclass:
o Stwórz abstrakcyjną klasę i dodaj dziedziczenie po niej w
istniejących klasach
o Przesuo (Pull Up Field/Method) elementy do klasy bazowej
o Jeśli metody robią to samo w inny sposób, użyj Substitute
Algorithm
o Jeśli metody robią to samo, ale mają inne nazwy, użyj
Rename Method
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 9
10. Klasy
• Extract Superclass:
o Jeśli po wydzieleniu nadal istnieją podobieostwo, spróbuj
użyd Extract Method + Pull Up Method (ew. Form Template
Method, jeśli występują różnice w szczegółach)
o Sprawdź wykorzystanie klas pochodnych w kodzie; jeśli są
wykorzystywane jedynie mechanizmy klasy bazowej,
podmieo odwołania do typów
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 10
11. Klasy
• Inline Class:
o Dodaj publiczne API klasy źródłowej do klasy docelowej
o Podmieo odwołania do włączanej klasy w kodzie
o Move Field/Method na elementach klasy włączanej
o Jeśli klasa docelowa jest jedynym klientem źródłowej, użyj
Hide Method na dołączanych metodach
o Usuo istniejącą klasę
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 11
12. Metody
• Extract Method:
o Stwórz nową metodę i nazwij ją zgodnie z przeznaczeniem.
o Skopiuj częśd kodu do nowej metody. Zmienne potrzebne
w starej metodzie przekaż jako parametry, zmienne
istniejące tylko w skopiowanym fragmencie potraktuj jako
lokalne.
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 12
13. Metody
• Extract Method:
o Sprawdź ile zmiennych jest modyfikowanych przez
wyłączany kod.
• Jeśli jedna – można zwrócid ją jako wynik nowej metody.
• Jeśli więcej – spróbuj zwracad bardziej złożoną strukturę
(obiekt/tablica) lub przekazuj zmienne przez referencję.
o Zamieo stary kod przez odwołanie do metody i przetestuj.
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 13
14. Metody
• (Move / Pull Up / Push Down) Method:
o Przesuo metodę tam, gdzie powinna się ona znajdowad (Move
– wersja ogólna)
o Sprawdź zależności metody – byd może warto przenieśd całą
grupę metod
o Sprawdź, czy istnieją implementacje w pod-/nadklasach
(polimorfizm może sprawiad problemy)
o Zadeklaruj metodę w nowej klasie.
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 14
15. Metody
• (Move / Pull Up / Push Down) Method:
o Skopiuj kod do nowej klasy (dla Push Down do każdej z
podklas)
o Sprawdź, czy można łatwo odwoład się do nowego obiektu
(problem w Move)
o Zmieo metodę źródłową w delegację. Przetestuj.
o Usuo (w przypadku Push Down/Pull Up) metodę źródłową.
Dla Move zastanów się, czy warto zachowad ją jako
delegację. Jeśli nie, podmieo wszystkie referencje do
metody na nowy obiekt.
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 15
16. Metody
• Rename Method:
o Czy metoda jest implementowana przez nadklasy i
podklasy? Jeśli tak, wykonaj ten sam proces dla każdej z
nich.
o Skopiuj zawartośd metody do metody o nowej nazwie.
Dokonaj niezbędnych modyfikacji w ciele funkcji (np.
rekurencja).
o Zmieo ciało starej funkcji aby wywołała nową funkcję.
Przetestuj.
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 16
17. Metody
• Rename Method:
o Znajdź wszystkie odniesienia do starej metody i zamieo je na
odniesienia do nowej. Przetestuj.
o Usuo starą metodę. Jeśli stara metoda jest częścią interfejsu,
zostaw ją na miejscu i oznacz jako przestarzałą. Przetestuj.
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 17
18. Metody
• Hide Method:
o Jeśli dana metoda nie jest używana poza klasą, uczyo ją
prywatną. Przetestuj.
o Jeśli metoda prywatna jest akcesorem, możesz ją usunąd i
zamienid wszystkie wywołania jako bezpośrednie
odwołania do pola.
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 18
19. Wartości i pola
• Self Encapsulate Field:
o Utwórz akcesory dla danego pola.
o Znajdź wszystkie odniesienia do pola i zastąp je za pomocą
akcesorów.
o Zmieo widocznośd pola na prywatną.
o Przetestuj.
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 19
20. Wartości i pola
• (Move/Pull Up/Push Down) Field
o Utwórz pole w klasie docelowej oraz akcesory dla niego
(opcjonalnie).
o Określ, w jaki sposób odwoład się do nowego pola z klasy
źródłowej. W przypadku Move Field potrzebujemy
referencji do obiektu nowej klasy.
o Usuo pole z klasy bazowej.
o Zamieo wszelkie odniesienia do pola na odniesienia do
klasy docelowej. Przetestuj.
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 20
21. Wartości i pola
• Replace Data Value with Object:
o Utwórz nową klasę dla wartości. Dodaj do niej prywatne
pole zawierające naszą daną oraz akcesory.
o Zamieo akcesory w klasie źródłowej na akcesory nowej
klasy.
o Zamieo przypisania wartości w konstruktorze klasy
bazowej na stworzenie obiektu nowego typu. Jeśli takie
przypisanie nie istniało, wpisz je do konstruktora.
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 21
22. Wartości i pola
• Replace Data Value with Object:
o (Opcjonalnie) zamieo getter na metodę zwracającą kopię
obiektu zawartego wewnątrz klasy źródłowej.
o Przetestuj.
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 22
23. Parametry i zmienne
• Preserve Whole Object:
o Utwórz nowy parametr dla całego obiektu, który chcesz
przekazad.
o Określ, które parametry powinny zostad pobrane z obiektu
o Dla każdego parametru do usunięcia zastąp wszelkie
odniesienia do niego wewnątrz metody na zapytania do
obiektu. Przetestuj.
o Usuo kod w metodzie wołającej, który wyciąga dane z
obiektu dla metody. Przetestuj.
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 23
24. Parametry i zmienne
• Introduce Parameter Object:
o Utwórz nową klasę reprezentującą cały zestaw danych.
o Do parametrów metody, którą chcemy zmienid, dodaj
parametr typu nowej klasy, jako wartośd przekazując null.
Przetestuj.
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 24
25. Parametry i zmienne
• Introduce Parameter Object:
o Dla każdego z parametrów do usunięcia, zamieo kod
wykorzystujący ten parametr w metodzie na kod
korzystający z nowo wprowadzonego obiektu. Zamieo
wartośd pustą w wywołaniu metody na odwołanie do
konkretnego obiektu. Przetestuj.
o Zastanów się, czy nie warto przesunąd części
funkcjonalności do nowego obiektu za pomocą Move
Method.
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 25
26. Parametry i zmienne
• Replace Parameter with Method:
o Jeśli trzeba, wydziel obliczanie parametru do osobnej
metody.
o Zamieo odniesienia do parametru w ciele metody na
odniesienia do metody zwracającej wartośd parametru.
Przetestuj.
o Usuo niepotrzebne parametry za pomocą Remove
Parameter.
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 26
27. Parametry i zmienne
• Replace Paremeter with Explicit Methods:
o Stwórz metodę dla każdej wartości parametru.
o Dla każdej z gałęzi instrukcji warunkowej, wywołaj
odpowiednią metodę. Przetestuj.
o Zamieo wywołanie metody źródłowej na wywołania
nowych metod. Przetestuj.
o Usuo metodę źródłową, gdy nie będzie już odwołao do
niej.
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 27
28. Parametry i zmienne
• Remove Parameter:
o Sprawdź, czy sygnatura metody jest zaimplementowana w
pod- i nadklasach. Jeśli któraś z nich wykorzystuje ten
parametr, nie dokonuj tej refaktoryzacji.
o Nie dokonuj tej refaktoryzacji również, jeśli metoda jest
częścią interfejsu a parametr w kontekście tego interfejsu
ma znaczenie.
o Usuo parametr z sygnatury metody oraz wszystkie
odwołania do niego. Przetestuj.
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 28
29. Parametry i zmienne
• Replace Type Code with Subclasses:
o Użyj Self Encapsulate Field na zmiennej oznaczającej typ.
o Dla każdej wartości typu stwórz nową podklasę. Nadpisz
gettera zwracającego typ klasy jako funkcję zwracającą
stałą.
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 29
30. Parametry i zmienne
• Replace Type Code with Subclasses:
o Podmieo klasę na podklasy w miejscach, w których
tworzysz obiekty. Wzorzec Factory Method (opisany w
module 4) będzie tutaj pomocny. Przetestuj każdą
podklasę.
o Usuo kod odpowiedzialny za typ z nadklasy. Zadeklaruj
akcesory dla typu jako abstrakcyjne. Przetestuj.
Refaktoryzacja kodu w języku PHP
copyright BNS MEDIA
www.devcastzone.com 30
31. Refaktoryzacja kodu w języku PHP – program
pełnego szkolenia
1. Code Refactoring
o Proces tworzenia kodu
o Definicja problemu. Reengineering.
o Redesign a refaktoryzacja
o Cechy refaktoryzacji
o Podsumowanie
2. Zapachy kodu
o Definicja
o Systematyka zapachów kodu
o The Bloaters
o The Object-Orientation Abusers
o The Change Preventers
o The Dispensables
o The Couplers
3. Podstawowe refaktoryzacje
o Przygotowanie do refaktoryzacji
o Klasy
o Metody
o Wartości i pola
o Parametry i zmienne
Tworzenie aplikacji z użyciem biblioteki Hibernate
copyright BNS MEDIA
www.devcastzone.com 31
32. Refaktoryzacja kodu w języku PHP – program
pełnego szkolenia
4. Wzorce projektowe
o Wzorce projektowe – po co, dlaczego?
o Creation Method
o State/Strategy
o Dekoratory
o Observer
o Composed Method
o Adapter
5. Wysokopoziomowe refaktoryzacje
o Dziedziczenie
o Powiązania
o Wzorce
o Pozostałe
6. Automatyzacja refaktoryzacji
o Automatyzacja w refaktoryzacji – zakres i możliwości
o Przeszukiwanie
o Problemy związane z przeszukiwaniem
o Automatyczne wykrywanie zapachów za pomocą refleksji
o Narzędzia do automatyzacji
Tworzenie aplikacji z użyciem biblioteki Hibernate
copyright BNS MEDIA
www.devcastzone.com 32
33. Refaktoryzacja kodu w języku PHP – program
pełnego szkolenia
7. Problemy i zagrożenia
o Refaktoryzacja w cyklu życia projektu
o Refaktoryzacja jako proces ciągły
o Czytelnośd kodu
o Kiedy refaktoryzowad?
o Inne sposoby podniesienia jakości kodu
8. Prefaktoryzacja
o Prefaktoryzacja – z czym to się je?
o Podejścia w prefaktoryzacji
o Prymitywy są złe
o Łączenie i dzielenie
o Kod jeszcze bardziej czytelny
o Klasa nie jest dobra na wszystko
o Trzy prawa obiektów
o Retrospekcje
Tworzenie aplikacji z użyciem biblioteki Hibernate
copyright BNS MEDIA
www.devcastzone.com 33
34. Refaktoryzacja kodu w języku PHP
http://www.devcastzone.com/course,refaktoryzacja-kodu-w-
jezyku-php
Zapraszamy
Tworzenie aplikacji z użyciem biblioteki Hibernate
copyright BNS MEDIA
www.devcastzone.com 34