Refaktoryzacja. Na podstawie

Podobne dokumenty
Testowanie II. Celem zajęć jest zapoznanie studentów z oceną jakości testów przy wykorzystaniu metryk pokrycia kodu testami (ang. code coverage).

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Wzorce projektowe i refaktoryzacja

Metody Metody, parametry, zwracanie wartości

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Wprowadzenie db4o - podstawy db4o - technikalia Przydatne wiadomości. Wprowadzenie. db4o. Norbert Potocki. 1 czerwca Norbert Potocki db4o

Java: interfejsy i klasy wewnętrzne

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Aplikacje w środowisku Java

Klasy i obiekty cz II

Jarosław Kuchta Dokumentacja i Jakość Oprogramowania. Wymagania jakości w Agile Programming

Podstawy programowania obiektowego

TESTOWANIE OPROGRAMOWANIA

Programowanie obiektowe

Wykład VII. Programowanie III - semestr III Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Programowanie Obiektowe Ćwiczenie 4

Aplikacje w środowisku Java

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Pierwsze kroki. Algorytmy, niektóre zasady programowania, kompilacja, pierwszy program i jego struktura

Enkapsulacja, dziedziczenie, polimorfizm

Metodyki zwinne wytwarzania oprogramowania

Podstawy i języki programowania

Przypomnienie o klasach i obiektach

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Programowanie obiektowe

Współbieżność w środowisku Java

Egzamin / zaliczenie na ocenę*

Proxy (pełnomocnik) Cel: Zastosowanie: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego.

Programowanie obiektowe

Programowanie Zespołowe

Polimorfizm. dr Jarosław Skaruz

Języki i techniki programowania Ćwiczenia 4 Wzorce

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Programowanie obiektowe

Programowanie obiektowe

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce

Programowanie obiektowe

Testy automatyczne. Korzystające z junit

Programowanie obiektowe

Programowanie obiektowe

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Programowanie poprzez testy z wykorzystaniem JUnit

Lista dwukierunkowa - przykład implementacji destruktorów

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Języki i techniki programowania Ćwiczenia 2

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

JUnit TESTY JEDNOSTKOWE. Waldemar Korłub. Platformy Technologiczne KASK ETI Politechnika Gdańska

Programowanie obiektowe

Metody wytwarzania oprogramowania. Metody wytwarzania oprogramowania 1/31

Kurs WWW. Paweł Rajba.

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

METODY PROGRAMOWANIA

PHP 5 język obiektowy

Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej.

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Dokumentacja do API Javy.

Ćwiczenie 1. Przygotowanie środowiska JAVA

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Aplikacje w środowisku Java

Zaawansowane programowanie w C++ (PCP)

Metodyki zwinne wytwarzania oprogramowania

Zaawansowane programowanie w C++ (PCP)

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Podstawy technologii WWW

Wykład 4: Klasy i Metody

Dziedziczenie. dr Jarosław Skaruz

Podstawy programowania III WYKŁAD 6

Lab 9 Podstawy Programowania

Program szkolenia: Test Driven Development (TDD) using Spock or JUnit 5

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Interfejsy i klasy wewnętrzne

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Programowanie obiektowe i zdarzeniowe

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

TEMAT : KLASY DZIEDZICZENIE

Zaawansowane aplikacje WWW - laboratorium

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

szkolenia pod drzewem Wybrane Techniki XP bnd 2008 Tomasz Włodarek. Materiał udostępniany na podstawie licencji Creative Commons (by-nc-nd) 1.00.

11.6 Klasa do obsługi liczb wymiernych

Programowanie obiektowe i język Java

Aplikacja webowa w Javie szybkie programowanie biznesowych aplikacji Spring Boot + Vaadin

Michał Olejnik. 22 grudnia 2009

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Klasy abstrakcyjne, interfejsy i polimorfizm

Programowanie obiektowe

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Języki i metody programowania Java Lab2 podejście obiektowe

Monitorowanie i zarządzanie urządzeniami sieciowymi przy pomocy narzędzi Net-SNMP

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

ALGORYTMY I STRUKTURY DANYCH

Automatyzacja testowania oprogramowania. Automatyzacja testowania oprogramowania 1/36

Wykład 7: Pakiety i Interfejsy

Wprowadzenie do języka Java

Praca z kodem legacy : strategie, naprawa błędów, refaktoryzacja oraz

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Transkrypt:

Refaktoryzacja Na podstawie www.refactoring.com 1

Plan Refaktoryzacja Co to jest Ogólne zasady i wskazówki Katalog refaktoryzacji Narzędzia (Eclipse, IntelliJ) 2

Co to jest refaktoryzacja Proces zmian oprogramowania, w sposób nie naruszający zewnętrznego zachowania, ale ulepszający wewnętrzną strukturę Uporządkowany sposób ulepszania i oczyszczania kodu, minimalizując powstawanie błędów Ulepszanie stylu istniejącego programu, w celu polepszenia czytelności i łatwości zmian Proces odwrotny do naturalnej degradacji jakości kodu Składa się z małych, prostch kroków Implementacja wpływa na projektowanie 3

Przykład parametryzowanie metody Utwórz nową metodę Skompiluj program Zastąp implementację jednej z metod wywołaniem nowej Skompiluj i przetestuj Zastąp wywołania starej nową i usuń starą Powtórz dla wszystkich starych metod 4

Wskazówki Gdy chcesz dodać element do programu, a nie da się tego wygodnie zrobić, najpierw zrefaktoryzuj, aby było wygodnie i wtedy dodaj. Zanim zaczniesz refaktoryzować, upewnij się, że masz zestaw testów Testy powinny być samosprawdzające (np. wypisywac OK) Rytm: test, mała zmiana, test, mała zmiana, test... 5

Podział prac Podczas dodawania nowej funkcjonalności nie należy zmieniać istniejącego kodu Podczas refaktoryzacji nie wolno zmieniać (dodawać funkcjonalności) Częste przejścia między tymi dwiema czynnościami W każdej chwili trzeba pamiętać, którą z nich aktualnie się zajmujemy 6

Dlaczego refaktoryzować Ulepszanie projektu programu Ciągłe zmiany wpływają na pogarszanie jakości kodu Źle zaprojektowany program jest trudny do modyfikacji Refactoring ułatwia zrozumienie programu Rozmowa z kodem adresatem jest nie tylko komputer, ale też inni programiści Komputer wszystko przyjmie, ale człowiek nie 7

Dodatkowe zalety Refactoring pomaga znaleźć błedy Ułatwia zrozumienie kodu Wyjaśnianie struktury i znaczenia kodu Przy okazji wychwytuje się błędy Pomaga programować szybciej Pozornie sprzeczne, ale... Dobrze zaprojektowany program przyspiesza implementację Szybciej można wprowadzać zmiany 8

Kiedy refaktoryzować Cały czas - kiedy taka zmiana coś nam ułatwi Reguła trzech Gdy robisz coś po raz pierwszy, to po prostu to robisz Gdy robisz coś podobnego po raz drugi, to niechętnie, ale duplikujesz rozwiązanie Gdy robisz coś prodobnego po raz trzeci, zaczynasz refaktoryzować Przed dodaniem nowej funkcjonalności Podczas recenzji kodu Podczas naprawiania błędu 9

Problemy z refaktoryzacją Bazy danych Trudna w zmianie struktura bazy Zmiana interfejsu Gdy nie możemy zmienić publicznego interfejsu, ponieważ nie znamy wszystkich jego użytkowników Można pozostawić stary interfejs Wskazówka: nie publikuj interfejsów przedwcześnie Czasem łatwiej jest napisać coś od nowa Zbyt skomplikowany kod do wyrzucenia! 10

Refaktoryzaja a projektowanie Można całkowicie zrezygnować z projektowania na korzyść refaktoryzacji Można uprościć fazę projektowania na korzyść refaktoryzacji Zamiast elastycznych, ogólnych rozwiązań prostota i łatwość zmian 11

Refaktoryzacja a optymalizacja Najpierw tworzymy dobrze zaprojektowany program Później mierzymy wydajność profilerem Program spędza najwięcej czasu w małych fragmentach kodu i to je optymalizujemy Dobry kod łatwo optymalizować (wprowadzanie zmian!) 12

Kiedy coś podejrzanie pachnie... w kodzie Powtórzenia w kodzie Długie metody Duże klasy Długie listy parametrów Rozbieżne zmiany Grupki danych Obsesja typów prostych Instrukcja switch/case Równoległe dziedziczenie Leniwe klasy Wątpliwe uogólnianie Tymczasowe pola Łańcuchy wywołań Pośrednik Alternatywne klasy z różnymi interfejsami Niekompletne klasy biblioteczne Klasy-dane 13

Testy Powinny być automatyczne i powinny same sprawdzać swoje wyniki Potężne narzędzie do wykrywania błędów, zapewniające zwrot zainwestowanego czasu Przykład bibioteka JUnit 14

Katalog refaktoryzacji 15

Wyciągnięcie metody void printowing() { } printbanner(); //print details System.out.println ("name: " + _name); System.out.println ("amount " + getoutstanding()); void printowing() { } printbanner(); printdetails(getoutstanding()); void printdetails (double outstanding) { System.out.println ("name: " + _name); System.out.println ("amount " + outstanding); } 16

Wyciągnięcie klasy 17

Zastąpienie wartości obiektem 18

Usuwanie magicznych liczb double potentialenergy(double mass, double height) { return mass * 9.81 * height; } double potentialenergy(double mass, double height) { return mass * GRAVITATIONAL_CONSTANT * height; } static final double GRAVITATIONAL_CONSTANT = 9.81; 19

Ukrycie delegata <> usunięcie pośrednika 20

Lokalne rozszerzenie Gdy nie możemy zmodyfikować klasy bibliotecznej 21

Schowanie pola public String _name private String _name; public String getname() {return _name;} public void setname(string arg) {_name = arg;} 22

Rozłożenie warunków if (date.before (SUMMER_START) date.after(summer_end)) charge = quantity * _winterrate + _winterservicecharge; else charge = quantity * _summerrate; if (notsummer(date)) charge = wintercharge(quantity); else charge = summercharge (quantity); 23

Wprowadzenie obiektu null if (customer == null) plan = BillingPlan.basic(); else plan = customer.getplan(); 24

Zmiana nazwy metody 25

Obiekt parametrowy 26

Wyciągnięcie pola do góry 27

Narzędzia do refaktoringu Zintegrowane z IDE (Eclipse, JBuilder, etc.) Automatycznie wyszukują referencje do zmieniamych obiektów Ułatwiają unikać błędów Undo/redo możliwość eksperymentowania z kodem 28

Podsumowanie Rozdzielenie refaktoryzacji od dodawania funkcjonalności Ciągłe ulepszanie projektu Małe, kontrolowane kroki Testy na każdym etapie 29

Dalsza lektura http://www.refactoring.com/ Refaktoryzacja. Ulepszanie struktury istniejącego kodu Martin Fowler i inni, 2006, WNT 30