Refactoring in eclipse Mąkosa Norbert Rospądek Bartłomiej
Plan Co to jest i jak działa refactoring ? Metody dostępne w eclipse Opis metod wraz z przykładami zastosowania.
Refactoring (lub refaktoring, refaktoryzacja) to pojęcie związane z wytwarzaniem systemów informatycznych, w szczególności z programowaniem. Jest to proces wprowadzania zmian w projekcie/programie, w wyniku którego zasadniczo nie zmienia się jego funkcjonalność. Celem refactoringu jest więc nie wytwarzanie nowej funkcjonalności, ale utrzymywanie odpowiedniej, wysokiej jakości organizacji systemu.
Dzięki refactoringowi w systemie ogranicza się redundancje (nadmiarowość, np. istnienie wielu obiektów i procedur o takiej samej lub bardzo zbliżonej funkcjonalności, a mających niezależne implementacje) i narzuca standardy. W przypadku systemów o architekturach wielowarstwowych refactoring jest jednym z czynników gwarantujących zachowanie silnej separacji warstwy systemu i ich przejrzystej struktury.
W ramach refactoringu podejmowane są następujące działania: modyfikowanie elementów systemu w celu wpasowania ich w przyjęte standardy i wzorce, poszukiwanie nowych standardów i wzorców, które pojawiają się w systemie w trakcie jego rozwoju i ich precyzyjne definiowanie.
Refactoring jest kosztowny, ale jest istotnym elementem zarządzania projektem informatycznym. W szczególności przy dużych i złożonych projektach koszt dobrze prowadzonego refactoringu powinien być zrekompensowany dużo niższym kosztem wprowadzenia późniejszych zmian w projekcie, szczególnie zmian o charakterze globalnym (przekrojowym), dotykających wielu modułów funkcjonalnych jednocześnie. W przypadku projektów obarczonych dużym ryzkiem niepowodzenia (np. z powodu niestabilnych wymagań funkcjonalnych klienta) regularnie prowadzony refactoring wydaje się nieodzowny.
Istotą refaktoryzacji jest przeprowadzenie zmiany w sposób bezpieczny, to znaczy utrzymujący dotychczasową funkcjonalność zmienianego fragmentu programu. Istniej, a dwie podstawowe metody weryfikacji poprawności przekształceń: analiza własnościzmienianego kodu oraz testowanie jednostkowe wprowadzonych zmian.
Analiza warunków wstępnych i końcowych Analiza kodu programu sprowadza się do wyznaczenia dla każdego przekształcenia refaktoryzacyjnego warunków wstępnych oraz końcowych, które muszą być spełnione, aby zmiana by la poprawna. Warunki te to najczęściej statyczne własności klasy lub metody (np. jej relacje dziedziczenia, powiązania z innymi elementami systemu), dlatego ich weryfikacji w większości przypadków możedokonać kompilator lub analizator składniowy.
Testowanie jednostkowe Drugą metod, a weryfikacji poprawności przekształceń refaktoryzacyjnych są testy jednostkowe (ang. unit tests). Są one implementowane na przykład przy użyciu bibliotek z serii xUnit, (np. JUnit). Ich podstawowym przeznaczeniem jest regresyjna weryfikacja poprawności działania poszczególnych metod - czyli stwierdzenie, czy wprowadzane zmiany nie zmieniaj, a ich zachowania. Ta ich cecha jest wykorzystywana przy refaktoryzacji oprogramowania - stanowi, a one niezmienniki przekształceń: testy muszą być spełnione zarówno przed, jak i po przeprowadzeniu zmiany.
Typy refaktoryzacji dostępne w eclipse : 1. Physical Structure 2.Class Level Structure 3.Structure inside a Class
Physical Structure : Rename Move Change Method Signature Convert Anonymous Class to Nested Convert Nested Type to Top Level (Eclipse 2 only) Move Member Type to New File (Eclipse 3 only)
Class Level Structure : Push Down Pull Up Extract Interface Generalize Type (Eclipse 3 only) User Supertype Where Possible
Structure inside a Class : Inline Extract Method Extract Local Variable Extract Constant Introduce Parameter (Eclipse 3 only) Introduce Factory (Eclipse 3 only) Encapsulate Field
Ładowanie projektu Pobieramy przygotowany plik. Uruchamiamy środowisko Eclipse.
Ładowanie projektu Wybieramy menu File Import W otwartym oknie wybieramy.
Ładowanie projektu Ostatecznie ładujemy nasz projekt na którym będziemy pracować.
Refactoring - Wyłączenie metody Wyłączanie metody (ang. Extract Method) jest najprostszym przekształceniem refaktoryzacyjnym. Jest stosowane zwykle w stosunku do metod o zbyt dużej złożoności lub zbyt długich. W projekcie SuDoKu znajdujemy metodę o dużej złożoności (o wysokiej wartości z łożoności McCabe’a), np. wybieramy plik src.com.vitting.rcpsudoku.model.SudokuDocument.j ava.
Refactoring - Wyłączenie metody
Następnie z menu kontekstowego wybierz opcję Refactor!ExtractMethod. Pojawi się okienko, w którym należy wprowadzić nazwę metody (np. canReadVerification w przypadku klasy SudokuDocument) oraz jej zakres widoczności. Należy zwrócić uwagę, że parametry metody są obliczane automatycznie na podstawie zmiennych zdefiniowanych poza zaznaczonym fragmentem, a do których istnieją odwołania wewnątrz niego.
Klikamy klawisz Preview - zostanie wówczas wyświetlona nowotworzona metoda. Klikamy klawisz OK - wówczas zostanie utworzona nowa metoda o podanej nazwie, a w miejscu zaznaczonego fragmentu kodu zostanie umieszczone wywołanie tej metody.
Refactoring - Zmiana sygnatury metody Przekształcenie to jest złożeniem dwóch refaktoryzacji: dodania parametru i usunięcia parametru, a także pozwala zmieniać typ metody i zasięg jej widoczności. Służy właśnie do modyfikowania tych elementów metody, w tym przede wszystkim listy parametrów przekazywanych metodzie. Wskazujemy kursorem sygnaturę metody save() w pliku src.com.vitting.rcpsudoku.jfc.actions.SaveAction.java
Następnie z menu kontekstowego wybierz opcję Refactor!Change Method Signature
Pojawi się okienko, w którym możesz zmodyfikować wspomniane wcześniej wartości Dodaj do sygnatury nowy parametr typu Object o nazwie obj. domyślną wartości, a może być dowolne wyrażenie, którego wartość jest określonego typu (w tym przypadku Object), np. new Object()
Kliknij klawisz Preview. Pojawi się okienko z listą plików, które zostaną zmodyfikowane, oraz zakres zmian w każdym pliku. Kliknij OK. Sygnatura metody zostanie zmodyfikowana, a wszystkie wywołania tej metody zostaną poszerzone o nowy argument o wartości new Object().
Move Przekształcenie to służy do przeniesienia składowej (pola lub metody) do innej klasy. Stosowane jest zwykle w sytuacji, gdy odwołania do tej składowej w większości pochodzą z innej klasy. W przypadku składowej statycznej może ona zostać przeniesiona do dowolnej klasy.
Wskaż kursorem dowolną składową statyczną (np. pole WINDOW WIDTH w klasie src.com.vitting.sudoku.jfc.GuiPersistence Z menu kontekstowego wybierz opcję Refactor!Move Pojawi się okienko z prośbą o wskazanie klasy, do której składowa ma zostać przeniesiona.
Możemy np. wybrać klase com.vitting.rcpsudoku.jfc.MainWindow. Klikając Preview. Pojawi się okienko podglądu z list, a modyfikowanych klas oraz zakresem zmian. Klikając OK. Składowa zostanie przeniesiona.
Natomiast w przypadku składowych niestatycznych (tzn. należących do instancji klasy) składowa może zostać przeniesiona do obiektu, który jest polem klasy źródłowej (jest to jedyna możliwość w przypadku przenoszenia pól) lub argumentem przenoszonej metody (w przypadku przenoszenia metody). Wskaż kursorem metodę isEditMode() linia 556 w klasie com.vitting.sudoku.jfc.MainWindow, Z menu kontekstowego wybierz opcję Refactor Move Pojawi się okienko, w którym zostaną wyświetlone potencjalne klasy docelowe (w tym przypadku będą to wy łącznie pola klasy źródłowej, ponieważ przenoszona metoda nie posiada argumentów). Okienko to pozwala na zmianę nazwy metody podczas przenoszenia oraz określenie nazwy parametru z obiektem źródłowym
Klikając Preview. Zostanie wyświetlone ostrzeżenie o zmianę zasięgu widoczności pola editMode. Klikamy Continue, Zostanie wyświetlona lista zmodyfikowanych klas wraz z zakresem zmian. Klikamy OK. Metoda zostanie przeniesiona
Refactoring - Rozwinięcie Przekształcenie to służy do rozwinięcia zmiennej (ang. Inline Temp) lub metody (ang. Inline Method), czyli jest komplementarne np. w stosunku do przekształcenia Extract Method. Wskaż kursorem wywołanie metody setMessage(message, NORMAL) w metodzie setMessage(String) linia 600 w klasie com.vitting.sudoku.jfc.MainWindow Z menu kontekstowego wybierz opcję Refactor Inline Pojawi się okienko, w którym należy dokonać wyboru pomiędzy zastąpieniem wszystkich wywołań tej metody jej ciałem, czy tylko wskazanego wywołania. W przypadku wyboru wszystkich wywołań metoda setMessage(String, int) stanie się nie wykorzystywana i będzie mogła być usunięta. Wybierz opcję All Invocations
Pojawi się okienko podglądu z list, a modyfikowanych klas i zmianami, jakie zostaną wprowadzone. Zauważamy, że rozwijana metoda została usunięta (jeżeli w poprzednim kroku zaznaczono opcję usunięcia metody).
Do tej kategorii należą przekształcenia Pull up i Push down. Służą one odpowiednio do przeniesienia składowej do nadklasy lub do podklasy. W obu przypadkach podstawowym warunkiem wykonania przekształcenia jest istnienie w projekcie odpowiednio nadklasy (lub implementowanego interfejsu) i podklasy w postaci żródłowej.
Wskaż kursorem metodę save() w klasie com.vitting.sudoku.jfc.actions.SaveAction Z menu kontekstowego wybierz opcję Refactor Pull Up Pojawi się okienko, w którym należy wskazać docelowy typ, do którego ma być przeniesiona metoda. W tym przypadku jedynym dopuszczalnym typem jest interfejs IAction Klikając kolejno klawisze Next wykonujemy przekształcenie.
Dziękujemy za uwagę