O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.
1 de 74

Refactoring - Agile Tech Conference 2016

10

Compartilhar

Baixar para ler offline

Bryan Beecham Refactoring talk from Agile Alliance Tech Conference in 2016. Full of great quotes from industry thought leaders.

Audiolivros relacionados

Gratuito durante 30 dias do Scribd

Ver tudo

Refactoring - Agile Tech Conference 2016

  1. 1. Understanding
 Refactoring Bryan Beecham
 @BillyGarnet
 bryan@industriallogic.com Writing Healthy Code
  2. 2. @BillyGarnet Is software designed to be simple and elegant more valuable
 than software that is complex and hard to maintain?
  3. 3. @BillyGarnet ~9600 line vb class named frm2
  4. 4. Continuous Improvement
  5. 5. Simplicity
  6. 6. @BillyGarnet “Simplicity is the only thing that really scales.” –Joshua Kerievsky
  7. 7. @BillyGarnet Modern Agile Make People Awesome
 Make Safety a Prerequisite
 Experiment and Learn Rapidly
 Deliver Value Continuously
  8. 8. @BillyGarnet Refactoring Improving the design of existing code
  9. 9. @BillyGarnet “Refactoring is the process of changing a software system in such a way that it does not alter the external behaviour of the code yet improves its internal structure.” –Martin Fowler
  10. 10. @BillyGarnet It must work. It must be understandable. It must be updatable. Needs of Software What should software do?
  11. 11. Reasons to extract a function ✤ To reuse it (the only reason some consider). ✤ To name it’s operation. ✤ To make it testable. ✤ To get it out of your way so you can see the code that called it more clearly.
  12. 12. @BillyGarnet Remove the Clutter. Remove the Complexity. Remove the Cleverness. Three Cs
  13. 13. @BillyGarnet Duplication Duplication Duplication Three Ds
  14. 14. @BillyGarnet Ring of Fire Johnny Cash
  15. 15. @BillyGarnet ➤ Love is a burnin' thing, ➤ And it makes a fiery ring ➤ Bound by wild desire ➤ I fell into a ring of fire. ➤ I fell into a burnin' ring of fire ➤ I went down, down, down ➤ And the flames went higher, ➤ And it burns, burns, burns, ➤ The ring of fire, the ring of fire. ➤ I fell into a burnin' ring of fire ➤ I went down, down, down ➤ And the flames went higher, ➤ And it burns, burns, burns, ➤ The ring of fire, the ring of fire. ➤ The taste of love is sweet ➤ When hearts like ours meet. ➤ I fell for you like a child ➤ Oh, but the fire went wild. ➤ I fell into a burnin' ring of fire ➤ I went down, down, down ➤ And the flames went higher, ➤ And it burns, burns, burns, ➤ The ring of fire, the ring of fire. ➤ I fell into a burnin' ring of fire ➤ I went down, down, down, ➤ And the flames went higher, ➤ And it burns, burns, burns, ➤ The ring of fire, the ring of fire. ➤ And it burns, burns, burns, ➤ The ring of fire, the ring of fire. ➤ The ring of fire, the ring of fire ➤ The ring of fire
  16. 16. @BillyGarnet Love is a burnin' thing, And it makes a fiery ring Bound by wild desire I fell into a ring of fire. I fell into a burnin' ring of fire I went down, down, down And the flames went higher, And it burns, burns, burns, The ring of fire, the ring of fire. I fell into a burnin' ring of fire I went down, down, down And the flames went higher, And it burns, burns, burns, The ring of fire, the ring of fire. The taste of love is sweet When hearts like ours meet. I fell for you like a child Oh, but the fire went wild. I fell into a burnin' ring of fire I went down, down, down And the flames went higher, And it burns, burns, burns, The ring of fire, the ring of fire. I fell into a burnin' ring of fire I went down, down, down, And the flames went higher, And it burns, burns, burns, The ring of fire, the ring of fire. And it burns, burns, burns, The ring of fire, the ring of fire. The ring of fire, the ring of fire The ring of fire
  17. 17. @BillyGarnet Love is a burnin' thing, And it makes a fiery ring Bound by wild desire I fell into a ring of fire. I fell into a burnin' ring of fire I went down, down, down And the flames went higher, And it burns, burns, burns, The ring of fire, the ring of fire. I fell into a burnin' ring of fire I went down, down, down And the flames went higher, And it burns, burns, burns, The ring of fire, the ring of fire. The taste of love is sweet When hearts like ours meet. I fell for you like a child Oh, but the fire went wild. I fell into a burnin' ring of fire I went down, down, down And the flames went higher, And it burns, burns, burns, The ring of fire, the ring of fire. I fell into a burnin' ring of fire I went down, down, down, And the flames went higher, And it burns, burns, burns, The ring of fire, the ring of fire. And it burns, burns, burns, The ring of fire, the ring of fire. The ring of fire, the ring of fire The ring of fire
  18. 18. @BillyGarnet Love is a burnin' thing, And it makes a fiery ring Bound by wild desire I fell into a ring of fire. 
 (CHORUS) I fell into a burnin' ring of fire I went down, down, down And the flames went higher, And it burns, burns, burns, The ring of fire, the ring of fire. I fell into a burnin' ring of fire I went down, down, down And the flames went higher, And it burns, burns, burns, The ring of fire, the ring of fire. The taste of love is sweet When hearts like ours meet. I fell for you like a child Oh, but the fire went wild. I fell into a burnin' ring of fire I went down, down, down And the flames went higher, And it burns, burns, burns, The ring of fire, the ring of fire. I fell into a burnin' ring of fire I went down, down, down, And the flames went higher, And it burns, burns, burns, The ring of fire, the ring of fire. And it burns, burns, burns, The ring of fire, the ring of fire. The ring of fire, the ring of fire The ring of fire
  19. 19. @BillyGarnet Love is a burnin' thing, And it makes a fiery ring Bound by wild desire I fell into a ring of fire. 
 (CHORUS) I fell into a burnin' ring of fire I went down, down, down And the flames went higher, And it burns, burns, burns, The ring of fire, the ring of fire. CHORUS The taste of love is sweet When hearts like ours meet. I fell for you like a child Oh, but the fire went wild. CHORUS CHORUS And it burns, burns, burns, The ring of fire, the ring of fire. The ring of fire, the ring of fire The ring of fire
  20. 20. @BillyGarnet (CHORUS) I fell into a burnin' ring of fire I went down, down, down And the flames went higher, And it burns, burns, burns, The ring of fire, the ring of fire. The taste of love is sweet When hearts like ours meet. I fell for you like a child Oh, but the fire went wild. And it burns, burns, burns, The ring of fire, the ring of fire. The ring of fire, the ring of fire The ring of fire Love is a burnin' thing, And it makes a fiery ring Bound by wild desire I fell into a ring of fire. CHORUS CHORUS
  21. 21. @BillyGarnet Wow! That’s much easier to read
  22. 22. @BillyGarnet Why Refactor?
  23. 23. Development slows over time
  24. 24. @BillyGarnet
  25. 25. Return on Investment (ROI)
  26. 26. @BillyGarnet How many people have been on a project where the requirements didn’t change?
  27. 27. @BillyGarnet Quotes From some people I like…
  28. 28. @BillyGarnet “It seems that perfection is attained not when there is nothing more to add, but when there is nothing more to remove.” –Antoine de Saint Exupéry
  29. 29. @BillyGarnet “Refactoring ought to be invisible. 
 It should be part of every task, and not a task on its own.” ~Tim Ottinger
  30. 30. @BillyGarnet “It (refactoring) is the cheapest and safest way to read code. It is also the only way to safely change untestable code so that you can then start wrapping it in tests.” ~Arlo Belshee
  31. 31. @BillyGarnet “ Getting an app to work is the app-titude test for a programmer.
 There is a lot more to programming than just getting your app to work” ~James Grenning
  32. 32. @BillyGarnet “Refactoring can be done in smaller steps than you think it can, never breaking the program.” ~Ron Jeffries
  33. 33. @BillyGarnet “Relentless refactoring is the single best thing you 
 can do to fix and avoid technical debt” ~Declan Whelan
  34. 34. @BillyGarnet “I refactor for one reason: to reduce volatility in the marginal cost of features.” ~J.B. Rainsberger
  35. 35. @BillyGarnet “Refactoring is like breathing. You should do it all of the time without giving it much thought.” ~Jeff ‘Cheezy’ Morgan
  36. 36. @BillyGarnet “We refactor to embrace change.” ~Bryan Beecham
  37. 37. @BillyGarnet “You have two options, you can refactor, or you can build a big ball of mud.” ~Chet Hendrickson
  38. 38. @BillyGarnet “For each desired change, make the change easy (warning: this may be hard), 
 then make the easy change.” ~Kent Beck
  39. 39. @BillyGarnet “If you’re a little better each day, next year you’ll be great.
 If you’re a little worse each day, next year you’ll be horrible.” ~Llewellyn Falco
  40. 40. @BillyGarnet “Imagine how good a bowler you could be if you could adjust the direction of the ball once it's left your hands. Refactoring is what does that for us in writing code.” ~Woody Zuill
  41. 41. @BillyGarnet “Business is well served by continuous refactoring, yet the practice of refactoring must co-exist harmoniously with business priorities.” ~Joshua Kerievsky
  42. 42. @BillyGarnet “Refactoring, above all else, is a tool for managing risk.” ~Amitai Schlair
  43. 43. @BillyGarnet “To me, refactoring is the most pleasant part of programming.
 I find it meditative and soothing, to change my code and my design until it can be grasped almost instantly.” ~Mike ‘GeePaw’ Hill
  44. 44. @BillyGarnet “Rename class is the most powerful refactoring.” ~Michael Feathers
  45. 45. @BillyGarnet “The way to arrest entropy in software is to refactor it.” ~Joseph Yoder
  46. 46. @BillyGarnet “So if you want to go fast, if you want to get done quickly, 
 if you want your code to be easy to write, make it easy to read.” ~Uncle Bob Martin
  47. 47. @BillyGarnet HumanRefactoring Get up! Get on up!
  48. 48. Inside Refactoring
  49. 49. @BillyGarnet Inside Refactoring Prepare Improve Clean
  50. 50. Prepare ✤ Prepare has also been referred to as nesting, making room, prefactoring or rough-in. We make small changes to the code so the improvement can take place.
  51. 51. Improve ✤ Improve is when we make an improvement to the code without changing its external behaviour.
  52. 52. Clean ✤ Clean is when we remove code we have made unnecessary and put the code back in a state to start something new. ✤ At this point we are done refactoring and can run tests, and, assuming they pass, integrate this refactoring.
  53. 53. Make a sandwich ✤ Get out all the things you need ✤ Assemble the sandwich ✤ Put everything away
  54. 54. Working Effectively with Legacy Code ✤ 1. Identify the code you want to extract and comment it out. ✤ 2. Think of a new name for a method and create it as an empty method. ✤ 3. Place a call to the new method in the old method. ✤ 4. Copy the code you want to extract into the new method. ✤ 5. Lean on the Compiler to find out what parameters you’ll have to pass and what values you’ll have to return. ✤ 6. Adjust the method declaration to accommodate the parameters and return value (if any). ✤ 7. Run your tests. ✤ 8. Delete your commented out code.
  55. 55. Prepare ✤ 1. Identify the code you want to extract and comment it out. ✤ 2. Think of a new name for a method and create it as an empty method. ✤ 3. Place a call to the new method in the old method.
  56. 56. Improve ✤ 4. Copy the code you want to extract into the new method. ✤ 5. Lean on the Compiler to find out what parameters you’ll have to pass and what values you’ll have to return. ✤ 6. Adjust the method declaration to accommodate the parameters and return value (if any). ✤ 7. Run your tests.
  57. 57. Clean ✤ 8. Delete your commented out code.
  58. 58. @BillyGarnet Inside Refactoring Example
  59. 59. @BillyGarnet
  60. 60. @BillyGarnet Inside Refactoring Prepare Improve Clean
  61. 61. @BillyGarnet def convert(arabic): numeral = "" for i in range(0, arabic): numeral += "I" return numeral
  62. 62. @BillyGarnet def convert(arabic): numeral = "" current_number = arabic for i in range(0, current_number): if current_number >= 10: numeral += "X" current_number -= 10 for i in range(0, current_number): numeral += "I" return numeral
  63. 63. @BillyGarnet def convert(arabic): numeral = "" for i in range(0, arabic): if arabic >= 10: numeral += "X" arabic -= 10 for i in range(0, arabic): if arabic >= 1: numeral += "I" arabic -= 1 return numeral
  64. 64. @BillyGarnet def convert(arabic): numeral = "" arabic_value = 10 roman_value = "X" for i in range(0, arabic): if arabic >= arabic_value: numeral += roman_value arabic -= arabic_value arabic_value = 1 roman_value = "I" for i in range(0, arabic): if arabic >= arabic_value: numeral += roman_value arabic -= arabic_value return numeral
  65. 65. @BillyGarnet def convert(arabic): numeral = "" arabic_digits = [10, 1] roman_digits = ["X", "I"] for i in range(0, len(arabic_digits)): while arabic >= arabic_digits[i]: numeral += roman_digits[i] arabic -= arabic_digits[i] # arabic_digits = 1 # roman_digits = "I" # for i in range(0, arabic): # if arabic >= arabic_digits: # numeral += roman_digits # arabic -= arabic_digits return numeral
  66. 66. @BillyGarnet def convert(arabic): numeral = "" arabic_digits = [10, 1] roman_digits = ["X", "I"] for i in range(0, len(arabic_digits)): while arabic >= arabic_digits[i]: numeral += roman_digits[i] arabic -= arabic_digits[i] return numeral
  67. 67. @BillyGarnet arabic_digits = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]
 roman_digits = ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I']
  68. 68. @BillyGarnet Inside Refactoring Prepare Improve Clean
  69. 69. Bryan Beecham
 @BillyGarnet
 bryan@industriallogic.com Questions and Answers
 

  70. 70. Questionable Code
  71. 71. Clarity if (x){ return true } else if (!x) { return false } if (x) return true
 return false if (x){
 return true } else if (!x) { 
 return false } return x
  72. 72. Clutter ;
  73. 73. Clutter // // This is cool // I saw it on a blog and thought if we changed our code // it could work. Call me if you need more explanation // //
  74. 74. @BillyGarnet Books ✤ Refactoring - Martin Fowler ✤ Working Effectively with Legacy Code - Michael Feathers ✤ Refactoring to Patterns - Joshua Kerievsky ✤ Refactoring Workbook - Bill Wake ✤ Healthy Code - Getting Started with Refactoring - Bryan Beecham

×