Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí. Refaktorování.

Podobné dokumenty
David Bortňák Milan Kodejš

Zapouzdření. Tomáš Pitner, upravil Marek Šabo

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Algoritmizace a programování

Čo je to Refactoring?

Programování v C++ 1, 1. cvičení

20. Projekt Domácí mediotéka

Vývoj řízený testy Test Driven Development

1. Programování proti rozhraní

1. Téma 12 - Textové soubory a výjimky

Programování v C++ 2, 4. cvičení

Více o konstruktorech a destruktorech

Dědění, polymorfismus

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

DTP Základy programování Úvod do předmětu

Objektově orientované programování

typová konverze typová inference

Jazyk C# (seminář 3)

UJO Framework. revoluční architektura beans. verze

Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

PB161 Programování v jazyce C++ Přednáška 7

PB161 Programování v jazyce C++ Přednáška 7

Programování v C++ 1, 14. cvičení

Základy programovaní 3 - Java. Unit testy. Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. 26.,27.

IRAE 07/08 Přednáška č. 1

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE STRUKTURA PŘEKLADAČE

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Generické programování

Projekty pro výuku programování v jazyce Java

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

KTE / ZPE Informační technologie

Aplikovaná informatika. Podklady předmětu Aplikovaná informatika pro akademický rok 2006/2007 Radim Farana. Obsah. Obsah předmětu

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Programové konvence, dokumentace a ladění. Programování II 2. přednáška Alena Buchalcevová

Algoritmizace a programování

Výčtový typ strana 67

Programování jako nástroj porozumění matematice (seriál pro web modernivyuka.cz)

5a. Makra Visual Basic pro Microsoft Escel. Vytvořil Institut biostatistiky a analýz, Masarykova univerzita J. Kalina

NMIN201 Objektově orientované programování 1 / :36:09

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

4a. Makra Visual Basic pro Microsoft Excel Cyklické odkazy a iterace Makra funkce a metody

Návrhové vzory OMO, LS 2014/2015

Java - řazení objektů

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

IRAE 07/08 Přednáška č. 7. Začátek (head)

Objektově orientované programování v jazyce Python

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Java Cvičení 01. CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics

Programování v C++ 1, 5. cvičení

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Pro kontrolu správného formátu hodnoty N použijeme metodu try-catch.

Dalším příkladem může být například výstup dat na různá zařízení, souborů, grafických rozhraní, sítě atd.

Rozklad na prvočinitele. 3. prosince 2010

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

PROGRAMOVÁNÍ V C++ CVIČENÍ

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

Dědičnost (inheritance)

RMI Remote Method Invocation

Objektově orientované programování v jazyce Python

Motivační příklad reálný svět. výroba (assembly line)

Dotazování nad stromem abstraktní syntaxe

NPRG031 Programování II 1 / :25:46

NA CO SI DÁT POZOR V JAVASCRIPTU? Angular.cz

Funkční objekty v C++.

1 - Úvod do platformy.net. IW5 - Programování v.net a C#

Programování v C++ 2, 8. cvičení

public class Karel { private int position; public boolean issmiling; public int getposition() { return position;

Datové struktury. alg12 1

OOPR_05. Případové studie

Programování v C++ 1, 17. cvičení

JAVA. Další jazyky kompilovatelné do Java byte-code

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Úvod do programování - Java. Cvičení č.4

Skripta ke školení. Základy VBA. vypracoval: Tomáš Herout. tel:

Objektové programování

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Jazyk C# a platforma.net

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

Java - výjimky. private void vstup() throws IOException {... }

Abstraktní třída a rozhraní

Úvod do programovacích jazyků (Java)

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

17. Projekt Trojúhelníky

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Vlákno odlehčený proces kód vlákna, zásobník privátní ostatní sdíleno s dalšími vlákny téhož procesu

8 Třídy, objekty, metody, předávání argumentů metod

Zápis programu v jazyce C#

První kapitola úvod do problematiky

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Programování v C++ 3, 3. cvičení

ALGORITMIZACE. Výukový materiál pro tercii osmiletého gymnázia

PB161 Programování v jazyce C++ Přednáška 9

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

Transkript:

Refaktorování Code refactoring Lukáš Hájek Objektově orientované programování ČVUT v Praze - Fakulta jaderná a fyzikálně inženýrská 8. října 2013 1 / 31

Struktura prezentace 1 Co je refaktorování 2 Historie 3 Proč refaktorovat 4 Kdy refaktorovat 5 Jak refaktorovat 6 Code obfuscation 2 / 31

Co je refaktorování? Systematický proces provádění změn v kódu bez ovlivnění funkčnosti Pouze drobné změny Vylepšení / zpřehlednění kódu 3 / 31

Historie Na začátku 80. let mezi programátory jazyka Forth pojem factoring Přelom 80. a 90. let používání refaktorovacích technik programátory ve smalltalku Počátek 90. let první akademické práce o refaktorování (funckionální i procedurální) 1999 Fowler Martin, Refactoring: Improving the Design of Existing Code. 4 / 31

Proč refaktorovat? Zvýšení přehlednosti kódu Při psaní programu je jednodušší myslet pouze na funkčnost Zefektivnění kódu Odstranění repetetivity Zbavení se zbytečných proměnných Zlepšení vlastní reprezentace jakožto programátora 5 / 31

Vyplatí se refaktorování? 6 / 31

Kdy refaktorovat? 1/2 Již při vývoji kódu (průběžně) nedílná součást vývoje Pokud po nás bude kód číst někdo jiný Pokud se chci ke kódu po nějaké době vrátit Chceme si ujasnit cizí kód Kód je ve špatném stavu, málo flexibilní, chybný Nelze nalézt chybu v kódu 7 / 31

The first time you do something, you just do it. The second time you do something similar, you wince at the duplication, but you do the duplicate thing anyway. The third time you do something similar, you refactor. Don Roberts 8 / 31

Kdy refaktorovat? 2/2 Příliš mnoho public Mnoho komentářů ( nejasný kód) Přílišné řetězení Dlouhé metody Velké třídy Špatná dědičnost 9 / 31

Refaktorujte brzo, refaktorujte často 10 / 31

Jak refaktorovat? Opatrnost, nepřeceňování svých zkušeností Pro ladění rychlosti kódu profiler Podrobný katalog na adrese http://www.refactoring.com/catalog/ 11 / 31

Pozor! Refaktorování je riskantní! Připravovat sady testů Testovat po co nejmenších krocích 12 / 31

13 / 31

Martin Fowler 22 pachů kódu Pro každý pach jiná technika by Kent Beck and Martin Fowler If it stinks, change it. Grandma Beck, discussing child-rearing philosophy 14 / 31

Duplicitní volání u podmínek if (isspecialdeal()) { total = price * 0.95; send();} else { total = price * 0.98; send();} Nahradit za: if (isspecialdeal()) total = price * 0.95; else total = price * 0.98; send(); 15 / 31

Duplicitní kód Rodičovská třída 1 0.9 0.8 Drink 0.7 0.6 0.5 0.4 0.3 0.2 0.1 getname() Milk getname() Beer 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 16 / 31

Duplicitní kód Rodičovská třída správný postup 1 0.9 0.8 0.7 getname() Drink 0.6 0.5 0.4 0.3 0.2 0.1 Milk Beer 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 17 / 31

Vícenásobné podmínky Původně: double disabilityamount() { if (_seniority < 2) return 0; if (_monthsdisabled > 12) return 0; if (_isparttime) return 0; // compute the disability amount Nahradit za: double disabilityamount() { if (isnoteligablefordisability()) return 0; // compute the disability amount 18 / 31

Komplikované if-then-else Původně: if (date.before (SUMMER_START) date.after(summer_end)) charge = quantity * _winterrate + _winterservicecharge; else charge = quantity * _summerrate; Nahradit za: if (notsummer(date)) charge = wintercharge(quantity); else charge = summercharge (quantity); 19 / 31

Veřejné soukromé Původně: public String _name Nahradit za: private String _name; public String getname() {return _name;} public void setname(string arg) {_name = arg;} 20 / 31

21 / 31

Příliš dlouhá metoda nebo struktura Duplicitní kód Dříve snaha o co nejmenší počet volání Dnes přehlednost 22 / 31

Vyjmutí metody Původně: void printowing() { printbanner(); //print details System.out.println ("name: " + _name); System.out.println ("amount " + getoutstanding()); } 23 / 31

Vyjmutí metody Oprava Nahradit za: void printowing() { printbanner(); printdetails(getoutstanding()); } void printdetails (double outstanding) { System.out.println ("name: " + _name); System.out.println ("amount " + outstanding); } 24 / 31

Příliš dlouhá metoda Odstranění nepotřebných proměnných Původně: double baseprice = anorder.baseprice(); return (baseprice > 1000) Nahradit za: return (anorder.baseprice() > 1000) 25 / 31

Dlouhý seznam parametrů Předávání celého objektu Původně: int min = dailytemperature.getmin(); int max = dailytemperature.getmax(); mystat = stat.range(min, max); Nahradit za: mystat = stat.range(&dailytemperature); 26 / 31

Komentáře Špatně pojmenovaná funkce? Nejasný kód? Komentáře uvnitř metod lepší vyjmout na samostatné místo Co, jak a proč metoda dělá 27 / 31

Přiřazení Původně: int x; x = 7; Nahradit za: int x = 7; Hodnota vždy nastavená Zpomalení (C++) 28 / 31

Code obfuscation Inverzní postup k refaktorování char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10); }%c"; main(){printf(f,34,f,34,10);} 29 / 31

Shrnutí Refaktorování - co to je Kdy a proč refaktorovat Techniky refaktorování 30 / 31

Děkuji za pozornost! Celá prezentace je dostupná na http://kfe.fjfi.cvut.cz/~hajeklu2/files/oop/ 31 / 31