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