今天讓咱們來繼續第3天,老規矩先來回顧一下昨天咱們都實現了哪些:html
- Change Reference to Value(將引用對象改成值對象)
- Change Value to Reference(將值對象改成引用對象)
- Collapse Hierarchy(摺疊繼承體系)
(圖片:博格達峯)
前端
簡單理解就是不改變軟件可觀察行爲的前提下,改善其內部結構,以提升理解性和下降修改爲本。面試
描述🍏:你有一些列的條件測試都獲得了相同的結果,你能夠將這些測試合併爲一個條件表達式,並將這個條件表達式提煉爲一個獨立的函數。算法
動機🍃: 檢查條件各不相同,行爲一直就應該使用「邏輯或」和「邏輯與」將他們合併爲一個條件表達式。typescript
interface ConfigFn {
(): number;
}
const disabilityAmount: ConfigFn = (): number => {
if (_seniority < 2) return 0;
if (_monthsDisabled > 12) return 0;
if (_isPartTime) return 0;
};
複製代碼
在這段代碼中,咱們看到一連串的條件檢查,它們都作同一件事。上述條件檢查等價於一個以邏輯或鏈接起來的語句:shell
const disabilityAmount: ConfigFn = (): number => {
(_seniority<2)||(_monthsDisabled>12)||(_isPartTime))return 0;
}
//繼續改造
const isNotEligible = ():boolean=>{
return (_seniority<2)||(_monthsDisabled>12)||(_isPartTime));
}
const onVacation = ():boolean=>{}
const disabilityAmount = (): number => {
// 這裏也可使用邏輯與繼續更復雜的應用
// if(isNotEligible){
if(isNotEligible && onVacation){
return 0;
}
}
複製代碼
描述🐥:在條件表達式的每一個分支上有着相同的一段代碼,將這段代碼搬到條件表達式以外。編程
動機🐈:移除相同的重複代碼才更更清楚的代表哪些東西隨條件的變化而變化,哪些東西保持不變。json
// 簡單版本 好比koa2的輸出
if(flag){
const data = "老袁";
res.end(data)
}else{
const data = {
"message":"老袁"
}
res.end(data)
}
//改造後
let data = "默認信息";
if(flag){
data = "老袁";
}else{
data = {
"message":"老袁"
}
}
res.end(data)
複製代碼
咱們在來看看複雜的版本:數組
//編寫.jscpd.json
{
"mode": "strict",
"threshold": 0,
"reporters": ["html", "console", "badge"]
}
複製代碼
yarn add jscpd -D
yarn add jscpd-badge-reporter -D
jscpd ./src
複製代碼
補一張效果圖:markdown
固然這只是一個小工具,你們想專業的刷起來Sonar。
描述🌾:你手上有一些傳統過程化的代碼,沒有任何封裝。現咱們可將數據記錄變成對象,將大塊的行爲分紅小塊,並將行爲移入到相關對象之中。
動機🐻:有一次我看到過帶的一個實行生一個純的函數120多行,這個時候咱們就能夠用一些小型對象改變宿主對象的行爲。長長的函數通常都是你下手這條規定的最佳時機。
這裏我就不囉嗦了,但願你們有時間能夠靜下來在好好看看除了封裝、繼承、多態外基於SOLID的設計,其實足夠了。
函數式編程和SOLID實際上是相輔相成的。
回顧第一天的文章👉 :《重構-代碼整潔之道TypeScript版》第一天
回顧次日的文章👉 :《重構-代碼整潔之道TypeScript版》次日
每一次咱們不會給你們寫過多的重構規則,力求天天用幾分鐘時間真正去理解了重構。明天見~若是您有什麼意見和反饋,歡迎您在下方留言。
做者 【老袁】 2020 年 07月 30日