崔群超 荊文芳
摘? 要: 為保證在業(yè)務(wù)層面對(duì)象構(gòu)造的合法性,避免產(chǎn)生半成品對(duì)象,文中提出一種二階構(gòu)造設(shè)計(jì)模式的對(duì)象構(gòu)造設(shè)計(jì)方法。首先對(duì)對(duì)象構(gòu)造的過程進(jìn)行了認(rèn)知與分析,指出了在構(gòu)造對(duì)象過程中業(yè)務(wù)層面構(gòu)造失敗會(huì)產(chǎn)生半成品對(duì)象,在此基礎(chǔ)上提出了二階構(gòu)造的設(shè)計(jì)流程,針對(duì)業(yè)務(wù)層面對(duì)象構(gòu)造存在不成功的情況,采用在第二階段來構(gòu)造,并判斷構(gòu)造是否成功,以此來避免半成品對(duì)象的產(chǎn)生,使對(duì)象構(gòu)造合法與否能夠被設(shè)計(jì)者直接判斷,最后給出了對(duì)該設(shè)計(jì)模式的名稱、問題、解決方案、效果四個(gè)基本要素的總結(jié)。該模式設(shè)計(jì)簡(jiǎn)單、使用方便,可有效避免半成品對(duì)象的產(chǎn)生,可以為軟件質(zhì)量的提高帶來新的可復(fù)用方法。
關(guān)鍵詞: 對(duì)象構(gòu)造; 二階構(gòu)造; 模式設(shè)計(jì); 業(yè)務(wù)層面; 半成品對(duì)象; 參數(shù)設(shè)定
中圖分類號(hào): TN911?34; TP311.11? ? ? ? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼: A? ? ? ? ? ? ? ? ? ? ? ?文章編號(hào): 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? 引? 言
設(shè)計(jì)模式是描述一個(gè)不斷重復(fù)出現(xiàn)的問題以及對(duì)該問題的核心解決方案,常用于軟件系統(tǒng)的建模過程,以提高軟件系統(tǒng)的設(shè)計(jì)質(zhì)量、可重用性及研發(fā)效率[1?5]。常見的設(shè)計(jì)模式[6]有 Singleton Command 等23種,且經(jīng)過長(zhǎng)期應(yīng)用與改進(jìn),設(shè)計(jì)模式已經(jīng)成為一種軟件設(shè)計(jì)的標(biāo)準(zhǔn)化模式,并成為軟件工程領(lǐng)域的研究熱點(diǎn)[7?9]。設(shè)計(jì)模式提供了一種封裝設(shè)計(jì)知識(shí)的方法,這些設(shè)計(jì)知識(shí)為標(biāo)準(zhǔn)的面向?qū)ο筌浖_發(fā)問題提供了解決方案[10]。對(duì)象是面向?qū)ο蠹夹g(shù)的核心,對(duì)象業(yè)務(wù)層面的合法構(gòu)造對(duì)面向?qū)ο蠹夹g(shù)的應(yīng)用至關(guān)重要,設(shè)計(jì)模式的正式提出者之一Erich Gamma 認(rèn)為設(shè)計(jì)模式并不是絕對(duì)的,在實(shí)踐過程中,還必須發(fā)現(xiàn)和整理使用過的設(shè)計(jì)模式,并記錄下來,以提供新的軟件設(shè)計(jì)模式。本文提出一種新的對(duì)象構(gòu)造模式,該模式可以保證在對(duì)象業(yè)務(wù)層面構(gòu)造不合法時(shí)返回空,能夠方便且有效地提高對(duì)象構(gòu)造的質(zhì)量,使軟件設(shè)計(jì)更加高效。
1? 半成品對(duì)象
如圖1所示,面向?qū)ο笤O(shè)計(jì)中,構(gòu)造函數(shù)aCreatObject創(chuàng)建對(duì)象,首先給aProgramLevel發(fā)送evaluateFirst請(qǐng)求,進(jìn)行賦值,然后aCreatObject發(fā)送請(qǐng)求到aBusinessLevel申請(qǐng)內(nèi)存,最后aCreatObject給aProgramLevel發(fā)送evaluateSecond請(qǐng)求,進(jìn)行最后賦值。以C++語言為例,正常情況下,類的構(gòu)造函數(shù)會(huì)合法地執(zhí)行完圖1的初始化操作;但是當(dāng)業(yè)務(wù)層面的操作,比如申請(qǐng)內(nèi)存失敗的時(shí)候,構(gòu)造對(duì)象此時(shí)不能夠提供足夠的內(nèi)存給其他業(yè)務(wù)邏輯使用,但是得到的對(duì)象依舊可以使用,卻是一個(gè)非法對(duì)象,此時(shí)稱此非法對(duì)象為半成品對(duì)象。
以申請(qǐng)CPU資源可能失敗為例,給出可能造成半成品對(duì)象的類semiFinishedObj偽代碼如下。
class semiFinishedObj
{
protected:
void parameterSetting();? ? ? ? ? ? ? ? ? ? ? //軟件參數(shù)設(shè)置
void interfaceSetting();? ? ? ? ? ? ? ? ? ? ? ?//軟件界面設(shè)置
void applyCPUResources();
//為AI識(shí)別算法recognizeAlgorithm()申請(qǐng)CPU資源,且可能失敗
public:
semiFinishedObj()
{
parameterSetting();
applyCPUResources();
interfaceSetting();
}
void recognizeAlgorithm()? ? ? ? ? ? ? ? ? ? ? ?//AI識(shí)別算法
{
//other operation
applyCPUResources();
//other operation
}
};
在類semiFinishedObj的構(gòu)造函數(shù)semiFinishedObj中,首先調(diào)用操作parameterSetting初始化軟件參數(shù),此處不會(huì)發(fā)生異常;然后調(diào)用操作applyCPUResources為AI識(shí)別算法recognizeAlgorithm申請(qǐng)CPU資源;最后調(diào)用操作interfaceSetting初始化軟件界面設(shè)置,此處不會(huì)發(fā)生異常。在applyCPUResources操作中,當(dāng)CPU資源不夠時(shí),構(gòu)造的對(duì)象在業(yè)務(wù)層面不合法,不能為操作recognizeAlgorithm提供足夠的CPU資源,而這種情況只有當(dāng)對(duì)象調(diào)用操作recognizeAlgorithm后才知道,如果這種操作是在用戶使用產(chǎn)品的過程中才被調(diào)用,將會(huì)對(duì)產(chǎn)品造成很大損失。在工程實(shí)踐中,構(gòu)造函數(shù)一般非常復(fù)雜,半成品對(duì)象一般非常難以調(diào)試,必須引起設(shè)計(jì)者的重視。
2? 二階構(gòu)造模式的設(shè)計(jì)
面向?qū)ο蟮某绦蛟O(shè)計(jì)技術(shù)以對(duì)象為核心[11],程序由一系列對(duì)象組成,每個(gè)對(duì)象都有自己的數(shù)據(jù)和操作。因此,構(gòu)造出設(shè)計(jì)者預(yù)想的對(duì)象就變得尤為重要。
2.1? 二階構(gòu)造設(shè)計(jì)流程
為了從根本上杜絕半成品對(duì)象,本文提出了在對(duì)象構(gòu)造過程時(shí),采用二階構(gòu)造模式。二階構(gòu)造核心將構(gòu)造對(duì)象過程一分為二,與系統(tǒng)資源無關(guān)的程序?qū)用娴某跏蓟僮髟诘谝浑A段完成,與系統(tǒng)資源相關(guān)的業(yè)務(wù)層面的初始化操作在第二階段完成。與資源無關(guān)的操作為不可能出現(xiàn)異常情況的操作,如設(shè)置非指針成員變量的值為初始值;與資源相關(guān)的操作為非??赡艹霈F(xiàn)異常的情況,如申請(qǐng)內(nèi)存、訪問文件、申請(qǐng)CPU資源等。
二階構(gòu)造流程圖如圖2所示。第一階構(gòu)造函數(shù)采用面向?qū)ο笳Z言提供的構(gòu)造函數(shù),可以將和資源無關(guān)的操作放在第一階段構(gòu)造函數(shù)中;第二階段構(gòu)造對(duì)象使用普通的成員函數(shù),可以將系統(tǒng)的資源申請(qǐng)、打開網(wǎng)絡(luò)等可能導(dǎo)致初始化失敗的操作放到第二階段的普通成員函數(shù)中。如果資源申請(qǐng)成功,則返回預(yù)定義對(duì)象;如果資源申請(qǐng)失敗,則首先刪除半成品對(duì)象,然后返回空指針。
2.2? 二階構(gòu)造結(jié)構(gòu)
二階構(gòu)造的類的結(jié)構(gòu)圖如圖3所示。
在類TWoPhaseCons中定義NewInstance操作,用戶只能通過TwoPhaseCons的NewInstance創(chuàng)建TwoPhaseCons的一個(gè)實(shí)例。注意類TwoPhaseCons的構(gòu)造函數(shù)是私有的,試圖直接以操作TwoPhaseCons實(shí)例化類TwoPhaseCons的用戶將得到一個(gè)編譯時(shí)的錯(cuò)誤信息。
2.3? 二階構(gòu)造具體設(shè)計(jì)
根據(jù)圖2和圖3,可以將二階構(gòu)造設(shè)計(jì)的關(guān)鍵代碼表述如下。
class TwoPhaseCons
{
private:
TwoPhaseCons()? ? ? ? ? ? ? ? ? ? ? ? ?//第一階段構(gòu)造函數(shù)
{
}
bool construct()? ? ? ? ? ? ? ? ? ? ? ? ? //第二階段構(gòu)造函數(shù)
{
return true;
}
public:
static TwoPhaseCons* NewInstance();? ? ?//對(duì)象創(chuàng)建函數(shù)
};
TwoPhaseCons* TwoPhaseCons::NewInstance()
{
TwoPhaseCons* ret = new TwoPhaseCons();
//若第二階段構(gòu)造失敗,返回 NULL
if( ?。╮et && ret?>construct()) )
{
delete ret;
ret = NULL;
}
return ret;
}
在需要對(duì)象的地方,調(diào)用公有靜態(tài)成員函數(shù)TwoPhaseCons::NewInstance,此時(shí)在堆空間先申請(qǐng)一片內(nèi)存空間,如果堆內(nèi)存空間充足,當(dāng)前對(duì)象的第一階段構(gòu)造函數(shù)TwoPhaseCons會(huì)執(zhí)行成功,之后執(zhí)行第二階段的普通成員函數(shù)construct。通過if函數(shù)中的短路規(guī)則實(shí)現(xiàn)如下:如果都創(chuàng)建成功,則直接返回,此時(shí)得到可用的合法對(duì)象;否則銷毀在堆空間中的生成的半成品對(duì)象,將返回值設(shè)置為空,并返回空,此時(shí)無法創(chuàng)建合法的可用對(duì)象??梢酝ㄟ^公有靜態(tài)成員函數(shù) NewInstance返回值為空,判斷當(dāng)前由于業(yè)務(wù)邏輯問題無法得到合法可用的對(duì)象。如此便從本質(zhì)上杜絕了半成品對(duì)象的產(chǎn)生,二階構(gòu)造的意義在于得到合法可用的對(duì)象或者返回空對(duì)象。
2.4? 二階構(gòu)造基本要素
合理的設(shè)計(jì)模式能夠有效改善軟件設(shè)計(jì)和程序代碼質(zhì)量[12],設(shè)計(jì)模式具有4個(gè)基本要素,即模式名稱、問題、解決方案、效果。二階構(gòu)造設(shè)計(jì)模式4個(gè)基本要素定義如下:
1) 模式名稱:TwoPhaseCons。
2) 問題:當(dāng)構(gòu)造函數(shù)中有資源相關(guān)的業(yè)務(wù)邏輯方面的初始化時(shí),如申請(qǐng)內(nèi)存、打開文件或網(wǎng)絡(luò)、申請(qǐng)CPU資源等,可能不會(huì)成功,此時(shí)應(yīng)該使用二階構(gòu)造設(shè)計(jì)模式。
3) 解決方案:第一階構(gòu)造采用類的程序?qū)用娴臉?gòu)造函數(shù),首先進(jìn)行資源無關(guān)初始化,第二階構(gòu)造采用普通成員函數(shù),一般命名為construct,之后進(jìn)行業(yè)務(wù)邏輯層面的資源相關(guān)初始化,最后兩者函數(shù)設(shè)置為非私有、并在公有靜態(tài)成員函數(shù)中被調(diào)用,公有靜態(tài)成員函數(shù)一般命名為NewInstance。
4) 效果:使用二階構(gòu)造設(shè)計(jì)模式可以杜絕半成品的產(chǎn)生,同時(shí)使構(gòu)造函數(shù)構(gòu)造過程更加清晰。在實(shí)際工程中,對(duì)象一般非常大,其不適合放在有限的??臻g中,更應(yīng)該放到堆空間里面,而二階構(gòu)造設(shè)計(jì)模式只能在堆空間創(chuàng)建對(duì)象,這恰好非常適合工程開發(fā),當(dāng)然對(duì)于初學(xué)者應(yīng)該要注意分清資源無關(guān)和資源相關(guān)的初始化,這需要一定的工程經(jīng)驗(yàn)。
3? 結(jié)? 語
在對(duì)象構(gòu)造過程中,業(yè)務(wù)層面的構(gòu)造容易失敗,最終結(jié)果導(dǎo)致構(gòu)造的對(duì)象為不合法的半成品對(duì)象。本文提出一種新的對(duì)象構(gòu)造設(shè)計(jì)模式,將對(duì)象構(gòu)造分為兩階段,第一階段構(gòu)造資源無關(guān)的部分,第二階段構(gòu)造資源相關(guān)的部分。該方法將半成品對(duì)象的發(fā)現(xiàn)由類的使用者提前到類的設(shè)計(jì)者,能夠有效提高軟件設(shè)計(jì)質(zhì)量和效率,同時(shí)在堆空間申請(qǐng)對(duì)象,更符合工程實(shí)踐。
參考文獻(xiàn)
[1] 孫陳飛,徐駿善.設(shè)計(jì)模式在地鐵自動(dòng)售票機(jī)軟件中的應(yīng)用[J].計(jì)算機(jī)應(yīng)用,2012,32(z2):116?118.
[2] 曾一,周吉,孫政,等.支持MDA的設(shè)計(jì)模式建模與模型轉(zhuǎn)換方法研究[J].計(jì)算機(jī)工程與應(yīng)用,2012,48(1):76?80.
[3] 肖卓寧,何锫,陳俊旭.設(shè)計(jì)模式變體的描述與驗(yàn)證[J].計(jì)算機(jī)應(yīng)用研究,2017,34(6):1762?1765.
[4] 楊喆,馬衛(wèi)華,馬穎勁,等.設(shè)計(jì)模式在地面測(cè)發(fā)控軟件中的應(yīng)用[J].航天控制,2014,32(2):91?96.
[5] 金建剛,包曉安.自適應(yīng)軟件設(shè)計(jì)模式探討[J].樂山師范學(xué)院學(xué)報(bào),2014,29(5):28?32.
[6] 何炳林.設(shè)計(jì)模式在燃料電池測(cè)試系統(tǒng)中的應(yīng)用[J].現(xiàn)代電子技術(shù),2014,37(22):153?156.
[7] 申新鵬,姚俊松,肖光雁.基于動(dòng)態(tài)領(lǐng)域模型的頁面設(shè)計(jì)模式[J].計(jì)算機(jī)工程與設(shè)計(jì),2012,33(6):2260?2264.
[8] 彭世康,周逢權(quán).新的設(shè)計(jì)模式?數(shù)組工廠和數(shù)組原型模式[J].計(jì)算機(jī)應(yīng)用,2012,32(z2):107?112.
[9] 肖卓寧,何锫,黎妍.基于設(shè)計(jì)模式角色的附加關(guān)系檢測(cè)研究[J].計(jì)算機(jī)應(yīng)用研究,2015,32(7):2042?2045.
[10] 楊翼.設(shè)計(jì)模式在航空公司電子客票對(duì)賬程序中的應(yīng)用[J].現(xiàn)代電子技術(shù),2011,34(22):108?111.
[11] 張海藩,呂云翔.軟件工程[M].4版.北京:人民郵電出版社,2013.
[12] 劉偉,李雅琎,胡志剛.設(shè)計(jì)模式對(duì)軟件可維護(hù)性影響的定量研究[J].軟件導(dǎo)刊,2016,15(12):95?97.