以子類取代型別編碼
replace type code with subclasses
對軟體內部結構的㆒種調整,目的是在不改變「軟體之可察行為」前提下,提高其可理解性,降低其修改成本。
使用一系列重構準則(手法),在不改變「軟體之可察行為」前提下,調整其結構。
同樣完成一件事,設計不良的程式往往需要更多**,這常常是因為**在不同的地方使用完全相同的語句做同樣的事。因此改進設計的乙個重要方向就是消除重複**(duplicate code)
你的原始碼還有其它讀者:數個月之後可能會有另一位程式設計師嘗試讀懂你的**並做一些修改。我們很容易忘記這第二位讀者,但他才是最重要的。計算器是否多花了數個鐘頭進行編譯,又有什麼關係呢?如果乙個程式設計師花費一周時間來修改某段**,那才關係重大— 如果他理解你的**,這個修改原本只需一小時
kent beck 經常形容自己的㆒句話:『我不是個偉大的程式設計師;我只是個有著㆒些優秀習慣的好程式設計師而已。』重構能夠幫助我更有效地寫出強固穩健(robust)的**。
終於,前面的一切都歸結到了這最後一點:重構幫助你更快速地開發程式。聽起來有違反直覺。當我談到重構,人們很容易看出它能夠提高質量。改善設計、提公升可讀性、減少錯誤,這些都是提高質量。但這難道不會降低開發速度嗎?我強烈相信:良好設計是快速軟體開發的根本。事實上擁有良好設計才可能達成快速的開發。如果沒有良好設計,或許某一段時間內你的進展迅速,但惡劣的設計很快就讓你的速度慢下來。你會把時間花在除錯上面,無法新增新功能。修改時間愈來愈長,因為你必須花愈來愈多的時間去理解系統、尋找重複**。隨著你給最初程式打上乙個又乙個的補丁(patch),新特性需要更多**才能實現。真是個惡性迴圈。
重構本來就不是一件「特別呼出時間做」的事情,重構應該隨時隨地進行。你不應該為重構而重構,你之所以重構,是因為你想做別的什麼事,而重構可以幫助你把那些事做好
don roberts 給了我一條準則:第一次做某件事時只管去做;第二次做類似的事會產生反感,但無論如何還是做了;第三次再做類似的事,你就應該重構。
☆事不過三,三則重構。(three strikes and you refactor.)
新增功能時一併重構
修補錯誤時一併重構
複審**時一併重構
-以上章節摘抄自《重構-改善既有**的設計》
1. 例項模組為view,重構元素為viewaction、viewprocessbean、view,以下為關係圖。
2.由於view存在多種editmode(編輯模式),而每個呼叫的地方都需要進行type code(型別碼)判斷,然後再進行相應的業務邏輯處理,最終在每個呼叫的地方都形成了大量的if-else**,大大減弱了**的可讀性,和邏輯清晰度。
3. 呼叫的地方:
如上圖所示,將每種type code重構成subclass,加強了每種型別處理業務邏輯的能力。
view-版本1566**片段:
public說明:呼叫者無需了解具體的型別,由view自身作判斷,返回editmode介面,從而實現多型呼叫。editmode geteditmodetype()
else
if(edit_mode_code_sql.equals(geteditmode()))
else
if(edit_mode_design.equals(geteditmode()))
return
newnulleditmode(
this);}
viewprocessbean**片段:
重構前-版本1503:
public重構後-版本1566:string expdoctoexcel(string viewid, webuser user, paramstable params)
throws
exception
else
if(view.geteditmode().equals(view.edit_mode_code_dql))
else
if(view.geteditmode().endswith(view.edit_mode_code_sql))
}
public由上述案例可看到,引入subclass代替type code可以大大減少if-else判斷,而且可以把責任內聚到每種type中,使**結構更清晰易懂。string expdoctoexcel(string viewid, webuser user, paramstable params)
throws
exception
在本案例中引入了空型別概念,即
nulleditmode
,**如下:
/**說明:空型別保證了呼叫每個方法都有預設值返回,而不需要進行非空判斷,當view沒有型別時,即返回預設的空型別* *
@author
nicholas zhen
* */
public
class
nulleditmode
extends
abstracteditmode
implements
editmode
public
string getquerystring(paramstable params, webuser user, document sdoc)
public
datapackage getdatapackage(paramstable params, webuser user, document doc)
throws
exception
public
datapackage getdatapackage(paramstable params,
intpage,
intlines, webuser user, document doc)
throws
exception
public
long
count(paramstable params, webuser user, document doc)
throws
exception
}
原創人員:nicholas
OpenCv C 小案例實戰 切邊 一
假如說現在有這麼一張如下 現在我想要去掉這張圖外面的白色區域,只留下紅色線框以內的部分。最終效果如圖所示 放上 include include includeusing namespace cv using namespace std mat src,dst,gray src int current...
重構第一章 重構的第乙個案例
這一章通過講解租碟的案例來初步解釋了重構的意義,有些問題何老師已經講過了,比如說變數命名,分割 等等 1.1 起點 如果你發現自己需要為程式新增乙個特性,而 結構使你無法很方便地那麼做,那就先重構那個程式,使特性的新增比較容易進行,然後再新增特性。1.2 重構的第一步 測試 每當我要進行重構的時候,...
Python爬蟲實戰案例之爬取喜馬拉雅音訊資料詳解
前言 喜馬拉雅是專業的音訊分享平台,匯集了有聲 有聲讀物,有聲書,fm電台,兒童睡前故事,相聲小品,鬼故事等數億條音訊,我最喜歡聽民間故事和德雲社相聲集,你呢?今天帶大家爬取喜馬拉雅音訊資料,一起期待吧!這個案例的 位址在這裡 專案目標 爬取喜馬拉雅音訊資料 受害者位址 本文知識點 1 系統分析網頁...