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. @BillyGarnet
It must work.
It must be understandable.
It must be updatable.
Needs of Software
What should software do?
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.
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. @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. @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. @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. @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. @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
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
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. @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
37. @BillyGarnet
“You have two options, you can refactor, or you can build a big ball of mud.”
~Chet Hendrickson
38. @BillyGarnet
“For each desired change, make the change easy (warning: this may be hard),
then make the easy change.”
~Kent Beck
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. @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. @BillyGarnet
“Business is well served by continuous refactoring, yet the practice of refactoring
must co-exist harmoniously with business priorities.”
~Joshua Kerievsky
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
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
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. Improve
✤ Improve is when we make an improvement to the code without changing
its external behaviour.
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. Make a sandwich
✤ Get out all the things you need
✤ Assemble the sandwich
✤ Put everything away
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. 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. 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.
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. @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. @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. @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. @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
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. @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