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