DRY——Don't Repeat Yourself Principle,直譯為“不要重復(fù)自己”原則。
DRY簡而言之,就是不要寫重復(fù)的代碼。原則本身很簡單,但是,對于OOAD來說,有著非常重大的意義。
DRY利用的方法就是抽象:把共同的事物抽象出來,把代碼抽取到一個地方去。這樣就可以避免寫重復(fù)的代碼。
舉一個DRY的典型例子,如果在一個類構(gòu)造的時候,需要進(jìn)行成員的初始化,在進(jìn)行了某些操作以后,同樣要進(jìn)行初始化,那么就可以把“初始化”抽象出來,做成一個方法Initial(),在構(gòu)造和需要用到的地方調(diào)用它。
雖然,抽取重復(fù)代碼是利用DRY的一個好的開端,但DRY的實質(zhì)是,一個需求,用一個部分來完成。當(dāng)你試圖避免重復(fù)代碼的時候,實際上,你做的應(yīng)該是用一段代碼來完成一個需求。
為什么要用DRY原則?DRY會給代碼維護(hù)帶來很大的好處。以類的初始化為例,假設(shè)類修改了,增加、減少或是修改了成員,如果不寫 Initial(),那么你可能至少要修改兩處,而且,修改之處也可能出現(xiàn)不一致,維護(hù)成本大大增加。而寫了Initial()方法,那么只要集中修改 Initial()就行了。
既然DRY是關(guān)于“一個方法,實現(xiàn)一個需求”的,那么,是不是可以把DRY應(yīng)用到需求分析中?呵呵,答案是肯定的,而且,個人認(rèn)為,這是個非常好的主意。多個重復(fù)的需求可能導(dǎo)致多個重復(fù)或者相近的類,最后導(dǎo)致重復(fù)代碼。所以DRY絕不僅僅對代碼適用,它是一個廣泛適用的原則。
接下來舉例說明DRY原則如何提升軟件質(zhì)量,結(jié)合作者的實踐,以某網(wǎng)上營業(yè)廳3期項目為例,討論了DRY原則在整個軟件生命周期過程中,對于保證軟件質(zhì)量的指導(dǎo)作用和意義。
這其中包括了需求分析階段,軟件設(shè)計和開發(fā)以及軟件測試等階段。通過在這些軟件過程中使用DRY原則,提高了軟件的易用性,可維護(hù)性和可擴(kuò)展性等重要的軟件質(zhì)量評價指標(biāo)。最后,作者提出了對DRY原則的展望和未來圍繞DRY原則可能出現(xiàn)的新工具、新方法。
先介紹一下項目吧,2008年8月到2008年12月,我參加了某省級無線運營商的網(wǎng)上營業(yè)廳3期項目,在這個項目中,我擔(dān)任了項目經(jīng)理的角色。
網(wǎng)上營業(yè)廳是該運營商的省級網(wǎng)上門戶,是電子化營銷渠道的重要組成部分。其主要功能包括:企業(yè)形象宣傳;新業(yè)務(wù)、新活動推廣;客戶進(jìn)行業(yè)務(wù)查詢和辦理等。隨著客戶對電子渠道認(rèn)知度的提升,原有的網(wǎng)上營業(yè)廳2期在硬件方面,已經(jīng)無法滿足日益增長的客戶數(shù)。在軟件架構(gòu)方面,已經(jīng)無法快速響應(yīng)頻繁復(fù)雜的需求變更。因此,該運營商提出了對于網(wǎng)上營業(yè)廳3期項目的建設(shè)計劃。3期建設(shè)的預(yù)期目標(biāo)為:把網(wǎng)上營業(yè)廳的注冊客戶數(shù)從200萬提升到500萬,并從硬件、軟件等各方面保證客戶正常使用。
該項目的人員組成包括:1名項目經(jīng)理,1名軟件開發(fā)經(jīng)理,1名系統(tǒng)實施經(jīng)理,3名程序員,2名頁面制作,2名系統(tǒng)實施共10人。項目的開發(fā)平臺為J2EE。
該項目的硬件大體情況為:14臺IBM BCH ,安裝apache,作為 web前端服務(wù)器。6臺IBM P52A,安裝weblogic,作為應(yīng)用服務(wù)器。2臺IBM P570作為身份認(rèn)證服務(wù)器。2臺IBM P570,安裝oracle,作為數(shù)據(jù)庫服務(wù)器。操作系統(tǒng)使用了紅帽企業(yè)版 linux 5,以及AIX5.3。
目前,網(wǎng)上營業(yè)廳3期成功通過終驗,并按時上線。在月初、月末的業(yè)務(wù)辦理高峰期,能夠保證客戶的正常訪問。此項目得到了該省級無線運營商和我所在公司領(lǐng)導(dǎo)的認(rèn)可。
首次接觸“DRY原則”這個概念時,我認(rèn)為它僅僅是應(yīng)用在編碼范疇的一個編碼原則,旨在幫助程序員避免使用復(fù)制,粘貼等手段,到處拷貝代碼。隨著對軟件項目的認(rèn)識和實踐,我發(fā)現(xiàn)DRY原則實際上是貫穿整個軟件生命周期的,保證軟件質(zhì)量的重要原則。從廣義上來講,軟件中的各種資源和代碼一樣,都可能面臨著被到處復(fù)制的危險。當(dāng)客觀條件發(fā)生變化,要求資源發(fā)生變更的時候,就要同時修改多個資源。如果這些資源被重復(fù)地使用在系統(tǒng)中的各處,將直接影響軟件質(zhì)量中的可維護(hù)性和可擴(kuò)展性因素。
下面,我將結(jié)合網(wǎng)上營業(yè)廳3期項目,詳細(xì)論述我們的項目組是如何在項目中成功地借助DRY原則來保證軟件質(zhì)量的。在需求分析階段,我們曾經(jīng)遇到這樣一個問題??蛻羰褂孟到y(tǒng)前,首先用手機(jī)號碼和密碼登錄。當(dāng)客戶辦理某個業(yè)務(wù)的時候,系統(tǒng)會向客戶發(fā)送短信驗證碼,客戶需要將該驗證碼輸入到網(wǎng)頁中的驗證框中,驗證通過后才能辦理業(yè)務(wù)。系統(tǒng)通過短信二次驗證碼驗證了客戶確實是該號碼的擁有者。這種驗證本來是合理且有效的,但在2期系統(tǒng)中,當(dāng)客戶辦理完一個業(yè)務(wù)想再辦理另外一個業(yè)務(wù)的時候,還要再次進(jìn)行短信二次驗證。也就是說,每辦理一個業(yè)務(wù),就要進(jìn)行一次短信驗證,客戶體驗可想而知。經(jīng)驗告訴我,這個需求違反了DRY原則。我們通過和2期的設(shè)計人員以及客服人員進(jìn)行溝通,發(fā)現(xiàn)2期系統(tǒng)這樣設(shè)計的初衷是為了提高安全性。其實,仔細(xì)分析就會知道,這種驗證方法保護(hù)的是客戶在登錄期間丟失手機(jī)的賬戶安全。簡言之,2期系統(tǒng)的驗證方法犧牲了絕大多數(shù)客戶的使用體驗,卻僅僅保護(hù)了極小概率發(fā)生的特殊情況。不僅給客戶重復(fù)地發(fā)短信驗證碼,影響了客戶體驗,而且提升了系統(tǒng)的開銷。最后,在DRY原則的指導(dǎo)下,我們把短信驗證改為了一次登錄期間僅驗證一次,極大地提升了客戶體驗,進(jìn)而從易用性方面提升了軟件質(zhì)量。
在設(shè)計和開發(fā)階段,DRY原則可以在更多的方面對軟件開發(fā)進(jìn)行指導(dǎo)。例如對于系統(tǒng)運行期異常處理機(jī)制的設(shè)計。每一個業(yè)務(wù)處理過程都可能發(fā)生異常,所以需要專門的異常處理代碼來處理異常情況。網(wǎng)上營業(yè)廳目前擁有約40多項業(yè)務(wù),雖然各個業(yè)務(wù)的正常處理流程各不相同,但發(fā)生異常后的處理流程卻是完全相同的。我們在做系統(tǒng)流程設(shè)計時,根據(jù)DRY原則,充分考慮了這種情況。最后決定,使用過濾器來統(tǒng)一各個業(yè)務(wù)的異常處理流程,將分散在系統(tǒng)中的異常處理模塊設(shè)置到過濾器中。當(dāng)異常處理流程變更時,我們僅需要在過濾器這一處對其進(jìn)行修改,大大降低了軟件的維護(hù)成本。
再一個例子是數(shù)據(jù)庫訪問通用模板類設(shè)計。網(wǎng)上營業(yè)廳是免不了對數(shù)據(jù)庫進(jìn)行操作的。大家知道,從數(shù)據(jù)庫獲取連接,使用連接,并在最后關(guān)閉連接,是每次使用數(shù)據(jù)庫必須做的操作。如果我們在所有模塊中的數(shù)據(jù)庫訪問都執(zhí)行這3步操作,那將會浪費巨大的人力成本。在DRY原則的指導(dǎo)下,我們提煉了數(shù)據(jù)庫操作的一個流程模板,那就是獲取連接,使用連接和關(guān)閉連接。通過結(jié)合面向?qū)ο蟮脑O(shè)計方法,我們設(shè)計了一套對數(shù)據(jù)庫進(jìn)行操作的模板類。使用這套模板類,開發(fā)人員只需把精力集中到對數(shù)據(jù)庫連接的使用上,也就是更加專注于業(yè)務(wù)邏輯。而無需關(guān)心連接的獲取,關(guān)閉等操作。這樣做不但節(jié)約了時間,也節(jié)省了人力,而且提高了軟件的可維護(hù)性和可擴(kuò)展性。
在軟件測試方面,DRY原則仍然具有用武之地的。例如測試用例的設(shè)計。不論是白盒測試還是黑盒測試,DRY原則已經(jīng)潛移默化地融入了這些測試用例的設(shè)計原則當(dāng)中。例如白盒測試就是要盡量避免重復(fù)的路徑覆蓋;而黑盒測試中的等價類劃分技術(shù),也是要避免重復(fù)的測試數(shù)據(jù)被使用。從而提高了測試的效率,加快了軟件故障或新需求的處理速度,提高了軟件的可維護(hù)性。
通過以上論述可知,DRY原則是一項可以貫穿整個軟件生命周期的指導(dǎo)原則。通過項目組正確地應(yīng)用和實踐這一原則,我們從最大程度上保證了網(wǎng)上營業(yè)廳3期的易用性,可維護(hù)性,可擴(kuò)展性等重要的質(zhì)量指標(biāo)。 DRY原則的應(yīng)用領(lǐng)域還不止這些,它的某些觀點在目前看來似乎過于超前。例如DRY原則認(rèn)為:軟件的設(shè)計文檔是對代碼的重復(fù),軟件的需求文檔是對驗收測試文檔的重復(fù),軟件模型是對數(shù)據(jù)庫結(jié)構(gòu)的重復(fù)等等。我認(rèn)為,隨著軟件開發(fā)技術(shù)和工具的進(jìn)步,在不久的將來,也許軟件的設(shè)計文檔完全可以通過代碼自動生成,軟件的需求文檔也能夠自動轉(zhuǎn)化為驗收文檔等等。圍繞DRY原則,也一定會涌現(xiàn)出一大批優(yōu)秀的軟件工程工具。這樣一來,我們就能夠進(jìn)一步發(fā)揮DRY原則的作用,最大限度地對各個實體進(jìn)行解耦,讓系統(tǒng)中的每一項功能僅由一個實體來完成。DRY原則一定會對軟件質(zhì)量的保證有著越來越重要的作用和意義。