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

Relevanta dokument
F5 Enkel Design, Refaktorisering

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

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

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

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

Föreläsning 23. Tobias Wrigstad. Refaktorering

Agil projektmetodik Varför och vad är det?

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

Classes och Interfaces, Objects och References, Initialization

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

F2 XP Extremprogrammering översikt

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

Kritik av Extrem Programmering

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

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

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

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

Mjukvarudesign. Designprocessen. Teknisk design. Konceptuell design

Klassdeklaration. Metoddeklaration. Parameteröverföring

Testdriven utveckling. Teorin bakom testdriven utveckling. Bakgrund. Januari 2009, KTH. Alexander Tarnowski

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

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

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

Agil programutveckling

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

Recitation 4. 2-D arrays. Exceptions

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

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

F6 Arkitektur, Planering. EDAF45 Programvaruutveckling i grupp Projekt Boris Magnusson, Ulf Asklund Datavetenskap, LTH

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

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

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

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

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

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

XP-projekt: En fördjupning

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

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

DAT043 - föreläsning 8

Exempelsamling Assemblerprogrammering

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

1 Comparator & Comparable

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

Objektsamlingar i Java

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

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

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

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

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 15: Repetition DVGA02

App analytics TDP028

Föreläsning 13 Innehåll

Föreläsning 5-6 Innehåll

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

Typkonvertering. Java versus C

Föreläsning 4 IS1300 Inbyggda system

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

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

Laboration 2: Designmönster

TENTAMEN OOP

Föreläsning 3: Booleans, if, switch

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

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

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

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

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

Tentamen i Objektorienterad modellering och diskreta strukturer

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

F4. programmeringsteknik och Matlab

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

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

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

Tentamen Programmering fortsättningskurs DIT950

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

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

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

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

Föreläsning 3-4 Innehåll

Typecasting - primitiva typer. Innehåll. DoME klasser

Välkommen till. Datastrukturer, algoritmer och programkonstruktion. eller DOA

Testautomatisering. BDD, RSpec

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

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

Tentamen i Objektorienterad modellering och design Helsingborg

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

F11 - Rekursion. ID1004 Objektorienterad programmering Fredrik Kilander

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

Föreläsning 8. Designmönster

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

Programmering A. Johan Eliasson

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

Tentamen i Grundläggande Programvaruutveckling, TDA548

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

Kursutvärderare: IT-kansliet/Christina Waller. General opinions: 1. What is your general feeling about the course? Antal svar: 17 Medelvärde: 2.

TDA550 - Objektorienterad programvaruutveckling, fk

Aktivitet ett: Kommunicera! Aktiviteter i praktiken. Parprogrammering. Aktiviteter. Parprogrammeringens sju myter. Parprogrammeringens sju myter

Note to programmers. Embrace Change! Extreme Programming? Fyra basaktiviteter. 12 Practices / sedvanor. Vad är Extreme Programming

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

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

Objektorienterad Programkonstruktion. Föreläsning jan 2016

Transkript:

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

XP:s Deltekniker (Practices) 1. Planering Planeringsspelet Regelbundna releaser Hållbart tempo Kund i teamet 2. Utveckling Test-driven utveckling (TDD) Parprogrammering Kollektivt ägande Kontinuerlig integration 3. Kodning och Design Enkel design Refaktorisering Kodningsstandard Gemensam vokabulär 4. Dessutom Gemensamt utvecklingsrum Nollte iterationen Spikes 2

Refaktorisering Omstrukturering av koden utan att ändra det yttre beteendet 3

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 4

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 5

Varför är Enkel Design XP s motivering viktigt? 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 6

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 7

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 8

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 9

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 koden??? 10

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 11

Testfall - förväntat utfall assertequals( Test1,0,numbersOfWordsIn( )); 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 12

Testfall - verkligt utfall 1 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 13

Refaktoriserad kod 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! 14

Man kan gå vidare boolean startofword(char c1, char c2) { return (c1 == && c2!= ); } int numberofwordsin(string s) { int wordcount = 0; char prevc = ; char newc; for (int k=0; k< s.length(); k++) { newc = s.charat(k); if( startofword(prevc,newc)) wordcount++; prevc = newc; } return wordcount; } Kör testfall efter varje förändring! 15

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 16

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 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 Det verkar finnas en återkommande idé som skulle kunna extraheras och göras explicit. 17

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 );... } 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. 18

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... 19

Duplicerad kod Om liknande kod förekommer på flera ställen försök hitta vad det är för idé 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 20

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 21

Exempel på design som Banksystem vidareutvecklas 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 krona, 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... 22

Initial design och implementation: Kronor 23

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? Möjliga strategier Designa i förväg (inte XP): Tänk igenom alla tänkbara problem och ta fram ett komplett UMLdiagram över den slutliga designen Designa efter hand (XP): Tag ett litet problem i taget. Skriv testfall. Implementera. Refaktorisera till Enkel Design. 24

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

Vi har duplicerad kod Subklassernas metoder är mycket lika de skiljer sig bara åt i den typ de hanterar. Move metod All kod hamnar i Money! Alternativ enklare design: parametrisera Money med en valuta i stället för att ha subklasser till Money 26

Resulterande design Designen kommer att fortsätta att utvecklas senare 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 Med gamla Brittiska pengar (Pund, Shilling, Pence) hade krävt en subklass - tur de försvann i tid! Money String currency; 27

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. 28

Kan en Enkel Design vara komplex? Essential vs. Accidential complexity. [Brooks: No Silver Bullet 1987] Javisst, om det är ett komplext problem vi löser kan designen också behöva vara komplex. Designen är Enkel när varje idé är explicit i koden, det inte finns duplicerad kod, all komplexitet i koden är motiverad av testfallen liten andel accidential complexity. 29

Enkel Design är ett ideal Bättre idéer 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. 30

Refaktorisera - När? När koden Luktar illa Bad Smells in Code [Fowler et al. Refactoring. Addison-Wesley 1999] 31

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 32

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 1. The first time you do something, you just do it. 2. The second time you do something similar, you wince at the duplication, but you do the duplicate thing anyway. 3. The third time you do something similar, you refactor. 33

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. 34

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. 35

Shotgun surgery Tecken: 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/) 36

Feature Envy En metod verkar passa bättre i en annan klass än den där den befinner sig (många punkter på samma objekt) Person String getname() String getaddress() String getphonenbr() * Register void print(person p) { System.out.println(p.getName()); System.out.println(p.getAddress()); System.out.println(p.getPhoneNbr()); } Flytta metoden med Move Method Person String getname() String getaddress() String getphonenbr() void print() * 37 Register void print(person p) { p.print(); }

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. Position eller Vektor! 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) void Använd Extract Class och Introduce Parameter Object för att eliminera data-klumparna. 38

Comments Kommentarer luktar egentligen gott. Exempel på bra kommentarer: API-kommentarer kommentarer om klasser, paket, etc. deras uppgift, ansvar. 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. 39

Refaktorisering (Refactoring) Omstrukturering av koden utan att ändra det yttre beteendet 40

När gör man refaktorisering? Hela tiden! Innan en ändring, för att underlätta ändringen. (Upload så tidigt som möjligt!) 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 41

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

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 -... 43

Exempel: Add Parameter Vi håller på med en deluppgift (task) och behöver införa en ny parameter till en metod. Person void print() Person void print(stream s) I princip trivialt - men ändringar på många ställen. Men det är en god idé 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. 44

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. Glömt nått ställe? Gå vidare med deluppgiften. void print(stream s) <kopia> void print() print(null); void print() print(null); 45

Länkar om refaktorisering Katalog över alla Fowler s refaktoriseringar http://www.refactoring.com/catalog/ 46

Lab 3: Testning och Parprogrammering Denna vecka Förberedelse - se Föreläsning F04 47

Labb 4: Refaktorisering Utnyttja refaktoriseringsverktyg i integrerad programutvecklingsmiljö (Eclipse) Förberedelser F5 Denna föreläsning Labbhandledningen 48

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 49