F5 Enkel Design, Refaktorisering

Relevanta dokument
F5 Enkel Design, Refaktorisering. EDAF45 Programvaruutveckling i grupp Projekt Görel Hedin, Boris Magnusson,Datavetenskap, LTH

Föreläsning 23. Tobias Wrigstad. Refaktorering

D J U P S T U D I E I E D A S I M P L E C O D E A N D D E S I G N

F2 XP Extrem Programmering översikt. EDAF45 Programvaruutveckling i grupp Projekt Boris Magnusson, Görel Hedin Datavetenskap, LTH

UML. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

F2 XP Extrem Programmering översikt. EDAF45 Programvaruutveckling i grupp Projekt Boris Magnusson, Görel Hedin Datavetenskap, LTH

Classes och Interfaces, Objects och References, Initialization

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Mjukvarudesign. Designprocessen. Teknisk design. Konceptuell design

Vad kännetecknar en god klass. Vad kännetecknar en god klass. F12 Nested & Inner Classes

Översikt MERA JAVA OCH ECLIPSE. Uttryck och tilldelning. Uttryck och tilldelning. Uttryck och tilldelning. Uttryck och tilldelning

Recitation 4. 2-D arrays. Exceptions

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Configuration testing Why? Vad det är tänkt att koden ska göra. Performance testing Kommentarer Skriva om koden som kommentar

Kritik av Extrem Programmering

Klassdeklaration. Metoddeklaration. Parameteröverföring

Att skriva till och läsa från terminalfönstret

F4 Testning och Parprogrammering i XP EDAF45 Programvaruutveckling i grupp Projekt Boris Magnusson,Datavetenskap, LTH

Principles of subclasses. Objekt-orienterad programmering och design Alex Gerdes, 2018

App analytics TDP028

Tentamen. Programmeringsmetodik, KV: Java och OOP. 17 januari 2002

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 11 Jonas Lindgren, Institutionen för Datavetenskap, LiU

F4 Testning och Parprogrammering i XP. EDAF45 Programvaruutveckling i grupp Projekt Boris Magnusson,Datavetenskap, LTH

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Föreläsning 5-6 Innehåll

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Tentamen i Objektorienterad modellering och diskreta strukturer

Designmönster, introduktion. Vad är det? Varför skall man använda mönster?

This work by. Fredrik Wendt. is licensed under a. Creative Commons

Agil projektmetodik Varför och vad är det?

Styrteknik: Binära tal, talsystem och koder D3:1

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design Alex Gerdes, 2016

Upplägg. Introduktion. Examination. Mål. Konsekvenser. Java. Kursen heter konstruktion, ej design eller formgivning.

Djupstudie Verktyg för att förebygga problem i källkod. Anders Forslund Anders Lund

Objektsamlingar i Java

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Tentamen i EDAF25. 1 juni Skrivtid: Skriv inte med färgpenna enda tillåtna färg är svart/blyerts.

Tentamen i Objektorienterad modellering och design Helsingborg

Tentamen i Objektorienterad modellering och design

Exempelsamling Assemblerprogrammering

Tentamen Programmering fortsättningskurs DIT950

Tentamen i Objektorienterad modellering och design Helsingborg

Laboration 2: Designmönster

Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?

DAT043 - föreläsning 8

Föreläsning 13 Innehåll

TENTAMEN OOP

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

Föreläsning 2. Täcker material från lektion 1, 2, 3 och 4:

DVG C01 TENTAMEN I PROGRAMSPRÅK PROGRAMMING LANGUAGES EXAMINATION :15-13: 15

Principles of subclasses Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Typecasting - primitiva typer. Innehåll. DoME klasser

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Chapter 4: Writing Classes/ Att skriva egna klasser.

Föreläsning 15: Repetition DVGA02

Typhierarkier del 1 Gränssnitt, ärvning mellan gränssnitt, ärvning mellan klasser

Föreläsning 4 IS1300 Inbyggda system

F2 XP Extremprogrammering översikt

Föreläsning 8. Designmönster

Typkonvertering. Java versus C

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

F4. programmeringsteknik och Matlab

Separation of Concern. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016 Johannes Åman Pohjola, 2017

Programmering A. Johan Eliasson

Designmönster/Design patterns

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

1 Comparator & Comparable

Föreläsning 17 UTBLICK: FORTSÄTTNINGSKURSER I DATAVETENSKAP + ANDROID

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

Innehåll. Pekaren this Självreferens. Klasser Resurshantering, representation. Överlagring av operatorer. Överlagring av operatorer

Föreläsning 3-4 Innehåll

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 3

Sammanfattning. Listor. List-manipulering. Matris. /home/lindahlm/activity-phd/teaching/11dd1310/exercise3/exercise3.py September 13, 20111

Föreläsning 5&6 LOGISKA VARIABLER; IMPLEMENTERA KLASSER; MER ALGORITMER

Pedagogisk planering. Ron Chlebek. Centralt Innehåll. Svenska/Engelska. Lego Mindstorms. Syfte: Matematik

DD2387 Programsystemkonstruktion med C++ Tentamen 2

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

Schenker Privpak AB Telefon VAT Nr. SE Schenker ABs ansvarsbestämmelser, identiska med Box 905 Faxnr Säte: Borås

Föreläsning 8: Exempel och problemlösning

Support Manual HoistLocatel Electronic Locks

JAR som tar eller zip. Java. Exekvering

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Introduktion till objektorientering. Vad är objektorientering egentligen? Hur relaterar det till datatyper? Hur relaterar det till verkligheten?

Generics och polymorfism. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

TDA550 - Objektorienterad programvaruutveckling, fk

UML Objektdiagram. Objektorienterad modellering och design (EDAF25) Föreläsning 3. UML Sekvensdiagram. UML Objektdiagram. Agenda

Transkript:

F5 Enkel Design, Refaktorisering EDA260 Programvaruutveckling i grupp Projekt Görel Hedin Datavetenskap, LTH PVG, 2009 F5-1

Refaktorisering omstrukturering av koden utan att ändra det yttre beteendet PVG, 2009 F5-2

Enkel Design Simple Design Vår kod har enkel design om - den är tydlig, lättbegriplig - ingen duplicerad kod - all komplexitet skall vara motiverad av dagens behov testfallen PVG, 2009 F5-3

Exempel på icke-enkel design - krånglig kod, obegripliga namn - copy-paste kod - klass och metodskelett som inte används än - patterns som används i onödan, innan de verkligen behövs PVG, 2009 F5-4

Varför Enkel Design? XP s motivering - en komplicerad initial design kan vara spilld tid projektet ändrar riktning - en komplicerad slutlig design blir bättre om man gör den i många små steg Bygger på att vi kan/vågar ändra designen, vilket underlättas av - att koden är ren och tydlig - att koden täcks av testfall som fångar fel vi råkar införa vid ändringar - att vi systematiskt kan refaktorisera koden, helst med verktyg PVG, 2009 F5-5

Motsats till enkel design Big design upfront (BUF) - Detaljerad komplex design innan vi börjar implementera - Implementera alla klass och metodskelett i UML-verktyg innan man börjar implementera koden PVG, 2009 F5-6

I XP vill man istället... - Initial design på whiteboard. Diskutera flera olika möjligheter. - Ingen fullständig detaljerad design på detta stadium - Implementera i baby steps, få feedback på vilken design som fungerar i praktiken - Lägg till designkomplexitet, t.ex. olika patterns, efter behov under implementationen, som del av de stories som behöver denna komplexitet. - Se till att kontinuerligt diskutera designen så att alla i teamet är med på hur den nuvarande designen ser ut PVG, 2009 F5-7

Enkel Design: tydlig, lättbegriplig kod Vi skall kunna förstå koden utan att behöva dechiffrera den. T.ex.: - goda val av namn - namnge värden och beräkningar (som variabler och metoder) i stället för att bara koda algoritmen direkt - varje metod skall vara så liten och enkel att man lätt kan förstå vad som händer i den, och så att den är enkel att namnge - varje variabel skall användas till ett enkelt väldefinierat ändamål, så att den är enkel att namnge - dito för klass... -... och omvänt... - ingen dålig lukt i koden PVG, 2009 F5-8

Exempel på kod som behöver dechiffreras String s =...; int count = 0; char c; char prevc = x ; for (int k=0; k< s.length(); k++) { c = s.charat(k); if (c!= && prevc == ) count++; prevc = c; } if (c == ) count--; count++;... Börja med Extract Method -- extrahera ett stycke kod till en metod. Ge den ett lämpligt namn - ja vad gör den??? PVG, 2009 F5-9

Refaktoriserad kod String s =...; int count = numberofwordsin(s);... int numberofwordsin(string s) { int count = 0; char c; char prevc = x ; for (int k=0; k< s.length(); k++) { c = s.charat(k); if (c!= && prevc == ) count++; prevc = c; } if (c == ) count--; return count++; }... Designen kan kanske förenklas ytterligare... men först Testfall PVG, 2009 F5-10

Testfall assertequals("test1", 0, numberofwordsin( )); 0 _ 0 1 A 1 _A 1 A_ 1 _A _ 2 A_B 2 _A_B 2 A_B_ 2 ABC_DEF 7 A B C D E F G PVG, 2009 F5-11

Utfall 1 0 0 _ 0 1 A 1 _A 0 1 A_ 0 1 _A _ 2 A_B 3 2 _A_B 2 A_B_ 2 ABC_DEF 7 A B C D E F G PVG, 2009 F5-12

Refaktoriserad kod: Extract Method int numberofwordsin(string s) { int wordcount = 0; char prevc = ; char newc;/* Recognize shift from space to non-sp */ } for (int k=0; k< s.length(); k++) { newc = s.charat(k); if (prevc == && newc!= ) wordcount++; prevc = newc; } return wordcount; Och nu kör alla testfallen! PVG, 2009 F5-13

Tydlig lättbegriplig kod T.ex. - Sätt bra namn på varje beräkning och värde - Namnen ska uttrycka vad, och inte hur. XP Slogans - Express every idea - Express intention in the code, rather than algorithm PVG, 2009 F5-14

Enkel Design: ingen duplicerad kod Duplicerad kod uppkommer väldigt ofta - copy-paste är ett enkelt effektivt sätt att lösa problem Problem med duplicerad kod - Det verkar finnas en återkommande idé som skulle kunna extraheras och göras explicit. - Programmet kan bli onödigt stort och tar onödigt lång tid att läsa - Lätt att glömma uppdatera alla kodavsnitten vid en förändring PVG, 2009 F5-15

Exempel på duplicerad kod class Stack { void method push(object o) { if (Tracing.on && Tracing.traces(this)) System.out.println( Entering method Stack.push );... } } Object method pop(object o) { if (Tracing.on && Tracing.traces(this)) System.out.println( Entering method Stack.pop );... } PVG, 2009 F5-16

Refaktorisera! Använd Extract Method för att göra om den duplicerade koden till en metod, och Move Method för att flytta den till en bättre plats. PVG, 2009 F5-17

Refaktoriserad kod class Stack { void method push(object o) { Tracing.traceEnterMethod(this, Stack.push );... } } Object method pop(object o) { Tracing.traceEnterMethod(this, Stack.pop );... } class Tracing { void traceentermethod(object o, String methodname){ if (on && traces(o)) System.out.println( Entering method +methodname); } } Designen kan kanske förenklas ytterligare... PVG, 2009 F5-18

Duplicerad kod Om liknande kod förekommer på flera ställen - försök hitta vad det är för ide som inte är klart uttryckt - försök faktorisera ut den duplicerade koden, exempelvis till en ny metod - ofta blir koden både klarare och enklare XP slogan - once and only once PVG, 2009 F5-19

Enkel Design: ingen onödig komplexitet Fokusera på dagens behov - dagens behov definieras av testfallen - all komplexitet skall vara motiverad av testfallen - vi vidareutvecklar designen efter hand som behov uppstår Om vi tror att vi kommer att behöva en mer komplex design senare... - vänta med att införa den tills vi verkligen behöver den - genom att ha gjort en enklare design först kommer vi att lättare att kunna skapa en bra komplex design PVG, 2009 F5-20

Exempel på design som vidareutvecklas Banksystem Vi utvecklar ett banksystem för en lokal bank i Lund, och behöver en klass för att hantera pengar. Primärt krav: att kunna representera pengar som värden som kan adderas, subtraheras, beräknas ränta på, avrundas till närmsta 50-öring, etc. Vi inser att vi med tiden kommer att behöva hantera även andra valutor, t.ex. Euro, men detta är inget systemet behöver kunna idag. Vi designar för dagens behov svenska kronor... PVG, 2009 F5-21

Initial design och implementation: Kronor PVG, 2009 F5-22

Nytt krav Vissa företag i regionen vill kunna betala ut löner i andra valutor som Euro och danska kronor. Hur skall vi vidareutveckla designen? Kronor Möjliga strategier - Designa i förväg (inte XP): Tänk igenom alla tänkbara problem och ta fram ett komplett UML-diagram över den slutliga designen - Designa efter hand (XP): Tag ett litet problem i taget. Skriv testfall. Implementera. Refaktorisera till Enkel Design. PVG, 2009 F5-23

Nytt testfall Skriv nytt testfall för ytterligare en valuta, danska kronor. Money Refaktorisera: - Extrahera ny klass Money från Kronor för att göra det enklare att lägga till DKK. Lägg till ny klass DKK DKK SEK Refaktorisera: - Byt namn från Kronor till SEK för att få mer konsistent namngivning Är detta Enkel Design? PVG, 2009 F5-24

Vi har duplicerad kod Subklassernas metoder är mycket lika de skiljer sig bara åt i den typ de hanterar. Alternativ enklare design: parameterisera Money med en valuta i stället för att ha subklasser till Money DKK Money SEK PVG, 2009 F5-25

Resulterande design Money Designen kommer att fortsätta att utvecklas senare... String currency t.ex. - Representera valuta med klass Currency i stället för sträng - Möjlighet att hantera samling av pengar av olika valutor med hjälp av Composite-mönstret -... PVG, 2009 F5-26

XP slogans om Enkel Design Do the simplest thing that could possibly work - Vi nöjer oss med Kronor - vi behöver inte Money just nu. YAGNI You aren t gonna need it - Vi vet ju inte säkert om vi kommer att behöva flera valutor. Undvik design on speculation - Vi designar inte för flera valutor än - det vore att designa på spekulation vi vet inte om en sådan komplex design kommer att löna sig. Undvik BUF - Big Upfront Design - Det är mycket svårt att förutse vilken slutlig design som kommer att bli bäst utan att implementera den. Skall vi ha ärvning eller parametrisering, t.ex? Om vi designar medan vi implementerar får vi feedback från koden om vilken design som blir enklast. PVG, 2009 F5-27

Kan en Enkel Design vara komplex? Javisst, om det är ett komplext problem vi löser kan designen också behöva vara komplex. Designen är Enkel när - varje ide är explicit i koden, - det inte finns duplicerad kod, - all komplexitet i koden är motiverad av testfallen PVG, 2009 F5-28

Enkel Design är ett ideal Bättre ideer kan mogna fram efter hand. Programmeringsspråket är inte alltid kraftfullt nog. Viktigt att ha en gemensam kodningsstandard med - konsekvent namngivning - konsekvent användning av best practices (patterns, bibliotek, idiom,...) Efter ett antal ändringar upptäcker man plötsligt att man inte längre har tydlig lättbegriplig kod. PVG, 2009 F5-29

Bad Smells in Code [Fowler et al. Refactoring. Addison-Wesley 1999] PVG, 2009 F5-30

Bad Smells in Code Signalerar att man kanske inte har Enkel Design - Duplicated Code - Long Method - Large Class - Long Parameter List - Divergent Change - Shotgun Surgery - Feature Envy - Data Clumps - Primitive Obsession - Switch Statements - Parallel Inheritance Hierarchies - Lazy Class - Speculative Generality - Temporary Field - Message Chains - Middle Man - Inappropriate Intimacy - Alternative Classes with Different Interfaces - Incomplete Library Class - Data Class - Refused Bequest - Comments PVG, 2009 F5-31

Duplicate Code Det lättaste sättet att programmera något är att kopiera en bit kod som gör ungefär det man vill, och sedan modifiera koden. Ur [Fowler, Refactoring]: Three strikes and you refactor - 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. PVG, 2009 F5-32

Long Method Ur [Fowler, Refactoring]: - A heuristic we follow is that whenever we feel the need to comment something, we write a method instead. - Such a method contains the code that was commented but is named after the intention of the code rather than how it does it. - We may do this on a group of lines or on as little as a single line of code. - We do this even if the method call is longer than the code it replaces, provided the method name explains the purpose of the code. - The key here is not method length but the semantic distance between what the method does and how it does it. PVG, 2009 F5-33

Large class Ur [Fowler, Refactoring]: - When a class is trying to do too much, it often shows up as too many instance variables. - The usual solution... is either to Extract Class or Extract Subclass. PVG, 2009 F5-34

Shotgun surgery varje gång man gör en viss slags ändring så behöver man in och ändra i många olika klasser Lösning: delegera - problemet kan ibland lösas genom att flytta de påverkade metoderna till en ny klass med Move Method Men ibland är programmeringsspråket inte tillräckligt kraftfullt... Mer avancerad programmeringsteknik krävs som - introspection/reflection (möjlighet att under exekvering accessa och manipulera en representation av programmet) (se t.ex. biblioteket java.lang.reflect) - aspekt-orienterad programming (möjlighet att modularisera ortogonalt mot klasser och metoder) (se t.ex. http://www.eclipse.org/aspectj/) PVG, 2009 F5-35

Feature Envy En metod verkar passa bättre i en annan klass än den där den befinner sig Person String getname() String getaddress() String getphonenbr() * Register void print(person)... void print(person p) { System.out.println(p.getName(); System.out.println(p.getAddress(); System.out.println(p.getPhoneNbr(); } Flytta metoden med Move Method PVG, 2009 F5-36

Data Clumps Några data-värden förekommer tillsammans på flera platser, som parametrar och eller variabler. De borde egentligen samlas i ett objekt. GraphicalObject int xpos, ypos, zpos void setpos(int x, int y, int z) int getx() int gety() int getz() void movedelta(int dx, int dy, int dz) Använd Extract Class och Introduce Parameter Object för att eliminera data-klumparna. PVG, 2009 F5-37

Comments Kommentarer luktar egentligen gott. Exempel på bra kommentarer: - API-kommentarer - kommentarer om klasser, paket, etc. - kommentarer som klargör varför koden ser ut som den gör - kommentarer om oklara saker som behöver arbetas vidare på Varningsflaggan gäller deodorant -kommentarer. - Fungerar kommentarerna som deodorant för snårig kod? - Försvinner behovet av kommentaren om koden refaktoriseras? Använd Extract Method för att bryta ut snårig del av koden. Använd Rename... för att göra koden klarare. PVG, 2009 F5-38

Refaktorisering (Refactoring) omstrukturering av koden utan att ändra det yttre beteendet PVG, 2009 F5-39

När gör man refaktorisering? Hela tiden! Innan en ändring, för att underlätta ändringen. Efter en ändring, för att upprätthålla Enkel Design När man läser kod, för att förstå den bättre, och gradvis få mer Enkel Design PVG, 2009 F5-40

Exempel på refaktoriseringar Composing methods - Extract/Inline Method - Introduce Explaining Variable - Split Temporary Variable -... Moving features between objects - Move Method - Extract/Inline Class - Hide Delegate -... [Fowler] Organizing data - Replace Data Value with Object - Encapsulate Field - Replace Type Code with Subclasses -... Simplifying conditional expressions - Decompose Conditional - Introduce Null Object -... PVG, 2009 F5-41

Forts. Making method calls simpler - Rename Method - Add/Remove Parameter - Separate Query from Modifier - Introduce Parameter Object -... Dealing with Generalization - Pull Up/Push Down Field/Method/Constructor - Extract subclass/superclass/interface - Replace Inheritance with Delegation -... Big refactorings - Tease Apart Inheritance - Convert Procedural Design to Objects - Separate Domain from Presentation -... PVG, 2009 F5-42

Exempel: Add Parameter Vi håller på med en deluppgift (task) och behöver införa en ny parameter till en metod. void print() Person Person void print(stream) I princip trivialt. Men det är en god ide att göra refaktoriseringen först och kolla att testerna fortfarande fungerar Därefter kan man börja implementera den funktionalitet som använder den nya parametern. PVG, 2009 F5-43

Mekanik för att undvika många fel på en gång: - Kontrollera om det finns implementationer av metoden i super- eller subklasser. I så fall skall dessa steg göras för varje implementation. - Deklarera en ny metod med den nya parametern. Kopiera det gamla metodinnehållet till den nya metoden. - Kompilera. - Ändra den gamla metoden så att den anropar den nya. Använd t.ex. null som värde på den nya parametern. - Kompilera och testa. - Leta rätt på alla anrop till den gamla metoden och ändra dem så att de anropar den nya metoden. Kompilera och testa efter varje ändring. - Ta bort den gamla metoden. - Kompilera och testa. Gå vidare med deluppgiften. PVG, 2009 F5-44

Länkar om refaktorisering Katalog över alla Fowler s refaktoriseringar - http://www.refactoring.com/catalog/ PVG, 2009 F5-45

Labb 4: Refaktorisering Utnyttja refaktoriseringsverktyg i integrerad programutvecklingsmiljö (Eclipse) Förberedelser - Materialet för F5 (se kurswebben) - Labbhandledningen PVG, 2009 F5-46

Sammanfattning Enkel design - tydlig lättläst kod - ingen duplicerad kod - ingen komplexitet som ej behövs för nuvarande testfall Kodlukter Refaktorisering - omstrukturering av koden utan att ändra yttre beteendet PVG, 2009 F5-47