SlideShare a Scribd company logo
1 of 19
Refactoring Chapter 1: 重構,第一個案例 KalinChih
何時該考慮要重構? 如果發現無法很方便地增加新 feature,或修改邏輯 作法: 先找看看是否有一套可靠的測試機制? 先重構程式 再增加新 feature
重構Step1: 了解案例 案例: 影片出租店程式 pirceCode: 決定影片類型、價錢 daysRented: 決定租片金額、積點 statement(): 列印租片紀錄清單與總金額、總積點 Example: chp1.movie_rental.v1.* Test Class: chp1.movie_rental.test.Test.java
重構Step2: Extract 金額計算 動機: 過長的程式碼不易閱讀 Extract 過長的程式區塊 (Fine-grained) 作法:Extract Method 將 Customer.statement() 的內金額計算程式區塊,Extract 成一個新 anmountFor() Example : chp1.movie_rental.v2.extract_amount.* 重構前,有一套可靠的測試機制是很重要滴~
Rename 是值得的行為 電腦可以理解和人寫出來的程式碼,但唯有寫出人類容易理解的程式碼,才是優秀的程式員
重構Step3: Move金額計算 動機: 計算金額的程式碼為何不是放在 Rental 而是放在 Customer? 大多情況下,method 應該放在他所使用的 object (class) 內 金額計算應該放在 Rental 比放在 Customer 洽當 作法: Move Method 將 Customer.statement() 內的計算金額的程式碼搬到 Rental Example: chp1.movie_rental.v3.move_amount.*
重構Step4: Move點數計算 動機: 類似於金額計算,點數計算功能應該要屬於 Rental 比較洽當 作法: 將Customer.statement() 內的點數計算程式碼搬到 Rental  Example: chp1.movie_rental.v4.move_frequentrenterpoints.*
重構Step5: 移除 Temp Variables 動機: Temp Variable 可能會是個問題,助長程式碼過長 由於變數只是暫時的,所以能見度只在這個程式區塊。若在其他區塊也想要使用這個 Temp Variable,便會驅使寫出更長的程式。 作法: 使用 Query Method 取代 temp variable 若使用 Query Method 取代 Temp Variable,至少同一個 class 內都能獲得這份資訊。 getTotalCharge() 取代 totalAmount getFrequentRenterPoints() 取代 frequentRenterPoints Example: chp1.movie_rental.v5.replace_temp_with_query.* New issue: 效能變差 原本只要一個迴圈做到的事情,現在要跑三個迴圈才能做到
關於 Performance 這件事… Performance 應該是在最佳化效能時再來擔心,在重構的階段先不用擔心這件事情 Performance 應該是透過工具來檢測,肉眼是很難看出來的 回想重構的目的… 讓程式更容易被讀取 讓程式更容易被擴充 The best way to optimize performance is to first write a well factored program, then optimize it
重構後… 現在可以透過這些 Query Methods 來取得資訊,而不需研究細節
重構Step6: Move金額計算、點數計算 動機:Rental 必須取得 Movie 才能運算金額。(物件應該在自己的資料上運算邏輯,而不是拿別人的資料來運算) 考慮該邏輯該屬於哪個物件 影片的價格邏輯是應該放到 Movie class內來計算比較洽當 作法: Move Method 將 getCharge() 與 getFrequentRenterPoints() 移到 Movie class Example: chp1.movie_rental.v6.move_selfobject public class Rental { double getCharge() { double result = 0; // 取得影片的出租價格 switch (getMovie().getPriceCode()) { // 普通片 case Movie.REGULAR:
So Far So Good… 寫了幾個新的 Query Methods 可以 reuse 程式碼更容易閱讀 But! 計算金額的那段 switch 還是 不利於將來計費邏輯的變動
考慮繼承… 使用 Polymorphism 來取代 switch 問題來了,若之後 Movie有其他類似 getCharge() 容易變動的邏輯,就很不利於維護
使用Strategy Pattern Strategy Pattern 封裝了會變動的演算法(Price subclasses),所以不會影響使用演算法的程式(Movie)
重構Step7: Replace Type Code with State/Strategy 作法(1/2): Replace Type Code with State/Strategy:  將 type code behavior 搬移到 Strategy Pattern 讓金額計算的邏輯不再綁死在 Movie ,所以將金額計算的邏輯搬移到 Price 家族 Self Encapsulate Field 時機: 當想要存取一個 super class 的 field,卻在  sub class 改變它的 value 作法: 為 field 建立 setter 與 getter,只用這些  methods 來存取這個 field(即使在同一個 class 內) Move Method Example: chp1.movie_rental.v7.strategy_pattern
重構Step8: Replace Conditional with Polymorphism 作法(2/2): Replace Conditional with Polymorphism: 在 sub Price classes 內建立 overriding method 來取代 super Price class 的 switch 將 super Price class 的 getCharge() 改為 abstract Example: chp1.movie_rental.v7.strategy_pattern 方便: 為了積點的預設值,所以不將 getFrequentRenterPoints() 也改成 abstract public class NewReleasePriceextends Price { double getCharge(intdaysRented) { 	return (double) daysRented * 3; } public abstract class Price{ double getCharge(intdaysRented) { double result = 0; switch (getPriceCode()) { case Movie.NEW_RELEASE: result += (double) daysRented * 3; break; } return result; }
Final Class Diagram
重構後的好處 讓程式碼更容易閱讀 Rename Method Extract Method Move Method 新的 Query Methods 可以 reuse Replace Temp with Query 將最容易變動的邏輯抽離出來 Replace Type Code with State/Strategy Self Encapsulate Field Replace Conditional with Polymorphism
Thank You! Slide & Example Code URL: xxxx

More Related Content

Similar to 重構—改善既有程式的設計(chapter 1)

ES5 introduction
ES5 introductionES5 introduction
ES5 introductionotakustay
 
Clipper@datacon.2019.tw
Clipper@datacon.2019.twClipper@datacon.2019.tw
Clipper@datacon.2019.twWei-Yu Chen
 
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试lydiafly
 
Refactoring with Patterns in PHP
Refactoring with Patterns in PHPRefactoring with Patterns in PHP
Refactoring with Patterns in PHPJace Ju
 
Foundation of software development 2
Foundation of software development 2Foundation of software development 2
Foundation of software development 2netdbncku
 
业务需求分析入门
业务需求分析入门业务需求分析入门
业务需求分析入门zhoujg
 
Coding guideline
Coding guidelineCoding guideline
Coding guideline斯理 衛
 
BizTalk練習投影片
BizTalk練習投影片BizTalk練習投影片
BizTalk練習投影片Pou Mason
 
张所勇:前端开发工具推荐
张所勇:前端开发工具推荐张所勇:前端开发工具推荐
张所勇:前端开发工具推荐zhangsuoyong
 
C++模板与泛型编程
C++模板与泛型编程C++模板与泛型编程
C++模板与泛型编程deer hope
 
讓你的人工智慧更智慧 - Developer Student Clubs.pptx
讓你的人工智慧更智慧 - Developer Student Clubs.pptx讓你的人工智慧更智慧 - Developer Student Clubs.pptx
讓你的人工智慧更智慧 - Developer Student Clubs.pptxNCUDSC
 
多個敏捷團隊之間的版本控制 (4)
多個敏捷團隊之間的版本控制 (4)多個敏捷團隊之間的版本控制 (4)
多個敏捷團隊之間的版本控制 (4)Jen-Chieh Ko
 
软件设计原则、模式与应用
软件设计原则、模式与应用软件设计原则、模式与应用
软件设计原则、模式与应用yiditushe
 
第六章 函數與巨集
第六章 函數與巨集第六章 函數與巨集
第六章 函數與巨集shademoon
 
Django development
Django developmentDjango development
Django developmentloveyudu
 
Java Script 引擎技术
Java Script 引擎技术Java Script 引擎技术
Java Script 引擎技术bigqiang zou
 

Similar to 重構—改善既有程式的設計(chapter 1) (20)

ES5 introduction
ES5 introductionES5 introduction
ES5 introduction
 
Clipper@datacon.2019.tw
Clipper@datacon.2019.twClipper@datacon.2019.tw
Clipper@datacon.2019.tw
 
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试
 
Refactoring with Patterns in PHP
Refactoring with Patterns in PHPRefactoring with Patterns in PHP
Refactoring with Patterns in PHP
 
Ch07
Ch07Ch07
Ch07
 
Foundation of software development 2
Foundation of software development 2Foundation of software development 2
Foundation of software development 2
 
业务需求分析入门
业务需求分析入门业务需求分析入门
业务需求分析入门
 
Coding guideline
Coding guidelineCoding guideline
Coding guideline
 
BizTalk練習投影片
BizTalk練習投影片BizTalk練習投影片
BizTalk練習投影片
 
张所勇:前端开发工具推荐
张所勇:前端开发工具推荐张所勇:前端开发工具推荐
张所勇:前端开发工具推荐
 
C++模板与泛型编程
C++模板与泛型编程C++模板与泛型编程
C++模板与泛型编程
 
SCJP ch09
SCJP ch09SCJP ch09
SCJP ch09
 
1 Dmaic D
1 Dmaic D1 Dmaic D
1 Dmaic D
 
讓你的人工智慧更智慧 - Developer Student Clubs.pptx
讓你的人工智慧更智慧 - Developer Student Clubs.pptx讓你的人工智慧更智慧 - Developer Student Clubs.pptx
讓你的人工智慧更智慧 - Developer Student Clubs.pptx
 
多個敏捷團隊之間的版本控制 (4)
多個敏捷團隊之間的版本控制 (4)多個敏捷團隊之間的版本控制 (4)
多個敏捷團隊之間的版本控制 (4)
 
软件设计原则、模式与应用
软件设计原则、模式与应用软件设计原则、模式与应用
软件设计原则、模式与应用
 
第六章 函數與巨集
第六章 函數與巨集第六章 函數與巨集
第六章 函數與巨集
 
Django development
Django developmentDjango development
Django development
 
Java Script 引擎技术
Java Script 引擎技术Java Script 引擎技术
Java Script 引擎技术
 
Jvm内存管理基础
Jvm内存管理基础Jvm内存管理基础
Jvm内存管理基础
 

More from Chris Huang

Data compression, data security, and machine learning
Data compression, data security, and machine learningData compression, data security, and machine learning
Data compression, data security, and machine learningChris Huang
 
Kks sre book_ch10
Kks sre book_ch10Kks sre book_ch10
Kks sre book_ch10Chris Huang
 
Kks sre book_ch1,2
Kks sre book_ch1,2Kks sre book_ch1,2
Kks sre book_ch1,2Chris Huang
 
Real time big data applications with hadoop ecosystem
Real time big data applications with hadoop ecosystemReal time big data applications with hadoop ecosystem
Real time big data applications with hadoop ecosystemChris Huang
 
A Graph Service for Global Web Entities Traversal and Reputation Evaluation B...
A Graph Service for Global Web Entities Traversal and Reputation Evaluation B...A Graph Service for Global Web Entities Traversal and Reputation Evaluation B...
A Graph Service for Global Web Entities Traversal and Reputation Evaluation B...Chris Huang
 
Approaching real-time-hadoop
Approaching real-time-hadoopApproaching real-time-hadoop
Approaching real-time-hadoopChris Huang
 
20130310 solr tuorial
20130310 solr tuorial20130310 solr tuorial
20130310 solr tuorialChris Huang
 
Scaling big-data-mining-infra2
Scaling big-data-mining-infra2Scaling big-data-mining-infra2
Scaling big-data-mining-infra2Chris Huang
 
Applying Media Content Analysis to the Production of Musical Videos as Summar...
Applying Media Content Analysis to the Production of Musical Videos as Summar...Applying Media Content Analysis to the Production of Musical Videos as Summar...
Applying Media Content Analysis to the Production of Musical Videos as Summar...Chris Huang
 
Hbase status quo apache-con europe - nov 2012
Hbase status quo   apache-con europe - nov 2012Hbase status quo   apache-con europe - nov 2012
Hbase status quo apache-con europe - nov 2012Chris Huang
 
Hbase schema design and sizing apache-con europe - nov 2012
Hbase schema design and sizing   apache-con europe - nov 2012Hbase schema design and sizing   apache-con europe - nov 2012
Hbase schema design and sizing apache-con europe - nov 2012Chris Huang
 
重構—改善既有程式的設計(chapter 12,13)
重構—改善既有程式的設計(chapter 12,13)重構—改善既有程式的設計(chapter 12,13)
重構—改善既有程式的設計(chapter 12,13)Chris Huang
 
重構—改善既有程式的設計(chapter 10)
重構—改善既有程式的設計(chapter 10)重構—改善既有程式的設計(chapter 10)
重構—改善既有程式的設計(chapter 10)Chris Huang
 
重構—改善既有程式的設計(chapter 9)
重構—改善既有程式的設計(chapter 9)重構—改善既有程式的設計(chapter 9)
重構—改善既有程式的設計(chapter 9)Chris Huang
 
重構—改善既有程式的設計(chapter 8)part 1
重構—改善既有程式的設計(chapter 8)part 1重構—改善既有程式的設計(chapter 8)part 1
重構—改善既有程式的設計(chapter 8)part 1Chris Huang
 
重構—改善既有程式的設計(chapter 7)
重構—改善既有程式的設計(chapter 7)重構—改善既有程式的設計(chapter 7)
重構—改善既有程式的設計(chapter 7)Chris Huang
 
重構—改善既有程式的設計(chapter 6)
重構—改善既有程式的設計(chapter 6)重構—改善既有程式的設計(chapter 6)
重構—改善既有程式的設計(chapter 6)Chris Huang
 
重構—改善既有程式的設計(chapter 4,5)
重構—改善既有程式的設計(chapter 4,5)重構—改善既有程式的設計(chapter 4,5)
重構—改善既有程式的設計(chapter 4,5)Chris Huang
 
重構—改善既有程式的設計(chapter 2,3)
重構—改善既有程式的設計(chapter 2,3)重構—改善既有程式的設計(chapter 2,3)
重構—改善既有程式的設計(chapter 2,3)Chris Huang
 

More from Chris Huang (20)

Data compression, data security, and machine learning
Data compression, data security, and machine learningData compression, data security, and machine learning
Data compression, data security, and machine learning
 
Kks sre book_ch10
Kks sre book_ch10Kks sre book_ch10
Kks sre book_ch10
 
Kks sre book_ch1,2
Kks sre book_ch1,2Kks sre book_ch1,2
Kks sre book_ch1,2
 
Real time big data applications with hadoop ecosystem
Real time big data applications with hadoop ecosystemReal time big data applications with hadoop ecosystem
Real time big data applications with hadoop ecosystem
 
A Graph Service for Global Web Entities Traversal and Reputation Evaluation B...
A Graph Service for Global Web Entities Traversal and Reputation Evaluation B...A Graph Service for Global Web Entities Traversal and Reputation Evaluation B...
A Graph Service for Global Web Entities Traversal and Reputation Evaluation B...
 
Approaching real-time-hadoop
Approaching real-time-hadoopApproaching real-time-hadoop
Approaching real-time-hadoop
 
20130310 solr tuorial
20130310 solr tuorial20130310 solr tuorial
20130310 solr tuorial
 
Scaling big-data-mining-infra2
Scaling big-data-mining-infra2Scaling big-data-mining-infra2
Scaling big-data-mining-infra2
 
Applying Media Content Analysis to the Production of Musical Videos as Summar...
Applying Media Content Analysis to the Production of Musical Videos as Summar...Applying Media Content Analysis to the Production of Musical Videos as Summar...
Applying Media Content Analysis to the Production of Musical Videos as Summar...
 
Wissbi osdc pdf
Wissbi osdc pdfWissbi osdc pdf
Wissbi osdc pdf
 
Hbase status quo apache-con europe - nov 2012
Hbase status quo   apache-con europe - nov 2012Hbase status quo   apache-con europe - nov 2012
Hbase status quo apache-con europe - nov 2012
 
Hbase schema design and sizing apache-con europe - nov 2012
Hbase schema design and sizing   apache-con europe - nov 2012Hbase schema design and sizing   apache-con europe - nov 2012
Hbase schema design and sizing apache-con europe - nov 2012
 
重構—改善既有程式的設計(chapter 12,13)
重構—改善既有程式的設計(chapter 12,13)重構—改善既有程式的設計(chapter 12,13)
重構—改善既有程式的設計(chapter 12,13)
 
重構—改善既有程式的設計(chapter 10)
重構—改善既有程式的設計(chapter 10)重構—改善既有程式的設計(chapter 10)
重構—改善既有程式的設計(chapter 10)
 
重構—改善既有程式的設計(chapter 9)
重構—改善既有程式的設計(chapter 9)重構—改善既有程式的設計(chapter 9)
重構—改善既有程式的設計(chapter 9)
 
重構—改善既有程式的設計(chapter 8)part 1
重構—改善既有程式的設計(chapter 8)part 1重構—改善既有程式的設計(chapter 8)part 1
重構—改善既有程式的設計(chapter 8)part 1
 
重構—改善既有程式的設計(chapter 7)
重構—改善既有程式的設計(chapter 7)重構—改善既有程式的設計(chapter 7)
重構—改善既有程式的設計(chapter 7)
 
重構—改善既有程式的設計(chapter 6)
重構—改善既有程式的設計(chapter 6)重構—改善既有程式的設計(chapter 6)
重構—改善既有程式的設計(chapter 6)
 
重構—改善既有程式的設計(chapter 4,5)
重構—改善既有程式的設計(chapter 4,5)重構—改善既有程式的設計(chapter 4,5)
重構—改善既有程式的設計(chapter 4,5)
 
重構—改善既有程式的設計(chapter 2,3)
重構—改善既有程式的設計(chapter 2,3)重構—改善既有程式的設計(chapter 2,3)
重構—改善既有程式的設計(chapter 2,3)
 

Recently uploaded

哪里可以购买日本神奈川县立保健福祉大学学位记/录取通知书可以制作吗/补办马来西亚大学文凭/CIA证书定制
哪里可以购买日本神奈川县立保健福祉大学学位记/录取通知书可以制作吗/补办马来西亚大学文凭/CIA证书定制哪里可以购买日本神奈川县立保健福祉大学学位记/录取通知书可以制作吗/补办马来西亚大学文凭/CIA证书定制
哪里可以购买日本神奈川县立保健福祉大学学位记/录取通知书可以制作吗/补办马来西亚大学文凭/CIA证书定制kathrynalvarez364
 
加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制
加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制
加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制bairnshajjes
 
003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf
003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf
003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdfshanshanhui1
 
未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制
未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制
未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制gravestomas0
 
JAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptx
JAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptxJAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptx
JAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptxCHANSUITNEEMoe
 
布莱德福德大学毕业证制作/英国本科学历如何认证/购买一个假的香港中文大学专业进修学院硕士学位证书
布莱德福德大学毕业证制作/英国本科学历如何认证/购买一个假的香港中文大学专业进修学院硕士学位证书布莱德福德大学毕业证制作/英国本科学历如何认证/购买一个假的香港中文大学专业进修学院硕士学位证书
布莱德福德大学毕业证制作/英国本科学历如何认证/购买一个假的香港中文大学专业进修学院硕士学位证书kathrynalvarez364
 
澳洲圣母大学毕业证制作/加拿大硕士学历代办/购买一个假的中央警察大学硕士学位证书
澳洲圣母大学毕业证制作/加拿大硕士学历代办/购买一个假的中央警察大学硕士学位证书澳洲圣母大学毕业证制作/加拿大硕士学历代办/购买一个假的中央警察大学硕士学位证书
澳洲圣母大学毕业证制作/加拿大硕士学历代办/购买一个假的中央警察大学硕士学位证书kathrynalvarez364
 
Grade 6 Lesson 7 Environment Protection.pptx
Grade 6 Lesson 7 Environment Protection.pptxGrade 6 Lesson 7 Environment Protection.pptx
Grade 6 Lesson 7 Environment Protection.pptxPriscilleXu
 
日本九州齿科大学毕业证制作🚩定制本科卒业证书🚩哪里可以购买假美国西南基督复临安息日会大学成绩单
日本九州齿科大学毕业证制作🚩定制本科卒业证书🚩哪里可以购买假美国西南基督复临安息日会大学成绩单日本九州齿科大学毕业证制作🚩定制本科卒业证书🚩哪里可以购买假美国西南基督复临安息日会大学成绩单
日本九州齿科大学毕业证制作🚩定制本科卒业证书🚩哪里可以购买假美国西南基督复临安息日会大学成绩单jakepaige317
 
我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...
我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...
我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...黑客 接单【TG/微信qoqoqdqd】
 

Recently uploaded (10)

哪里可以购买日本神奈川县立保健福祉大学学位记/录取通知书可以制作吗/补办马来西亚大学文凭/CIA证书定制
哪里可以购买日本神奈川县立保健福祉大学学位记/录取通知书可以制作吗/补办马来西亚大学文凭/CIA证书定制哪里可以购买日本神奈川县立保健福祉大学学位记/录取通知书可以制作吗/补办马来西亚大学文凭/CIA证书定制
哪里可以购买日本神奈川县立保健福祉大学学位记/录取通知书可以制作吗/补办马来西亚大学文凭/CIA证书定制
 
加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制
加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制
加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制
 
003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf
003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf
003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf
 
未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制
未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制
未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制
 
JAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptx
JAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptxJAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptx
JAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptx
 
布莱德福德大学毕业证制作/英国本科学历如何认证/购买一个假的香港中文大学专业进修学院硕士学位证书
布莱德福德大学毕业证制作/英国本科学历如何认证/购买一个假的香港中文大学专业进修学院硕士学位证书布莱德福德大学毕业证制作/英国本科学历如何认证/购买一个假的香港中文大学专业进修学院硕士学位证书
布莱德福德大学毕业证制作/英国本科学历如何认证/购买一个假的香港中文大学专业进修学院硕士学位证书
 
澳洲圣母大学毕业证制作/加拿大硕士学历代办/购买一个假的中央警察大学硕士学位证书
澳洲圣母大学毕业证制作/加拿大硕士学历代办/购买一个假的中央警察大学硕士学位证书澳洲圣母大学毕业证制作/加拿大硕士学历代办/购买一个假的中央警察大学硕士学位证书
澳洲圣母大学毕业证制作/加拿大硕士学历代办/购买一个假的中央警察大学硕士学位证书
 
Grade 6 Lesson 7 Environment Protection.pptx
Grade 6 Lesson 7 Environment Protection.pptxGrade 6 Lesson 7 Environment Protection.pptx
Grade 6 Lesson 7 Environment Protection.pptx
 
日本九州齿科大学毕业证制作🚩定制本科卒业证书🚩哪里可以购买假美国西南基督复临安息日会大学成绩单
日本九州齿科大学毕业证制作🚩定制本科卒业证书🚩哪里可以购买假美国西南基督复临安息日会大学成绩单日本九州齿科大学毕业证制作🚩定制本科卒业证书🚩哪里可以购买假美国西南基督复临安息日会大学成绩单
日本九州齿科大学毕业证制作🚩定制本科卒业证书🚩哪里可以购买假美国西南基督复临安息日会大学成绩单
 
我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...
我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...
我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...
 

重構—改善既有程式的設計(chapter 1)

  • 1. Refactoring Chapter 1: 重構,第一個案例 KalinChih
  • 2. 何時該考慮要重構? 如果發現無法很方便地增加新 feature,或修改邏輯 作法: 先找看看是否有一套可靠的測試機制? 先重構程式 再增加新 feature
  • 3. 重構Step1: 了解案例 案例: 影片出租店程式 pirceCode: 決定影片類型、價錢 daysRented: 決定租片金額、積點 statement(): 列印租片紀錄清單與總金額、總積點 Example: chp1.movie_rental.v1.* Test Class: chp1.movie_rental.test.Test.java
  • 4. 重構Step2: Extract 金額計算 動機: 過長的程式碼不易閱讀 Extract 過長的程式區塊 (Fine-grained) 作法:Extract Method 將 Customer.statement() 的內金額計算程式區塊,Extract 成一個新 anmountFor() Example : chp1.movie_rental.v2.extract_amount.* 重構前,有一套可靠的測試機制是很重要滴~
  • 6. 重構Step3: Move金額計算 動機: 計算金額的程式碼為何不是放在 Rental 而是放在 Customer? 大多情況下,method 應該放在他所使用的 object (class) 內 金額計算應該放在 Rental 比放在 Customer 洽當 作法: Move Method 將 Customer.statement() 內的計算金額的程式碼搬到 Rental Example: chp1.movie_rental.v3.move_amount.*
  • 7. 重構Step4: Move點數計算 動機: 類似於金額計算,點數計算功能應該要屬於 Rental 比較洽當 作法: 將Customer.statement() 內的點數計算程式碼搬到 Rental Example: chp1.movie_rental.v4.move_frequentrenterpoints.*
  • 8. 重構Step5: 移除 Temp Variables 動機: Temp Variable 可能會是個問題,助長程式碼過長 由於變數只是暫時的,所以能見度只在這個程式區塊。若在其他區塊也想要使用這個 Temp Variable,便會驅使寫出更長的程式。 作法: 使用 Query Method 取代 temp variable 若使用 Query Method 取代 Temp Variable,至少同一個 class 內都能獲得這份資訊。 getTotalCharge() 取代 totalAmount getFrequentRenterPoints() 取代 frequentRenterPoints Example: chp1.movie_rental.v5.replace_temp_with_query.* New issue: 效能變差 原本只要一個迴圈做到的事情,現在要跑三個迴圈才能做到
  • 9. 關於 Performance 這件事… Performance 應該是在最佳化效能時再來擔心,在重構的階段先不用擔心這件事情 Performance 應該是透過工具來檢測,肉眼是很難看出來的 回想重構的目的… 讓程式更容易被讀取 讓程式更容易被擴充 The best way to optimize performance is to first write a well factored program, then optimize it
  • 10. 重構後… 現在可以透過這些 Query Methods 來取得資訊,而不需研究細節
  • 11. 重構Step6: Move金額計算、點數計算 動機:Rental 必須取得 Movie 才能運算金額。(物件應該在自己的資料上運算邏輯,而不是拿別人的資料來運算) 考慮該邏輯該屬於哪個物件 影片的價格邏輯是應該放到 Movie class內來計算比較洽當 作法: Move Method 將 getCharge() 與 getFrequentRenterPoints() 移到 Movie class Example: chp1.movie_rental.v6.move_selfobject public class Rental { double getCharge() { double result = 0; // 取得影片的出租價格 switch (getMovie().getPriceCode()) { // 普通片 case Movie.REGULAR:
  • 12. So Far So Good… 寫了幾個新的 Query Methods 可以 reuse 程式碼更容易閱讀 But! 計算金額的那段 switch 還是 不利於將來計費邏輯的變動
  • 13. 考慮繼承… 使用 Polymorphism 來取代 switch 問題來了,若之後 Movie有其他類似 getCharge() 容易變動的邏輯,就很不利於維護
  • 14. 使用Strategy Pattern Strategy Pattern 封裝了會變動的演算法(Price subclasses),所以不會影響使用演算法的程式(Movie)
  • 15. 重構Step7: Replace Type Code with State/Strategy 作法(1/2): Replace Type Code with State/Strategy: 將 type code behavior 搬移到 Strategy Pattern 讓金額計算的邏輯不再綁死在 Movie ,所以將金額計算的邏輯搬移到 Price 家族 Self Encapsulate Field 時機: 當想要存取一個 super class 的 field,卻在 sub class 改變它的 value 作法: 為 field 建立 setter 與 getter,只用這些 methods 來存取這個 field(即使在同一個 class 內) Move Method Example: chp1.movie_rental.v7.strategy_pattern
  • 16. 重構Step8: Replace Conditional with Polymorphism 作法(2/2): Replace Conditional with Polymorphism: 在 sub Price classes 內建立 overriding method 來取代 super Price class 的 switch 將 super Price class 的 getCharge() 改為 abstract Example: chp1.movie_rental.v7.strategy_pattern 方便: 為了積點的預設值,所以不將 getFrequentRenterPoints() 也改成 abstract public class NewReleasePriceextends Price { double getCharge(intdaysRented) { return (double) daysRented * 3; } public abstract class Price{ double getCharge(intdaysRented) { double result = 0; switch (getPriceCode()) { case Movie.NEW_RELEASE: result += (double) daysRented * 3; break; } return result; }
  • 18. 重構後的好處 讓程式碼更容易閱讀 Rename Method Extract Method Move Method 新的 Query Methods 可以 reuse Replace Temp with Query 將最容易變動的邏輯抽離出來 Replace Type Code with State/Strategy Self Encapsulate Field Replace Conditional with Polymorphism
  • 19. Thank You! Slide & Example Code URL: xxxx