Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Code Refactoring                Milan Vukoje              www.vukoje.net
Soprex•   SkfOffice2•   SkfOffice3•   Big5•   Quality oriented•   We are hiring…
Agenda•   Why is (clean) code important?•   Refactoring (definition and samples)•   Tools•   When to and when not to refac...
Is code important?•   Is construction relatively mechanical process?•   Only activity that’s guaranteed to be done•   50-6...
Coding Horror•   Stress•   Fear•   Cargo cult programming•   “Just in case” coding•   Unusual software bugs (Heisenbug    ...
Code Example
Technical Debt– If you can get todays work done today, but you do it  in such a way that you cant possibly get tomorrows  ...
Refactoring• Refactoring - a change made to the internal structure of software to  make it easier to understand and cheape...
Composing Methods1. Extract Methodvoid printOwing(double amount) {  printBanner();    //print details    System.out.printl...
Composing Methods2. Inline Methodint getRating() {   return (moreThanFiveLateDeliveries()) ? 2 : 1;}boolean moreThanFiveLa...
Managing temps1. Inline Tempdouble basePrice = anOrder.basePrice();return (basePrice > 1000)return (anOrder.basePrice() > ...
Managing temps2. Replace Temp with Query  double basePrice = _quantity * _itemPrice;  if (basePrice > 1000)      return ba...
Managing temps3. Introduce Explaining Variableif ( (platform.toUpperCase().indexOf("MAC") > -1) &&     (browser.toUpperCas...
Simplifying conditionals1. Decompose Conditional if (date.before (SUMMER_START) || date.after(SUMMER_END))    charge = qua...
Simplifying conditionals2. Consolidate Duplicate Fragments if (isSpecialDeal()) {    total = price * 0.95;    send(); } el...
Simplifying conditionals3. Consolidate Conditional Expressiondouble disabilityAmount() {  if (_seniority < 2) return 0;  i...
Moving Features between objects•   Replace Method with Method Object•   Extract/Inline Class•   Pull Up/Down Field/Method•...
Benefits• Less code  – less bugs• Readable business logic  – better business domain understanding• Self explaining code  –...
Visual Studio 2008
Need for refactoring• Why change something that works?    – We want programs that are easy to read, that have all logic   ...
When Should You Refactor?• Not having enough time usually is a sign that you need to do some  refactoring. – Martin Fowler...
Code smells•   Duplicated Code•   Long Method•   Large Class•   Switch Statements•   Lazy Class•   Speculative Generality•...
When you shouldn’t refactor?Avoid refactoring:• Databases• Published interfaces• Code is so full of bugs that you cannot s...
Performance and Refactoring• Performance optimization = obscure code• Optimized for humans = slower code but  easier tunin...
What Do I Tell My Manager?• If the manager is quality oriented, then the thing to  stress is the quality aspects.• Tons of...
Summary1. Programming is hard and complex2. (Clean) Code is very important3. Refactoring can help you achieve clean code  ...
Questions?                   Milan Vukoje               www.vukoje.net             vukoje@gmail.com
Molimo vas da popunite ankete!      Please fill out the evaluations!Vaše mišljenje čini osnovu    Your opinion forms the n...
Upcoming SlideShare
Loading in …5
×

Code Refactoring

925 views

Published on

Presentation about code refactoring and importance of code quality

  • Be the first to comment

  • Be the first to like this

Code Refactoring

  1. 1. Code Refactoring Milan Vukoje www.vukoje.net
  2. 2. Soprex• SkfOffice2• SkfOffice3• Big5• Quality oriented• We are hiring…
  3. 3. Agenda• Why is (clean) code important?• Refactoring (definition and samples)• Tools• When to and when not to refactor?• Summary
  4. 4. Is code important?• Is construction relatively mechanical process?• Only activity that’s guaranteed to be done• 50-65% of overall effort• 50-75% of overall errors
  5. 5. Coding Horror• Stress• Fear• Cargo cult programming• “Just in case” coding• Unusual software bugs (Heisenbug , Mandelbug, Schroedinbug… )
  6. 6. Code Example
  7. 7. Technical Debt– If you can get todays work done today, but you do it in such a way that you cant possibly get tomorrows work done tomorrow, then you lose. – Kent Beck• When software organization chooses a design or construction approach thats expedient in the short term but that increases complexity and is more costly in the long term.• Unintentional and intentional debt
  8. 8. Refactoring• Refactoring - a change made to the internal structure of software to make it easier to understand and cheaper to modify without changing its observable behavior.• Set of rules and techniques for enhancing code while reducing chances for error• Refactoring: Improving the Design of Existing Code --Martin Fowler
  9. 9. Composing Methods1. Extract Methodvoid printOwing(double amount) { printBanner(); //print details System.out.println ("name:" + _name); System.out.println ("amount" + amount);}void printOwing(double amount) { printBanner(); printDetails(amount);}void printDetails (double amount) { System.out.println ("name:" + _name); System.out.println ("amount" + amount);}
  10. 10. Composing Methods2. Inline Methodint getRating() { return (moreThanFiveLateDeliveries()) ? 2 : 1;}boolean moreThanFiveLateDeliveries() { return _numberOfLateDeliveries > 5;}int getRating() { return (_numberOfLateDeliveries > 5) ? 2 : 1;}
  11. 11. Managing temps1. Inline Tempdouble basePrice = anOrder.basePrice();return (basePrice > 1000)return (anOrder.basePrice() > 1000)
  12. 12. Managing temps2. Replace Temp with Query double basePrice = _quantity * _itemPrice; if (basePrice > 1000) return basePrice * 0.95; else return basePrice * 0.98; if (basePrice() > 1000) return basePrice() * 0.95; else return basePrice() * 0.98;... double basePrice() { return _quantity * _itemPrice; }
  13. 13. Managing temps3. Introduce Explaining Variableif ( (platform.toUpperCase().indexOf("MAC") > -1) && (browser.toUpperCase().indexOf("IE") > -1) && wasInitialized() && resize > 0 ) { // do something } final boolean isMacOs = platform.toUpperCase().indexOf("MAC") > -1; final boolean isIEBrowser = browser.toUpperCase().indexOf("IE") > -1; final boolean wasResized = resize > 0; if (isMacOs && isIEBrowser && wasInitialized() && wasResized) { // do something }
  14. 14. Simplifying conditionals1. Decompose Conditional 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);
  15. 15. Simplifying conditionals2. Consolidate Duplicate Fragments if (isSpecialDeal()) { total = price * 0.95; send(); } else { total = price * 0.98; send(); } if (isSpecialDeal()) total = price * 0.95; else total = price * 0.98; send();
  16. 16. Simplifying conditionals3. Consolidate Conditional Expressiondouble disabilityAmount() { if (_seniority < 2) return 0; if (_monthsDisabled > 12) return 0; if (_isPartTime) return 0; // compute the disability amountdouble disabilityAmount() { if (isNotEligableForDisability()) return 0; // compute the disability amount
  17. 17. Moving Features between objects• Replace Method with Method Object• Extract/Inline Class• Pull Up/Down Field/Method• Extract Subclass/ Superclass/Interface• Collapse Hierarchy
  18. 18. Benefits• Less code – less bugs• Readable business logic – better business domain understanding• Self explaining code – Less documentation and faster changes• Better design – Higher encapsulation and reusability – Cleaner concepts and structure
  19. 19. Visual Studio 2008
  20. 20. Need for refactoring• Why change something that works? – We want programs that are easy to read, that have all logic specified in one and only one place, that do not allow changes to endanger existing behavior, and that allow conditional logic to be expressed as simply as possible. --Kent Beck• Micro design - clear API and logical structures• Code evolution - Embracing change• Avoiding coding horror by managing complexity• Agile methods (XP, TDD, Scrum)
  21. 21. When Should You Refactor?• Not having enough time usually is a sign that you need to do some refactoring. – Martin Fowler• Refactor all the time in little steps• Refactor when you: – add function – fix a bug – do a code review• Refactoring and Unit Tests?
  22. 22. Code smells• Duplicated Code• Long Method• Large Class• Switch Statements• Lazy Class• Speculative Generality• Temporary Field• Message Chains• …
  23. 23. When you shouldn’t refactor?Avoid refactoring:• Databases• Published interfaces• Code is so full of bugs that you cannot stabilize it• When you are very close to a deadline• When you are not sure• Don’t overdo it (no silver bullet) – Perfect is the enemy of good, and good is what we want
  24. 24. Performance and Refactoring• Performance optimization = obscure code• Optimized for humans = slower code but easier tuning• 10% optimized code is usually enough
  25. 25. What Do I Tell My Manager?• If the manager is quality oriented, then the thing to stress is the quality aspects.• Tons of studies show that technical reviews are an important way to reduce bugs and thus speed up development.• Dont tell!?
  26. 26. Summary1. Programming is hard and complex2. (Clean) Code is very important3. Refactoring can help you achieve clean code and better design.4. Refactoring should be used wisely 1. Don’t over do it (no silver bullet) 2. Know when not to refactor 3. Changes must not cause new bugs
  27. 27. Questions? Milan Vukoje www.vukoje.net vukoje@gmail.com
  28. 28. Molimo vas da popunite ankete! Please fill out the evaluations!Vaše mišljenje čini osnovu Your opinion forms the next sledede Sinergije i Sinergija conference, and it omogudava nam da provides us with the meansoblikujemo sadržaj u skladu to shape its content to best sa Vašim željama. suit you.Svi posetioci koji popune All attendees that fill out the ankete ulaze u nagradnu evaluations are taking part igru in drawing of special prizes

×