一种二阶构造设计模式的对象构造新方法
2020-07-23崔群超荆文芳
崔群超 荆文芳
摘 要: 为保证在业务层面对象构造的合法性,避免产生半成品对象,文中提出一种二阶构造设计模式的对象构造设计方法。首先对对象构造的过程进行了认知与分析,指出了在构造对象过程中业务层面构造失败会产生半成品对象,在此基础上提出了二阶构造的设计流程,针对业务层面对象构造存在不成功的情况,采用在第二阶段来构造,并判断构造是否成功,以此来避免半成品对象的产生,使对象构造合法与否能够被设计者直接判断,最后给出了对该设计模式的名称、问题、解决方案、效果四个基本要素的总结。该模式设计简单、使用方便,可有效避免半成品对象的产生,可以为软件质量的提高带来新的可复用方法。
关键词: 对象构造; 二阶构造; 模式设计; 业务层面; 半成品对象; 参数设定
中图分类号: 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 二阶构造设计流程
为了从根本上杜绝半成品对象,本文提出了在对象构造过程时,采用二阶构造模式。二阶构造核心将构造对象过程一分为二,与系统资源无关的程序层面的初始化操作在第一阶段完成,与系统资源相关的业务层面的初始化操作在第二阶段完成。与资源无关的操作为不可能出现异常情况的操作,如设置非指针成员变量的值为初始值;与资源相关的操作为非常可能出现异常的情况,如申请内存、访问文件、申请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.