340 likes | 386 Views
Learn the art of refactoring to improve code quality without altering behavior. Explore techniques and best practices for sustainable software development.
E N D
Refactoring AdvancedProgramming in Java MehdiEinali
Once upon a time … • A team start a project • Project got many attention and team has to add new features in short time • Programmer with overtime task: “I will fix this later”
After a while • Changes slowed down by messy code • As productivity decreases more programmer assigned to project • New programmer with messy code results in more messy code
rebellion • Eventually the team rebels. • A new tiger team is selected • Best technologies has been chosen • Now the two teams are in a race • This race can go on for a very long time • Tiger team is now under pleasure of comparison with old low feature but working version • Messy code again and again once upon a time
Refactoring • A disciplined way to restructure code in order to improve code quality without changing its behavior • A change made to the internal structure of software to make it easier to understand and cheaper to modify without changing its observable behavior.
Refactoring • Refactoring is the process of changing a software system • In such a way that it does not alter the external behavior of the code • But improves its internal structure • It is a disciplined way to clean up code • It minimizes the chances of introducing bugs • When you refactor, you are improving the design of the code after it has been written.
Refactoring • By continuously improving the design of code, we make it easier and easier to work with Joshua Kerievsky, Refactoring to Patterns
Example • Duplicate Code • What are the drawbacks? • What is the solution? • Refactoring: • Finding a “Bad Smell” • Changing the code to remove the bad smell • Some well-known bad smells are reported
Bad Smell • A bad smell in code • Any symptom in the source code that possibly indicates a deeper problem. • The term is coined by Kent Beck.
Bad Smells • Duplicated Code • Long Method • Large Class • Long Parameter List • Divergent Change • …
Refactoring Techniques • Extract Method • Move • Method • Variable • Class • Extract Class • Rename • Method • Variable • Class • Pull Up • Push Down
IDE Support • Refactoring techniques are widely supported by IDEs
The Two Hats • Kent Beck's metaphor of two hats • Divide your time between two distinct activities • adding function • refactoring
Why Should I Refactor? • Improves the Design of Software • Makes Software Easier to Understand • Helps You Find Bugs • Helps You Program Faster • Refactoring makes your code more maintainable
When Should You Refactor? • The Rule of Three: • Refactor When You Add Function • Refactor When You Need to Fix a Bug • Refactor As You Do a Code Review
Scanner s = new Scanner(System.in); System.out.println("Rectangle Info."); System.out.print("Enter the width: "); int a1 = s.nextInt(); System.out.print("Enter the length: "); int a2 = s.nextInt(); System.out.println("Rectangle Info."); System.out.print("Enter the width: "); int b1 = s.nextInt(); System.out.print("Enter the length: "); int b2 = s.nextInt(); int x = a1*a2; int y = b1*b2; if(x == y) System.out.println("Equal"); Find bad smells! Refactor the Code!
Scanner scanner = new Scanner(System.in); System.out.println("Rectangle Info."); System.out.print("Enter the width: "); int width1 = scanner.nextInt(); System.out.print("Enter the length: "); int length1 = scanner.nextInt(); System.out.println("Rectangle Info."); System.out.print("Enter the width: "); int width2 = scanner.nextInt(); System.out.print("Enter the length: "); int length2 = scanner.nextInt(); int area1 = width1*length1; int area2 = width2*length2; if(area1 == area2) System.out.println("Equal"); Rename…
class Rectangle{ privateintlength , width; publicintgetLength() { returnlength; } publicvoidsetLength(int length) { this.length = length; } publicintgetWidth() { returnwidth; } publicvoidsetWidth(int width) { this.width = width; } public Rectangle(int length, int width) { this.length = length; this.width = width; } } Extract Class…
Scanner scanner = new Scanner(System.in); System.out.println("Rectangle Info."); System.out.print("Enter the width: "); int width = scanner.nextInt(); System.out.print("Enter the length: "); int length = scanner.nextInt(); Rectangle rectangle1 = new Rectangle(length, width); System.out.println("Rectangle Info."); System.out.print("Enter the width: "); width = scanner.nextInt(); System.out.print("Enter the length: "); length = scanner.nextInt(); Rectangle rectangle2 = new Rectangle(length, width); int area1 = rectangle1.getWidth()*rectangle1.getLength(); int area2 = rectangle2.getWidth()*rectangle2.getLength(); if(area1 == area2) System.out.println("Equal");
class Rectangle{ ... publicint area(){ returnlength * width; } } … int area1 = rectangle1.area(); int area2 = rectangle2.area(); Extract Method…
privatestatic Rectangle readRectangle(Scanner scanner) { int width; int length; System.out.println("Rectangle Info."); System.out.print("Enter the width: "); width = scanner.nextInt(); System.out.print("Enter the length: "); length = scanner.nextInt(); Rectangle rectangle2 = new Rectangle(length, width); return rectangle2; } Extract Method…
Refactored Code Scanner scanner = new Scanner(System.in); Rectangle rectangle1 = readRectangle(scanner); Rectangle rectangle2 = readRectangle(scanner); int area1 = rectangle1.area(); int area2 = rectangle2.area(); if(area1 == area2) System.out.println("Equal");
Make it hard for bugs to hide Clean code does one thing well
Never obscure the designer’s intent Reads like well-written prose
Each routine you read turn out to be pretty much what you expect
(Conclusion)Clean code is • Make if hard for bugs to hide • Clean code does one thing well • Reads like well-written prose • Never obscure the designer’s intent • Provides one way rather than many ways for doing one thing • Each routine you read turn out to be pretty much what you expect
notes • Clean Programming is some thing like martial art • Combination of technique and art. • The Art of Computer Programming by Knuth • Have different school of thoughts • Clean Programming is skill • Good learning results in good use forever • Changing bad learning is hard • Like Driving!
Reference • Refactoring: improving the design of existing code, Martin Fowler, Kent Beck,JohnBrant, William Opdyke, Don Roberts(1999) • Clean code,A handbook of agile software craftmanship,Robert C Martin,2008, Prentice Hall