周 瓊,徐 斌
(大連海事大學 管理科學與工程系,遼寧 大連116026)
結構化方法基本要點是:自頂向下,逐步求精,模塊化設計。自頂向下的核心本質是 “分解”,它將相對復雜的大問題分解為簡單的小問題,對每一個小問題進行精確、定量的描述。
結構化分析法將任何信息處理過程看作是將要輸入數據變換成所要求的輸出信息的裝置,因此數據流分析是需求分析的出發點。結構化分析使用數據流圖、加工說明和數據字典等來構造系統的需求分析模型[1]。面向對象方法則是用自然貼切的思維考慮問題,以對象為中心,運用類、繼承、聚合、關聯、消息和封裝等概念來構造軟件系統。結構化分析設計主要是針對系統需求明確的軟件開發,一旦中間需求改變了,則需要重新對其進行分析和設計;而面向對象則不同,當需求發生變化時,只須修改相應的部分和連接接口[2]。
計算機軟硬件發展迅速不斷地更新換代,各種復雜的軟件系統相繼被開發,軟件系統規模不斷擴大,復雜性相應增加,這就相應產生了對業務模型進行合理抽取的需求以及面向接口來編程的需求,本文研究接口為基礎的業務模型的結構設計方法,通過選擇合理的設計模式來對業務模型進行抽取,利用該思想可以順利實現結構式分析向面向對象設計的演化和過渡,打破兩者不可兼容的傳統思維。比如,各大系統的計費問題,由于各種系統計費規則的多樣性和繁復性,目前也沒有能夠具體參考的計費模板,各種計費的實現非常簡陋而且維護起來極其復雜,相互之間也不可復用,漏洞百出,面向接口來進行實現則克服了傳統開發存在的諸多弊端。以接口為導向結合設計模式的思想使得系統具有良好的可擴展、可復用以及易維護的特性。如何應用設計模式的思想面向接口來對業務模型進行抽象和提取是本文的研究重點。這也對以后的各種類型信息系統的實現具有十分重要的理論與實踐意義。
本文采用MVC 模式的思想,MVC 模式由模型 (model)、視圖 (view)及控制器 (controller)3 個部分組成,模型指的是業務模型,主要負責數據庫數據的處理,視圖指的是用戶界面,主要負責前臺界面的顯示內容,控制器則是主要負責界面與數據的交互[3,4]。使用MVC 的目的是將數據層和表現層的實現代碼分離開來,從而可以使同一個程序有不同的表現形式,進而提高程序的可讀性和代碼的復用性,控制器存在的目的是確保模型和視圖的同步,一旦模型改變,視圖應該同步更新,使用MVC 模式可以降低程序開發的風險,從而構造良好的松耦合的構件[5-7]。
以某省漁業船舶檢驗系統的計費問題為例來進行說明,該項目目前包含22種計費小項 (將來很可能會擴充),總體計費思想是:各項費用=基數×系數;總費用=各項費用之和。一般最常見的對業務問題的處理過程如圖1所示。即傳統的MVC模式的思想,操作頁面窗體是程序的界面,業務流程控制負責所有的處理流程,實例類庫模型則負責一些存庫查庫的操作。

圖1 傳統的對計費業務的處理過程
由此想到利用判斷表來對計費進行簡化,初始的判斷表如表1所示。由于數據量繁多,圖中只是截取了前后兩端來進行展示。

表1 初始判斷
船舶構造費簡化判斷見表2。

表2 船舶構造費簡化判斷
輪機費簡化判斷見表3。

表3 輪機費簡化判斷
由判斷表可知,船舶構造費用只與總噸位和船舶系數以及冰區加強相關,輪機費用只與功率、變速齒輪和推進器數以及側推進裝置相關,由此每一小項各自維護自己的計費,所有的功能運算類都寫在計費業務里,如圖2所示。具體的計費功能的實現方法是比如船舶構造,基數和系數都寫在自己的類中,一個小項目一個計費類,又比如其它項目如輪機這一小項的計費,就是在整個計費功能的流程控制中增加了一個輪機類來實現,但是這種方法維護起來特別麻煩,基數和系數的些許變動都需要大量的去修改代碼,而且將基數和系數都寫在程序里的缺點就是其它系統也沒法復用,遇到別的系統的相關的計費問題就必須重新寫代碼。

圖2 利用判斷表分析后對船舶計費的處理過程
設計模式描述了軟件設計過程中某一類常見問題的一般性解決方案,它可以使開發人員更加簡單方便地復用成功的設計和結構體系[8]。設計模式的概念和思想非常重要的,它并不只是一種具體 “技術”,它講述的是解決問題的思想,展示的是接口或抽象類在實際案例中的靈活應用與智慧,使用設計模式能使代碼真正的工程化,讓代碼更容易被理解、保證代碼的可重用性和可靠性,使新系統開發者更容易理解其設計思路,保證系統的靈活性和可擴充性[9]。
對業務模型進行抽取主要會用到以下一些常見的設計模式:
(1)工廠模式:工廠模式有助于代碼的設計,可以將代碼模塊化,是創建型模式中一類非常重要的模式,工廠模式提供創建對象的接口,負責將大量有共同接口的類實例化,主要有簡單工廠模式,工廠方法模式,抽象工廠模式3種形態[10]。
(2)單例模式:保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。單例可以節省不必要的內存開銷,屏蔽對象創建的復雜性。
(3)適配器模式:適配器模式是一種非常廣泛的結構型設計模式,其主要意圖是將一種類的接口轉換成另一種客戶所希望的接口。適配器模式的目的是要改變已有的接口,使得原本因接口不兼容而無法一起工作的類可以在一起工作[11]。
(4)觀察者模式:又稱發布-訂閱模式。觀察者模式定義對象間的一種一對多的依賴關系,將觀察者和被觀察者對象分離開來,以便當一個對象的狀態發生改變時,所有依賴它的對象都會得到通知并自動更新自身狀態,通常被用來實現事件處理系統[12]。
傳統的對業務的設計方法存在著不足之處,例如一旦業務需求變更,修改起來的工作量較大,并且復用性不強,最重要的是各種職能類并行存在,結構很亂。基于此本文提出了基于接口的業務模型的結構設計方法,如圖3所示。就是將業務流程控制抽象成一個接口,然后基于此接口進行擴展,將業務流程進行拆解,分為業務控制擴展1,2,3等等,同時也將實體類庫模型進行抽象,抽象為一個接口,查表存庫的操作則是基于此接口進行,這種設計方案最大的優點在于將業務流程的處理和訪問數據庫的操作提煉為一個接口,所有的擴展都是在此基礎之上的,相對于操作界面來說后面所有的處理都是基于接口的,這樣操作者只需要控制好所需數據的流入流出即可,而無需知曉具體的實現方式。在設計過程中以接口為導向,對業務問題進行分析,采用合理的設計模式或者是幾種經典的設計模式的組合來提出一套完整的解決方案,以接口為基礎來研究系統或者是業務模型的結構設計方法,從而實現一種用于解決在特定環境下重復出現的特定問題的解決方案,展示接口或抽象類在實際案例中的靈活應用,同時具有良好的可移植性和可復用性,方便應用到其它領域。
具體到某省漁業船舶檢驗計費系統,本文結合設計模式和面向接口編程的相關概念,為計費這個小系統做一套混合設計模式,來減輕編寫代碼的工作量,如圖4 所示。將上述計費功能控制部分抽象為一個接口,計費功能的實現以及計費規則是對這一接口的擴展,同樣的關于數據庫的操作也抽象出來一個接口,具體的對各個庫表的操作則是實現了這一接口。這樣把整個計費流程的控制和對數據庫的操作抽象為了一個接口,業務需求變動時只需基于接口進行擴展而無需變動接口,站在操作頁面的角度就是說只需知曉所需數據的流入流出,這種基于接口的解決方案能被其它系統方便復用。

圖3 基于接口的業務模型的結構設計方法

圖4 基于接口的對船舶計費業務的結構設計方法
其中如圖5所示是計費功能實現部分的結構,抽取一個父類FeeBase,父類中的GetFee()專用來實現各項費用的計算,這樣有多少個計費小項繼承父類擴充就可以了,比如此時若再增加其它項目的計費只需繼承FeeBase類并實現即可。

圖5 計費功能實現部分的結構
關于計費規則部分的結構在漁船系統中主要指的是關于計費基數部分的維護,如圖6所示是一個通用的數據結構CRCostData來表示計費所用的基數的類型,使用最通用的object類型,根據具體項目的計費需求可擴展為最常見的int型和double型的收費,有的系統可能需要一些加班費這時也可擴展為按時間的datetime型進行收費,漁業船舶檢驗系統用到的是double型的收費。如圖7所示是為基數的維護工作設計的模式結構,該結構中包含一個通用的數據結構CRCostData,這項對基數數據的維護同樣用到了設計模式中最常見的工廠模式,這樣前端代碼只需返回一個父類類型而無需具體知曉調用的具體算法。

圖6 計費規則部分的數據類型

圖7 計費規則部分
其中,計費規則部分的實現方法用到了設計模式中的工廠模式,工廠模式有助于代碼的設計,可以將代碼模塊化,提供創建對象的接口,工廠模式的應用讓系統具有非常大的靈活性且方便擴展。同樣的應用于其它領域可以根據具體需要用單例模式、適配器模式或者觀察者模式等等,也可能是多種經典的設計模式的組合。
這樣,前端代碼實現起來將會非常簡單,以一小項如船舶構造為例,如圖8 所示是前端使用到的數據結構,item 指計費項目名稱,baseValue指該項目的基數,factor指該項目的系數,fee則是單項的費用,具體實現代碼為:


圖8 前端用到的數據結構
此時若是增加另一小項如輪機的計費,則代碼修改起來非常靈活,只需增加如下幾行即可。

這種用于計費的設計模式的設計有非常重要的實踐意義,使用這種混合方式的設計模式進行計費的方式大大簡化了信息系統的計費實現,它將計費規則進行抽象,將計費規則模塊化使得程序實現起來條理清晰且便于維護,而且由于對基數和系數維護的分離以及對具體總費用的抽取,可移植性、可復用性很高,可以方便應用到其它系統不僅僅是漁船行業的計費,而且由于其設計的合理性,代碼的修改量極少,重構起來的工作量也不大。
同樣的,面對其它業務問題時也是如此,應用設計模式的思想面向接口來對業務模型進行抽象和提取,在設計過程中以接口為導向,對業務問題進行分析,采用合理的設計模式或者是幾種經典的設計模式的組合來提出一套完整的解決方案,從而實現一種用于解決在特定環境下重復出現的特定問題的解決方案。利用接口來對業務邏輯進行分隔使整個業務邏輯依賴于嚴格定義的接口而非具體實現,可以順利實現結構式分析向面向對象設計的演化和過渡,通過接口將結構式思維和面向對象技術結合在一起,充分發揮兩者的優勢,從而減少耦合,提高系統的靈活性。
[1]ZHANG Yaomin.Method of structured design in software engineering [J]. Modern Electronics Technique,2012,35(16):39-42 (in Chinese).[張耀民.軟件工程中的結構化設計方法 [J].現代電子技術,2012,35 (16):39-42.]
[2]TAN Linping.Depth analysis of process-oriented and objectoriented [J].The Science Education Article Collects,2013(237):89-90 (in Chinese).[譚林平.深入解析面向過程和面向對象 [J].科教文匯,2013 (237):89-90.]
[3]LI Zhi,JIA Kebin,LI Zhenzhen,et al.Design and implementation of jewelry sell system based on.NET MVC framework[J].Computer Applications and Software,2013,30 (3):186-189 (in Chinese). [李志,賈克斌,李真真,等.基于.NET MVC 架構的網上珠寶銷售系統的設計與實現 [J].計算機應用與軟件,2013,30 (3):186-189.]
[4]SUN Jin.Design and implementation of bank credit management system based on MVC pattern [D].Dalian:Dalian University of Technology,2013 (in Chinese).[孫瑨.基于MVC模式的銀行信貸管理系統設計與實現 [D].大連:大連理工大學,2013.]
[5]ZHOU Hui,REN Haijun,MA Liang,et al.MVC design pattern and it’s application in development of information systems[J].Software Guide,2012,11 (10):120-122(in Chinese). [周輝,任海軍,馬亮,等.MVC設計模式及其在信息系統開發中的應用[J].軟件導刊,2012,11 (10):120-122.]
[6]LU Junwei,CHANG Lin,CHEN Yunkun.MVC Design pattern and ASP.NET MVC framework research [J].Computer Knowledge and Technology,2010,6 (19):5160-5162 (in Chinese).[盧俊瑋,常琳,陳昀錕.MVC模式與ASP.NET MVC框架的技術研究[J].電腦知識與技術,2010,6 (19):5160-5162.]
[7]LAI Yingxu,LIU Zenghui,LI Maomao.Application study of B/S based on MVC design pattern [J].Microcomputer Information (Management and Control Integration),2006,22(10):34-36 (in Chinese).[賴英旭,劉增輝,李毛毛.MVC模式在B/S系統開發中的應用研究 [J].微計算機信息 (管控一體化),2006,22 (10):34-36.]
[8]WU Guangming.Application of design patterns in globalised software development [J].Computer Applications and Software,2014,31 (1):9-10 (in Chinese).[武光明.設計模式在全球化軟件開發中的應用 [J].計算機應用與軟件,2014,31 (1):9-10.]
[9]CUI Le.Several classical design patterns combination frame of reference [J].Computer Knowledge and Technology,2004(14):79-82 (in Chinese).[崔仂.幾種經典設計模式組合的參考框架 [J].電腦知識與技術,2004 (14):79-82.]
[10]CHEN Hua’en.Study on abstract factory pattern of the JAVA design pattern [J].Computer Knowledge and Technology,2010,6 (9):2245-2246 (in Chinese). [陳 華恩.JAVA 設計模式研究之抽象工廠模式 [J].電腦知識與技術,2010,6(9):2245-2246.]
[11]PENG Yang,PENG Junfeng.Application and research of the adapter pattern on system interfaces [J].Computer Knowledge and Technology,2008,3 (24):1346-1348 (in Chinese).[彭陽,彭軍鋒.適配器模式在系統接口中的應用與研究 [J].電腦知識與技術,2008,3 (24):1346-1348.]
[12]CHEN Qing.The research and application on design patternoriented MDA [D].Shanghai:Shanghai Normal University,2013 (in Chinese).[陳清.面向設計模式的模型驅動框架的研究與應用 [D].上海:上海師范大學,2013.]