Slides from GR8 Conf EU 2019 talk - "Groovy Refactoring Patterns". In this talk, I share the refactoring patterns I observed during Groovy development.
4. noun: a change made to the internal structure
of software to make it easier to understand
and cheaper to modify without changing its
observable behaviour
verb: to restructure software by applying
a series of refactorings without changing
its observable behaviour.
Refactoring
https://refactoring.com/
7. A code smell is a surface indication that
usually corresponds to a deeper problem in
the system. The term was first coined by Kent
Beck while helping me with
my Refactoring book.
~ Martin Fowler
https://martinfowler.com/bliki/CodeSmell.html
8. { Code Smells }
Long Methods
Duplicated Code Large Class
Long Param List
Primitive Obsession
Data Class
Inappropriate Intimacy
9. int calculateM1(int value1, int value2, int value3) {
int maxValue
if (value1 > value2 && value1 > value3) {
maxValue = value1
} else if (value2 > value3) {
maxValue = value2
} else {
maxValue = value3
}
maxValue + 1
}
int calculateM2(int value1, int value2, int value3) {
int maxValue
if (value1 > value2 && value1 > value3) {
maxValue = value1
} else if (value2 > value3) {
maxValue = value2
} else {
maxValue = value3
}
maxValue * 2
}
10. int calculateM1(int value1, int value2, int value3) {
int maxValue
if (value1 > value2 && value1 > value3) {
maxValue = value1
} else if (value2 > value3) {
maxValue = value2
} else {
maxValue = value3
}
maxValue + 1
}
int calculateM2(int value1, int value2, int value3) {
int maxValue
if (value1 > value2 && value1 > value3) {
maxValue = value1
} else if (value2 > value3) {
maxValue = value2
} else {
maxValue = value3
}
maxValue * 2
}
Duplicate Code
Reinventing the wheel
11. int calculateM1(int value1, int value2, int value3) {
Math.max(value1, Math.max(value2, value3)) + 1
}
int calculateM2(int value1, int value2, int value3) {
Math.max(value1, Math.max(value2, value3)) * 2
}
13. int calculateM1(int value1, int value2, int value3) {
int maxValue
if (value1 > value2 && value1 > value3) {
maxValue = value1
} else if (value2 > value3) {
maxValue = value2
} else {
maxValue = value3
}
maxValue + 1
}
int calculateM2(int value1, int value2, int value3) {
int maxValue
if (value1 > value2 && value1 > value3) {
maxValue = value1
} else if (value2 > value3) {
maxValue = value2
} else {
maxValue = value3
}
maxValue * 2
}
14. int calculateM1(int value1, int value2, int value3) {
int maxValue
if (value1 > value2 && value1 > value3) {
maxValue = value1
} else if (value2 > value3) {
maxValue = value2
} else {
maxValue = value3
}
maxValue + 1
}
int calculateM1(int value1, int value2, int value3) {
int maxValue = max(value1, value2, value3)
maxValue + 1
}
private int max(int value1, int value2, int value3) {
int maxValue
if (value1 > value2 && value1 > value3) {
maxValue = value1
} else if (value2 > value3) {
maxValue = value2
} else {
maxValue = value3
}
maxValue
}
Extract
Method
15. int calculateM1(int value1, int value2, int value3) {
int maxValue = max(value1, value2, value3)
maxValue + 1
}
private int max(int value1, int value2, int value3) {
int maxValue
if (value1 > value2 && value1 > value3) {
maxValue = value1
} else if (value2 > value3) {
maxValue = value2
} else {
maxValue = value3
}
maxValue
}
int calculateM2(int value1, int value2, int value3) {
int maxValue
if (value1 > value2 && value1 > value3) {
maxValue = value1
} else if (value2 > value3) {
maxValue = value2
} else {
maxValue = value3
}
maxValue * 2
}
16. int calculateM1(int value1, int value2, int value3) {
int maxValue = max(value1, value2, value3)
maxValue + 1
}
private int max(int value1, int value2, int value3) {
int maxValue
if (value1 > value2 && value1 > value3) {
maxValue = value1
} else if (value2 > value3) {
maxValue = value2
} else {
maxValue = value3
}
maxValue
}
int calculateM2(int value1, int value2, int value3) {
int maxValue = max(value1, value2, value3)
maxValue * 2
}
17. private int max(int value1, int value2, int value3) {
int maxValue
if (value1 > value2 && value1 > value3) {
maxValue = value1
} else if (value2 > value3) {
maxValue = value2
} else {
maxValue = value3
}
maxValue
}
private int max(int value1, int value2, int value3) {
Math.max(value1, Math.max(value2, value3))
}
18. private int max(int value1, int value2, int value3) {
Math.max(value1, Math.max(value2, value3))
}
int calculateM1(int value1, int value2, int value3) {
int maxValue = max(value1, value2, value3)
maxValue + 1
}
int calculateM2(int value1, int value2, int value3) {
int maxValue = max(value1, value2, value3)
maxValue * 2
}
19. private int max(int value1, int value2, int value3) {
Math.max(value1, Math.max(value2, value3))
}
int calculateM1(int value1, int value2, int value3) {
int maxValue = Math.max(value1, Math.max(value2, value3))
maxValue + 1
}
int calculateM2(int value1, int value2, int value3) {
int maxValue = Math.max(value1, Math.max(value2, value3))
maxValue * 2
}
Inline Method
20. int calculateM1(int value1, int value2, int value3) {
int maxValue = Math.max(value1, Math.max(value2, value3))
maxValue + 1
}
int calculateM2(int value1, int value2, int value3) {
int maxValue = Math.max(value1, Math.max(value2, value3))
maxValue * 2
}
int calculateM1(int value1, int value2, int value3) {
Math.max(value1, Math.max(value2, value3)) + 1
}
int calculateM2(int value1, int value2, int value3) {
Math.max(value1, Math.max(value2, value3)) * 2
}
Inline
Variable
49. class Multiplier {
private final int times
Multiplier(int times) {
this.times = times
}
int multiply(int number) {
times * number
}
}
Multiplier doubler = new Multiplier(2)
Multiplier triple = new Multiplier(3)
println doubler.multiply(10)
println triple.multiply(10)
50. def multiply = { int times, int number ->
times * number
}
def doubler = multiply.curry(2)
def triple = multiply.curry(3)
println doubler(10)
println triple(10)