崔群超 荊文芳



摘? 要: 為保證在業務層面對象構造的合法性,避免產生半成品對象,文中提出一種二階構造設計模式的對象構造設計方法。首先對對象構造的過程進行了認知與分析,指出了在構造對象過程中業務層面構造失敗會產生半成品對象,在此基礎上提出了二階構造的設計流程,針對業務層面對象構造存在不成功的情況,采用在第二階段來構造,并判斷構造是否成功,以此來避免半成品對象的產生,使對象構造合法與否能夠被設計者直接判斷,最后給出了對該設計模式的名稱、問題、解決方案、效果四個基本要素的總結。該模式設計簡單、使用方便,可有效避免半成品對象的產生,可以為軟件質量的提高帶來新的可復用方法。
關鍵詞: 對象構造; 二階構造; 模式設計; 業務層面; 半成品對象; 參數設定
中圖分類號: TN911?34; TP311.11? ? ? ? ? ? ? 文獻標識碼: A? ? ? ? ? ? ? ? ? ? ? ?文章編號: 1004?373X(2020)04?0157?03
An object construction new method for second?order structural design pattern
CUI Qunchao1,2, JING Wenfang1
(1. National Time Service Center of China, Chinese Academy of Sciences, Xian 710600, China;
2. University of Chinese Academy of Sciences, Beijing 100049, China)
Abstract: An object construction design method for the second?order structural design pattern is proposed to ensure the legitimacy of object construction at the business level and avoid the generation of semi?finished objects. The process of object construction is cognized and analyzed, which indicates that the failure of business?level construction in the process of object construction can produce semi?finished objects. On this basis, the design flow of second?order construction is proposed. In the case of the unsuccessful object construction at the business level, it is constructed at the second stage and judged whether the construction is successful, so as to avoid the generation of semi?finished objects. The designer can directly judge the object construction is legal or not, and the summary of the four basic elements of name, problem, solution, and effect of the design pattern is given. This mode is simple in design and prone to use, which can effectively avoid the generation of semi?finished objects and bring new reusable methods for the improvement of software quality.
Keywords: object construction; second?order construction; pattern design; business level; semi?finished object; parameter setting
0? 引? 言
設計模式是描述一個不斷重復出現的問題以及對該問題的核心解決方案,常用于軟件系統的建模過程,以提高軟件系統的設計質量、可重用性及研發效率[1?5]。常見的設計模式[6]有 Singleton Command 等23種,且經過長期應用與改進,設計模式已經成為一種軟件設計的標準化模式,并成為軟件工程領域的研究熱點[7?9]。設計模式提供了一種封裝設計知識的方法,這些設計知識為標準的面向對象軟件開發問題提供了解決方案[10]。對象是面向對象技術的核心,對象業務層面的合法構造對面向對象技術的應用至關重要,設計模式的正式提出者之一Erich Gamma 認為設計模式并不是絕對的,在實踐過程中,還必須發現和整理使用過的設計模式,并記錄下來,以提供新的軟件設計模式。本文提出一種新的對象構造模式,該模式可以保證在對象業務層面構造不合法時返回空,能夠方便且有效地提高對象構造的質量,使軟件設計更加高效。
1? 半成品對象
如圖1所示,面向對象設計中,構造函數aCreatObject創建對象,首先給aProgramLevel發送evaluateFirst請求,進行賦值,然后aCreatObject發送請求到aBusinessLevel申請內存,最后aCreatObject給aProgramLevel發送evaluateSecond請求,進行最后賦值。以C++語言為例,正常情況下,類的構造函數會合法地執行完圖1的初始化操作;但是當業務層面的操作,比如申請內存失敗的時候,構造對象此時不能夠提供足夠的內存給其他業務邏輯使用,但是得到的對象依舊可以使用,卻是一個非法對象,此時稱此非法對象為半成品對象。
以申請CPU資源可能失敗為例,給出可能造成半成品對象的類semiFinishedObj偽代碼如下。
class semiFinishedObj
{
protected:
void parameterSetting();? ? ? ? ? ? ? ? ? ? ? //軟件參數設置
void interfaceSetting();? ? ? ? ? ? ? ? ? ? ? ?//軟件界面設置
void applyCPUResources();
//為AI識別算法recognizeAlgorithm()申請CPU資源,且可能失敗
public:
semiFinishedObj()
{
parameterSetting();
applyCPUResources();
interfaceSetting();
}
void recognizeAlgorithm()? ? ? ? ? ? ? ? ? ? ? ?//AI識別算法
{
//other operation
applyCPUResources();
//other operation
}
};
在類semiFinishedObj的構造函數semiFinishedObj中,首先調用操作parameterSetting初始化軟件參數,此處不會發生異常;然后調用操作applyCPUResources為AI識別算法recognizeAlgorithm申請CPU資源;最后調用操作interfaceSetting初始化軟件界面設置,此處不會發生異常。在applyCPUResources操作中,當CPU資源不夠時,構造的對象在業務層面不合法,不能為操作recognizeAlgorithm提供足夠的CPU資源,而這種情況只有當對象調用操作recognizeAlgorithm后才知道,如果這種操作是在用戶使用產品的過程中才被調用,將會對產品造成很大損失。在工程實踐中,構造函數一般非常復雜,半成品對象一般非常難以調試,必須引起設計者的重視。
2? 二階構造模式的設計
面向對象的程序設計技術以對象為核心[11],程序由一系列對象組成,每個對象都有自己的數據和操作。因此,構造出設計者預想的對象就變得尤為重要。
2.1? 二階構造設計流程
為了從根本上杜絕半成品對象,本文提出了在對象構造過程時,采用二階構造模式。二階構造核心將構造對象過程一分為二,與系統資源無關的程序層面的初始化操作在第一階段完成,與系統資源相關的業務層面的初始化操作在第二階段完成。與資源無關的操作為不可能出現異常情況的操作,如設置非指針成員變量的值為初始值;與資源相關的操作為非??赡艹霈F異常的情況,如申請內存、訪問文件、申請CPU資源等。
二階構造流程圖如圖2所示。第一階構造函數采用面向對象語言提供的構造函數,可以將和資源無關的操作放在第一階段構造函數中;第二階段構造對象使用普通的成員函數,可以將系統的資源申請、打開網絡等可能導致初始化失敗的操作放到第二階段的普通成員函數中。如果資源申請成功,則返回預定義對象;如果資源申請失敗,則首先刪除半成品對象,然后返回空指針。
2.2? 二階構造結構
二階構造的類的結構圖如圖3所示。
在類TWoPhaseCons中定義NewInstance操作,用戶只能通過TwoPhaseCons的NewInstance創建TwoPhaseCons的一個實例。注意類TwoPhaseCons的構造函數是私有的,試圖直接以操作TwoPhaseCons實例化類TwoPhaseCons的用戶將得到一個編譯時的錯誤信息。
2.3? 二階構造具體設計
根據圖2和圖3,可以將二階構造設計的關鍵代碼表述如下。
class TwoPhaseCons
{
private:
TwoPhaseCons()? ? ? ? ? ? ? ? ? ? ? ? ?//第一階段構造函數
{
}
bool construct()? ? ? ? ? ? ? ? ? ? ? ? ? //第二階段構造函數
{
return true;
}
public:
static TwoPhaseCons* NewInstance();? ? ?//對象創建函數
};
TwoPhaseCons* TwoPhaseCons::NewInstance()
{
TwoPhaseCons* ret = new TwoPhaseCons();
//若第二階段構造失敗,返回 NULL
if( !(ret && ret?>construct()) )
{
delete ret;
ret = NULL;
}
return ret;
}
在需要對象的地方,調用公有靜態成員函數TwoPhaseCons::NewInstance,此時在堆空間先申請一片內存空間,如果堆內存空間充足,當前對象的第一階段構造函數TwoPhaseCons會執行成功,之后執行第二階段的普通成員函數construct。通過if函數中的短路規則實現如下:如果都創建成功,則直接返回,此時得到可用的合法對象;否則銷毀在堆空間中的生成的半成品對象,將返回值設置為空,并返回空,此時無法創建合法的可用對象。可以通過公有靜態成員函數 NewInstance返回值為空,判斷當前由于業務邏輯問題無法得到合法可用的對象。如此便從本質上杜絕了半成品對象的產生,二階構造的意義在于得到合法可用的對象或者返回空對象。
2.4? 二階構造基本要素
合理的設計模式能夠有效改善軟件設計和程序代碼質量[12],設計模式具有4個基本要素,即模式名稱、問題、解決方案、效果。二階構造設計模式4個基本要素定義如下:
1) 模式名稱:TwoPhaseCons。
2) 問題:當構造函數中有資源相關的業務邏輯方面的初始化時,如申請內存、打開文件或網絡、申請CPU資源等,可能不會成功,此時應該使用二階構造設計模式。
3) 解決方案:第一階構造采用類的程序層面的構造函數,首先進行資源無關初始化,第二階構造采用普通成員函數,一般命名為construct,之后進行業務邏輯層面的資源相關初始化,最后兩者函數設置為非私有、并在公有靜態成員函數中被調用,公有靜態成員函數一般命名為NewInstance。
4) 效果:使用二階構造設計模式可以杜絕半成品的產生,同時使構造函數構造過程更加清晰。在實際工程中,對象一般非常大,其不適合放在有限的棧空間中,更應該放到堆空間里面,而二階構造設計模式只能在堆空間創建對象,這恰好非常適合工程開發,當然對于初學者應該要注意分清資源無關和資源相關的初始化,這需要一定的工程經驗。
3? 結? 語
在對象構造過程中,業務層面的構造容易失敗,最終結果導致構造的對象為不合法的半成品對象。本文提出一種新的對象構造設計模式,將對象構造分為兩階段,第一階段構造資源無關的部分,第二階段構造資源相關的部分。該方法將半成品對象的發現由類的使用者提前到類的設計者,能夠有效提高軟件設計質量和效率,同時在堆空間申請對象,更符合工程實踐。
參考文獻
[1] 孫陳飛,徐駿善.設計模式在地鐵自動售票機軟件中的應用[J].計算機應用,2012,32(z2):116?118.
[2] 曾一,周吉,孫政,等.支持MDA的設計模式建模與模型轉換方法研究[J].計算機工程與應用,2012,48(1):76?80.
[3] 肖卓寧,何锫,陳俊旭.設計模式變體的描述與驗證[J].計算機應用研究,2017,34(6):1762?1765.
[4] 楊喆,馬衛華,馬穎勁,等.設計模式在地面測發控軟件中的應用[J].航天控制,2014,32(2):91?96.
[5] 金建剛,包曉安.自適應軟件設計模式探討[J].樂山師范學院學報,2014,29(5):28?32.
[6] 何炳林.設計模式在燃料電池測試系統中的應用[J].現代電子技術,2014,37(22):153?156.
[7] 申新鵬,姚俊松,肖光雁.基于動態領域模型的頁面設計模式[J].計算機工程與設計,2012,33(6):2260?2264.
[8] 彭世康,周逢權.新的設計模式?數組工廠和數組原型模式[J].計算機應用,2012,32(z2):107?112.
[9] 肖卓寧,何锫,黎妍.基于設計模式角色的附加關系檢測研究[J].計算機應用研究,2015,32(7):2042?2045.
[10] 楊翼.設計模式在航空公司電子客票對賬程序中的應用[J].現代電子技術,2011,34(22):108?111.
[11] 張海藩,呂云翔.軟件工程[M].4版.北京:人民郵電出版社,2013.
[12] 劉偉,李雅琎,胡志剛.設計模式對軟件可維護性影響的定量研究[J].軟件導刊,2016,15(12):95?97.