装备研制的代码质量提高方法研究
2016-02-23葛学仕陈书恒
葛学仕,陈书恒
装备研制的代码质量提高方法研究
葛学仕,陈书恒
良好的代码质量在装备研制中十分重要,论文从架构、编码、测试等环节分析了武器装备软件模块可能存在的代码质量问题,提出了具体可行的软件开发准则,为较好保证软件代码质量打下坚实基础。
代码质量;软件架构;软件测试
0 引言
随着武器装备的现代化、信息化、智能化,各类武器装备的研制需要大量的软件设计工作。当前,对武器装备软件的关注主要侧重于功能性方面,但对软件本身的设计、编码质量并不关注。然而在武器装备不断更新换代的背景下,软件的设计、编码质量是不可忽视的,它将极大影响软件的运行效率、可靠性、维护成本、兼容性和扩展性。
以2007年丰田踏板门事件为例,由于丰田汽车动力控制软件结构设计不合理、函数复杂度高、开发过程不规范,导致软件缺陷不能被及时发现,造成其在紧急情况下不能正常制动。最终,该事件造成高达16亿美元的损失[1]。
因此良好的代码质量在装备研制中是十分重要。良好的软件代码质量主要依赖于简洁合理的架构设计、整洁干净的编码风格、覆盖全周期的软件测试,它们不仅是武器装备软件设计应该遵循的标准,也是软件设计过程中具有极高可操作性的具体步骤。
1 简洁合理的架构设计
软件架构设计是指对系统功能模块的合理划分,对功能模块间耦合关系的明确定义,对外部预留接口的准确规划。无论是基于对象还是基于流程的软件设计,这些都是其中的关键问题。合理的架构可以使软件充分复用已有的资源,使软件健壮地在各个平台上运行,使软件适应不断的升级需求,同时降低开发周期、维护成本甚至决定整个项目的成败。
设计模式是一套被反复使用、多数人知晓的、经过分类编目的代码设计经验总结。对重要设计模式的合理使用可以有效提高架构设计的质量,避免架构设计常见的错误。经典的设计模式有23种,如工厂模式、单实例模式、适配器模式、代理模式、观察者模式等[2]。根据装备研制中交联设备多、遗留代码多、升级改装频繁、控制流程复杂等特点,适配器模式、外观模式等设计模式尤其值得重视:
1.1 适配器模式
在装备研制中,往往需要与许多外部资源或系统集成进行数据交互或提供服务。例如,当飞机导航系统需要获取惯导系统数据时,通常的做法是由惯导系统来提供一系列固定的对外接口,导航系统通过直接调用这些接口来获实时数据。虽然这样做能够很好地完成功能性要求,但会造成系统的不良耦合。当导航系统需要被移植到使用其他惯导系统的飞机上时,就可能造成导航系统需要修改大量的代码的问题甚至重新开发,因为对惯导数据获取可能出现在导航系统的任何地方。
适配器模式为此提供了较好的解决方案,如图1所示:
图1 原系统获取导航数据方式
当任务系统需要获取惯导数据时,它并不需要知道任何外部细节,而是给出它所需要的接口定义。由适配器通过组合调用惯导系统接口等方式来实现任务系统所定义的接口。在使用该模式后,如图2所示:
图2 适配器模式下获取导航数据方式
对于不同的惯导系统只需要更新适配器的实现,而任务系统不会受到任何影响。
1.2 外观模式
装备研制中,软件系统大多较为复杂,拥有较多的子系统和外部系统,通过对它们的组合、协作,来完成软件需要实现的功能。但在这类软件设计过程中,大多存在子系统或外部系统暴露过多的细节,耦合度较高的问题。以某系统的硬件初始化过程为例,通常的设计是,系统的初始化函数会依次调用ARC 429总线、内部串行总线、北斗、GPS等模块的端口设定、初始化命令发送、地址注册等函数,如图3所示:
图3 原系统初始化过程
但对于系统初始化过程的业务逻辑来说,各个硬件模块的初始化细节并不应该是关注的重点,逐一调用各个模块的初始化函数会使系统与它们都发生耦合,导致各个子系统的初始化过程与系统本身的初始化逻辑混杂在一起,不利于核心业务逻辑的维护。因此,合理的设计模式是增加HardWare这个硬件外观类来屏蔽核心业务与各个子系统的耦合,在系统的初始化函数中,只需要调用HardWare类封装的Init函数来实现各个模块的初始化工作,如图4所示:
图4 外观模式下初始化过程
虽然上述设计模式仅是经典设计模式中的很小一部分,但从两个范例中已经可以看出它们在架构设计中的作用,如果在架构设计中能够合理准确地使用所有的设计模式,不仅会使软件设计变得非常容易,研发效率大幅提高,也是高质量代码的有力保障。
2 整洁干净的编码
武器装备的软件开发周期短,稳定性要求高,开发人员在开发过程中往往仅重视软件的功能与性能指标,忽视软件的代码质量。较差的源码虽然不会直接影响软件的使用特性,但对软件的升级维护、功能扩展、测试验证会带来较大的影响。尤其是维护历史久远、编写不良的软件,其成本不亚于完全新编写[3]。编写整洁的代码应该具有可读性性好、逻辑清晰、扩展简易的特点。为了达到这些目标,以下准则是编写代码过程中必须遵守的。
2.1 合理的命名
源码中变量、函数、类、文件都需要名字,命名的合理性是代码可读性的关键因素。不合理的命名会使代码变得杂乱,使阅读者无法在短时间内理解。使代码命名变得合理应该遵循以下的命名规则:
1)名副其实,名字应能够不借助注释准确描述变量、函数的功能。
正面例子:
TimeSinceStartUp
反面例子:
T//开机至今的时间
2)避免名字中的误导信息,对变量做有意义的区分,尤其应避免数字在命名中出现如N1、N2。在命名时同样应避免INFO、DATA等没有区分度的单词,因为看到一个ProductInfo变量,读者并不能从命名中得知这个变量包含的究竟是什么信息。
3)使用可以被读出来且易于检索的名字。
4)避免思维映射和双关语
2.2 合理的注释量
注释在程序运行时不起任何作用,但它却是优秀代码的关键因素之一。合理的注释不仅能够帮助读者理解程序的设计原理,帮助程序员记录开发时的思想,也是测试人员进行白盒测试的重要依据。但注释的数量并非越多越好,过多的依赖注释会使程序员忽视代码本身的可读性,注释仅应该在说明函数输入输出要求、说明文件或类的功能、说明重要模块思想等时刻出现,注释过多一般是添加了不必要的说明,或是代码可读性太差不得不使用注释说明。
2.3 函数长度与参数量
函数是程序实现某项单一功能的最小模块,函数设计应遵循精简复用的原则。一般来说设计合理的函数代码函数不应超过20行,函数的输入参数不超过3个。过长的函数或过多的输入参数往往意味着函数违背了单一功能的原则,这不仅会使函数本身的实现晦涩难懂,还会严重影响函数的复用性,使代码变得冗长影响维护成本和效率。另一方面,过长的函数和过多的参数输入会大大提高函数的单元测试的难度。为了实现相同的测试覆盖度,每增加一行代码、增加一个输入参数,对应的测试用例需要几何级数的增加。
实现整洁干净的代码风格需要程序员从编写代码的每一个细节入手,提高代码的可读性,使代码结构变得合理。但这并不意味着维护良好的代码风格会影响装备软件的开发进度,相反的可读性较好的代码可以大量减少文档维护的需求、降低后续维护的时间成本、降低测试的难度并减少错误发生的概率,从而大大提升开发效率。
3 覆盖全周期的测试设计优秀的源码,测试是必不可少的组成部分,测试不仅可以验证程序正确性,也是程序设计思想的体现。在编写程序之前相应的测试用例就应编制完成,因为程序运行的各种可能出现的异常情况,在设计时就应被充分考虑,而编写测试用例能够很好的帮助程序员思考各种极端情况下程序的运行状态,减少设计缺陷发生的概率[4]。
测试用例的编制依据应是软件需求而非代码本身和测试覆盖度。无论代码是否运行良好,违背需求设计的程序都是存在严重设计缺陷的。当然,测试的对象并不仅是代码,软件需求、数据库设计、人机界面设计同样需要测试。如软件需求的测试就要对需求的完备性、无二异性、正确性、可实现性进行考察,该测试一般采用结对评审的方式经行,业务流程和状态建模可作为测试的辅助手段。
软件测试不是万能的,它只能尽可能地发现代码中存在的缺陷,但更多的时候还是需要程序员通过良好的编码习惯来避免缺陷的发生,因为对于缺陷的修正往往会引入新的缺陷,尤其是在编码风格不良的代码上进行修改。
4 总结
本文从软件架构、编码、测试等环节分析了武器装备研制中软件编码质量的重要性,并对如何提高软件代码质量提出了具体的、具有可操作性的建议与方法。使用合理的设计模式、遵循规范的编码原则、借助覆盖全周期的测试手段,可以大幅提升软件代码的质量,从而降低升级维护成本、控制潜在缺陷的发生率。
[1] 邹德萍. 丰田召回事件的警示 [J]. 资源与人居环境. 2010 (07)76-78.
[2] 杨莉萍. 面向对象的方法和设计模式 [J]. 计算机应用与软件. 2006 (03):36-38.
[3] robert c. Martin.clean code[M].北京:电子工业出版社,2012.
[4] 蒋晓阳. 武器软件的测试与维护[J]. 火力与指挥控制2005(30).200-201.
Research on Improving Coding Quality in Armament Software Development
Ge Xueshi, Chen Shuheng
(Naval Academy of Armament, Shanghai 200436, China)
The code-quality plays an important role in development of armament. In this paper, possible code-quality related problems in architect design, coding and testing are well analyzed. Then corresponding software development rules are proposed. And solid foundation ensuring better code-quality in future software development can be established by these rules.
Coding quality; Software architect; Software testing
TP393
A
1007-757X(2016)010-0059-02
2016.08.29)
作者信息:葛学仕(1987-),海军装备研究院,硕士研究生,研究方向:软件工程,流媒体技术与应用,雷达与电子对抗技术,上海 200436
陈书恒(1984-),海军装备研究院,工程师,研究方向:航空电子总体,上海 200436