Refactoring II
@windygallery
December 13, 2019 4:30 PM @AddTech Hub Office Meeting room 1, 12 floor.
Outline
time
Day 0
Day 1
Day 10
Day 100
More code, more problems..
Add new features
Code Refactoring
REUSE
3. Benefits of Code refactoring
Cost of Code Refactoring
4. Design concepts
Dependency (coupling)
“One of the earliest indicators of design quality was coupling.”�Martin Fowler.
methodB()
methodA()
methodA()
methodB()
Class Leader
main() {
Follower f = new Follower()
f.doTask(this)
f.update(this)
}
Class Follower
# Leader x
Class Follower
Class Leader
main() {
Follower f = new Follower()
String output = f.doTask(x, y, z, ...)
// use output...
}
Low coupling
Only one side hold knowledge
High coupling
(2 sides of knowledge)
3
5
3
5
6
3
5
Strong coupling
Weak coupling
Chain of responsibility
User input
Query DB
Calcute
Render report
Object oriented programming (1/3): Class & instances
Class
instances
Object oriented programming (2/3): Inheritance
run()
run()
run()
Object oriented programming (3/3): Encapsulation
Model view controller (MVC)
Model
Controller
View
Facade design pattern
without facade
Use facade for interfacing
5. Refactoring methods
function longTasks() {
doTaskA..
doTaskB..
doTaskC..
doTaskD..
}
Refactoring methods: Extract method
function longTasks() {
doTaskA..
doTaskB..
doTaskC..
doTaskD..
}
function process() {
taskA()
taskB()
taskC()
taskD()
}�
function taskA() { .. }�function taskB() { .. }
function taskC() { .. }
function taskD() { .. }
class Customer
Refactoring methods: Move method
class Report
class Customer
class Business Logic
class SuperMan
Refactoring methods: Extract class
class SuperMan
class DatabaseManager
class Business Logic
Refactoring methods: Rename
let summary = 0�customer.getBasket.foreach(product, quantity) {� let price = product.getPrice()� summary = summary + price * quantity�}
Refactoring methods: Replace temp with Query
let summary = 0�customer.getBasket.foreach(product, quantity) {� let price = product.getPrice()� summary = summary + price * quantity�}�----------------------------------------------------------------------------------------------------------�let summary = 0�customer.getBasket.foreach(product, quantity) {� summary = summary + product.getPrice() * quantity�}
Refactoring methods: Replace values with Object
6. Bad smells
Duplicate code
Registration
Update profile
Duplicate code
Registration
Update profile
CustomerNotify
Move method
Long method
Function A(...) {
queryDatabase..� preprocess#1..� removeNoise..� preprocess#2..� summaryData...� process..� calculateReport..� cleanData� update...
}
Function B(...) {
saveData(...)
}
Long method
Function A(...) {
queryDatabase..� preprocess#1..� removeNoise..� preprocess#2..� summaryData...� process..� calculateReport..� cleanData� update...
}
Function B(...) {
saveData(...)
}
Big class, lazy class
SuperDad class
Lazy class
Big class, lazy class
SuperDad class
Lazy class
Long parameter list
Long parameter list
Customer class
Divergent Change class
DatabaseManager
Divergent Change class
DatabaseManager
MySQLmanager
MongoDBmanager
Extract class
Shotgun surgery
Class A
Class B
Class C
Class D
Class E
Shotgun surgery
Class A
MongoDBmanager
Class B
Class C
Class D
Class E
Move method
Feature envy
Customer
Product
Feature envy
Customer
Product
Calculate
Move method
Comment
If your code is too complex, you will need to explain
If your function name is confused, you will need comment
Make is Short, Simple and Stupid
Use refactoring techniques to make your code better.
Conclusion