-
1.
Refactoring, 2nd Ed.
A love story
Michael Hunger
-
2.
Michael Hunger
Open Sourcerer
Neo4j
@mesirii
-
3.
I know what
you're here for!
Covers By: dev.to/rly
-
4.
It crashed at 940!
-
5.
Which Refactoring do you like most?
Extract Method
Delete Unused Code
Ok, you won :)
-
6.
Questions?!
1. Who has seen the Refactoring book in a shelf?
2. Who has read it?
3. Who thought that it's just common sense?
4. Who refactors code on a daily basis?
5. Who mentors new developers?
-
7.
“Any fool can write code that a computer can
understand. Good programmers write code that
humans can understand.”
M. Fowler (1999)
-
8.
My Refactoring Story
Started 18 years ago
-
9.
Martin Fowler
Foreword by Erich Gamma
Contributions by Kent Beck,
William Opdyke, Don Roberts
28. Juni 1999
-
10.
"A must-read"
-
11.
I really liked that book too!
-
12.
As did others ...
… e.g. authors!
-
13.
My Student thesis at
TU Dresden
-
14.
Student thesis at
TU Dresden
""
bit.ly/refactoring-thesis
-
15.
Refactoring Tools for Java
in 2000!
-
16.
Fast Forward 18 years
-
17.
A nice surprise
-
18.
Michael,
I'm Martin Fowler's editor at Addison-Wesley. We are working on a revision of his
Refactoring book. Martin suggested that I reach out to you about reviewing the
manuscript. He was very impressed with feedback you've provided on other
projects.
Thanks,
Greg
--
Gregory Doench
Executive Editor
Pearson Technology Group
-
19.
Several Weeks and 435 Pages later
-
20.
28. November 2018
Latest Memo:
Most people will be disappointed
by the second edition
martinfowler.com/articles/refactoring-2nd-ed.html
-
21.
Like the original, this edition explains what refactoring is; why you should
refactor; how to recognize code that needs refactoring; and how to actually
do it successfully, no matter what language you use.
● Understand the process and general principles of refactoring
● Quickly apply useful refactorings to make a program easier to
comprehend and change
● Recognize “bad smells” in code that signal opportunities to refactor
● Explore the refactorings, each with explanations, motivation, mechanics,
and simple examples
● Build solid tests for your refactorings
● Recognize tradeoffs and obstacles to refactoring
-
22.
Why a new book?
-
23.
Refactoring is as important as ever
Educate a new generation!
-
24.
What changed?
martinfowler.com/articles/refactoring-2nd-changes.html
-
25.
No one knows anymore
what video rentals are!
-
26.
Javascript !?!?!
-
27.
Book Structure (Basically the same)
1. Opening Narrative Example
Theatre Invoicing
2. Principles
3. Code Smells
4. Testing
5. Catalogue
a. most important ones first
b. other refactorings
6. Dropped tangential topics and big refactorings
-
28.
Refactoring Changes
"Split Temporary Variable" => "Split Variable"
"Extract Method" => "Extract Function"
Add Parameter, Remove Parameter, Rename Method
=> Change Function Declaration
-
29.
Extract Function
Inline Function
Extract Variable
Inline Variable
Rename Variable
Encapsulate Variable
Highlighted: Most important Refactorings
Migrate Function Declaration
Change Function Declaration
Introduce Parameter Object
Combine Functions into Class
Combine Functions into Transform
-
30.
New Refactorings
All about Functions and
Pipelines
-
31.
Combine Functions into Class
Combine Functions into Transform
Move Statements into Function
Move Statements to Callers
Remove Dead Code
Rename Field
Rename Variable
Replace Command with Function
New Refactorings
Replace Derived Variable with Query
Replace Inline Code with Function Call
Replace Loop with Pipeline
Replace Query with Parameter
Replace Subclass with Delegate
Return Modified Value
Split Phase
-
32.
Web-Book
Available
on Safari
-
33.
My take on the new book
-
34.
Back to the Essence
of Refactoring
-
35.
Student thesis at
TU Dresden
""
-
36.
Topics
1. What, When, How
2. Benefits
3. Costs / Issues
4. History
5. Catalogue
6. Tools
7. Example
-
37.
What?
-
38.
Refactoring (noun): a change made to the
internal structure of software to make it
easier to understand and cheaper to
modify
without changing the observable behavior
of the software.
-
39.
Refactor (verb): to restructure software
by applying a series of refactorings
without changing the observable
behavior of the software.
-
40.
When?
-
41.
Code Smells!
If it stinks, change it
- Grandma Beck
-
42.
Mysterious Name
Duplicated Code
Long Function
Long Parameter List
Global Data
Mutable Data
Divergent Change
Shotgun Surgery
Feature Envy
Data Clumps
Primitive Obsession
Repeated Switches
Code Smells
Lazy Element
Speculative Generality
Temporary Field
Message Chains
Middle Man
Insider Trading
Large Class
Alternative Classes with Different Interfaces
Data Class
Refused Bequest
Comments
Loops
-
43.
Adding
features
is hard?
-
44.
Working
Effectively
with
Legacy
Code
Michael Feathers
-
45.
Full of
complexity
and bugs
-
46.
Code as a
Crime Scene
Software Design
X-Rays
Adam Tornhill
-
47.
Code is not
habitable
-
48.
Timeless
Way of
Building
Christopher Alexander
-
49.
How?
-
50.
Refactoring is as much about safety
testing, small steps, commit
as it is about code changes.
-
51.
Refactoring changes the programs in
small steps. If you make a mistake, it is
easy to find the bug.
-
52.
Two Hats
-
53.
martinfowler.com/articles/preparatory-refactoring-example.html
-
54.
Add Function
blog.gdinwiddie.com/2012/12/26/tdd-hat/
1. Red
2. Green
3. Refactor
-
55.
1. Refactor
2. Green
3. Commit
Refactor
-
56.
Before you start refactoring, check that
you have a solid suite of tests. These
tests must be self-checking.
Martin Fowler
-
57.
Tests, are your safety net
Listen to the flight attendent
this one time
-
58.
Make sure all tests are fully automatic
and that they check their own results.
Martin Fowler
-
59.
Fast Tests
-
60.
Test Ordering
R.I.P. JunitMax
-
61.
Many small commits
Can squash later
-
62.
Run your tests frequently. Localize tests
whenever you compile - every test at
least every day.
Martin Fowler
-
63.
A suite of tests is a
powerful bug detector
that decapitates the time
it takes to find bugs.
Martin Fowler
-
64.
Unit tests are like the second pair of
eyes of a pair programmer.
Kent Beck
-
65.
Kinds of Refactoring
-
66.
Quick Fixes Refactoring Rewrite
-
67.
Continous Clean-Up
-
68.
Continous Clean-Up
● Rename
● Replace comment with function
● Make intent clear
● Intention in your IDE
● Not about polishing
-
69.
DRY
Three strikes and you refactor.
-
70.
Boy Scout Rule
Leave it better than you found it
-
71.
Use >> Reuse
Reuse within your
module not across.
-
72.
Planned Refactoring
-
73.
● Before adding a feature
● Addressing technical debt
● Improve testability (seams)
● Improve understandability
● For learning about a
new code-base
Planned Refactoring
-
74.
(BIG) Refactoring /
Rewrite
-
75.
Sunken Cost Fallacy
-
76.
Deliberate Discovery
Dan North
-
77.
Benefits
-
78.
Forces you to test
-
79.
Don’t let the fear that testing can’t catch
all bugs stop you from writing the tests
that will catch most bugs.
Martin Fowler
-
80.
It is better to write and run incomplete
tests than not to run complete tests.
Martin Fowler
-
81.
Code Ownership
Modify your code
ownership policies to
smooth refactoring.
-
82.
Fights Code
Rot and Decay
-
83.
Improves
Understanding
-
84.
Costs
-
85.
APIs
Don’t publish interfaces prematurely.
Downstream dependencies.
-
86.
Side Effects
e.g. Performance
-
87.
How do I tell my
Boss?
-
88.
Time invested
-
89.
Refactoring &
Design
-
90.
Refactoring & Patterns
-
91.
Refactoring & Patterns
● patterns encapsulate good solutions in a context
● represent roles of components
● avoid code-smells
● they can be the goal of a design improvment
● refactorings are steps to those designs
-
92.
Refactoring
Catalogue
-
93.
Refactoring Catalogue (my favorites)
Move Function
Split Loop
Replace Loop with Pipeline (Stream)
Replace Magic Literal
Replace Derived Variable with Query
Replace Typecode with Subclass
Replace Superclass with Delegate
Replace Control Flag with Break (Return)
Introduce Special Case (Null Object)
Replace Nested Conditionals with Guad
Clauses
Extract Function
Extract Variable
Push Statements into Function
Push members up
Extract Interface / Superclass
Migrate Function Declaration
Combine Functions into Transform
Encapsulate Collection
Replace Temp with Query
Separate Query from Modifier
Parameterize Function
-
94.
Tools
-
95.
Tools today make Refactoring a Joy
-
96.
Smart Understanding of code & intent
Useful suggestions
Intentions & Quick fixes
-
97.
Use and Learn the Shortcuts
Pragmatic Programmer
-
98.
Intentions &
Quick Fixes
-
99.
IntelliJ &
all Jetbrains IDEs
-
100.
Help
Productivity
Guide
-
101.
What did you
NOT use yet
-
102.
Eclipse
-
103.
Eclipse
Language
Server
-
104.
Netbeans
-
105.
VS Code &
Visual Studio
-
106.
Resources
dzone.com/refcardz/refactoring-patterns refactoring.guru
martinfowler.com/tags/refactoring.html refactoring.com/catalog
-
107.
Ask your questions?
Thank you for your time!
Follow @mesirii
This is still true today as it was back then.
best non-fiction book
loved the style
and the boxes
It sounds simple and obvious initially but then contains lots of wisdom.
And we continually need to teach it.
It sounds simple and obvious initially but then contains lots of wisdom.
And we continually need to teach it.
basically a refresher
update examples
chance to a more recent language
gather feedback from 20 years
accomodate for new refactorings, and not only object oriented
new motivating example
programming language
some refactorings were updated / changed / renamed
some refactoring were added
duplex book https://martinfowler.com/bliki/DuplexBook.html
Except in Dresden,Germany
Javascript in 2018 is not that bad anymore (EcmaScript 2016)
Simpler Function syntax
Classes
Testing
Widely used -> have to cater for all audiences not just backend-java
because JavaScript and Java 8
as usual it is well written and engaging to read
lots of common sense, but important to point it out
if refactoring is already an part of your workflow you don't need it
but hand it to your new colleagues
I love code smells
Today you get many of them highlighted by your IDE with intentions
Some are obvious some require observation and thinking
George Dinwiddie
If your tests run in milliseconds or seconds it's a nobrainer to run them
If your tests run in milliseconds or seconds it's a nobrainer to run them
Much easier to roll back a commit than
IntelliJ also has "local history" with safepoints
DRY in your code/module
Not across it
And not at all costs
Inline and re-extract is part of refactoring
Should be a continous activity
DRY in your code/module
Not across it
And not at all costs
Inline and re-extract is part of refactoring
Reason to keep it small
Be honest
Pull the plug (Lidl)
There is always a next day, Software is soft
depending on the size of the unit
if small enough you can throw away, keep the interfaces and redo with lessons learned
sometimes, seldomly small changes can have big performance impacts
- inlining
- polymorphic call sites
don't need to freak out just be aware and have performance regression tests (git bisect)
do you tell your management?
if they are not onboard? -> change jobs?
it's not about polishing
Find the refactoring (Cmd+P, Shift-Ctrl-A)
Remember the shortcut, close the menu
use the shortcut