APP下载

浅谈嵌入式软件的规范设计要点
——以C 语言的函数设计为例

2021-01-20

南方农机 2021年1期
关键词:可读性代码编码

付 宽

(汉中职业技术学院,陕西 汉中 723000)

嵌入式系统已广泛应用于各行各业,随着人们生活向信息化、智能化的发展,嵌入式技术已经彻底融入到人们的生活中,并发挥着越来越重要的作用。 软件代码相当于嵌入式系统的灵魂,控制着整个嵌入式系统的工作。 软件代码质量的好坏决定着系统的工作质量, 而好的编码规范是提高代码质量的最有效的手段之一。 如何编写规范性的嵌入式软件代码在实际软件开发过程中至关重要。

1 编码规范的意义

对编程代码的规范要求有诸多现实意义:1) 良好的编码规范可以降低软件的维护成本, 因为几乎没有哪一款软件是由最初的开发人员在整个生命周期中维护的;2)一个好的编码规范可以提高软件的可读性,让开发人员尽可能快而彻底的理解新代码;3) 良好的编码标准可以最大化团队开发的合作效率;4) 长期规范的编码还可以让开发人员养成良好的编码习惯, 甚至锻炼出更严谨的思维[1]。C 语言是嵌入式系统中最常用的编程语言,本文以C 语言为例,针对C 语言中的函数,简要谈谈函数的设计规范。

2 函数的设计规范

一个庞大的程序通常会由很多子程序构成, 每一个子程序都有其特定的功能。 通常在程序设计中,会将一些常用的功能模块编写成函数。C 语言中的函数是指一段可以直接被另一段程序或代码引用的程序或代码。 同一个函数可以被一个或多个函数调用任意多次。 为了减少工作量和增加程序可读性, 要尽量将重复的工作定义为函数。 以下列举了几项软件工程师们比较容易忽略又特别重要的规范要点。

2.1 函数应做到功能单一、结构简单

为了实现积木式的开发模式, 应该尽量实现函数的功能单一或功能集中,结构简单。 这样做不仅可以使函数的可读性更强,而且可以使函数的测试和维护变得简单。所以通常建议函数的长度不超过一页(常用开发系统配置)或300 行,并且函数接口应该尽量设计精简。

2.2 防止函数中产生随机内聚

函数的内聚是一个函数内部各代码之间相关联程度的度量,函数内部的各代码之间应该联系紧密、功能集中,即是最理想的内聚。 如果函数中各代码之间联系松散,甚至代码之间的逻辑不相关,将导致随机内聚的产生。 随机内聚会使得程序的维护、测试和升级变得困难,并且使得程序的功能模糊。 随机内聚通常会使函数在迭代的过程中陷入困难,所以通常建议将不相关的代码剥离,构成新的函数,从而减少函数中随机内聚的产生。例如矩形的长、宽与点的坐标基本没有任何关系,写在一个函数内则会造成随机内聚,如图1 所示。

图1 防止函数中产生随机内聚

2.3 应为简单功能编写函数

软件工程师为了寻求方便,通常会将非常简单的功能用一两行代码嵌入到上级函数中,这样做虽然缩短了程序的开发时间,但不利于函数可读性,从而不便于维护和测试。 应当为简单功能编写函数,在函数的命名上,将其功能显式化,可大大提高函数的可读性,并且便于维护和测试。 例如,程序中需要比较两个值的大小,并提取较大的值,可以用一行代码实现,也可以编写一个函数,如图2 所示。 由图例可见,函数命名可使功能显式化,利于提高可读性。

2.4 归并功能小调用少的函数

虽然建议将小功能编写为单独的函数, 但是如果出现上级函数调用(扇入)次数极低的情况,应考虑归并到上级函数中。 功能小且扇入过低的函数如果单独存在,会使函数数量增加,使程序过于庞大,不利于维护。 所以功能小且扇入过低的函数不建议单独存在。

2.5 输入变量应进行必要的合法性检查

函数输入变量的方式主要有两种:一种是参数输入,另一种是非参数输入,即全局变量输入。 函数应该在使用输入变量之前执行必要的合法性检查, 能够有效避免出错。 建议如果有条件的话,增加异常处理措施可使程序更加可控。 例如,以下函数的功能为进行AD 转换并返回数字量结果,应对通道号参数的有效性进行检查,如果输入的通道号大于允许的最大通道号,则报错,反之则运行函数程序,如图3 所示。

图3 输入变量应进行必要的合法性检查

2.6 防止将函数的参数作为工作变量

将函数的参数作为工作变量, 可能会错误更改参数内容,这可能会很危险。 因此,最好先用局部变量替换必须更改的参数, 然后将局部变量的内容赋给该参数。 例如,函数中将参数sum 作为工作变量带入计算,会增加风险,如图4 所示。

图4 防止将函数的参数作为工作变量

2.7 函数的调用关系要考虑高扇入合理扇出

函数的扇入是指直接调用该函数的上级函数的个数,扇入大表示函数的复用程度高。 函数的扇出是指该函数直接调用的下级函数的个数,扇出大表示函数的功能比较复杂,需要调用过多的下级函数。 一般情况下,软件工程师通常追求函数的高扇入,同时合理扇出[2]。 因为扇入越高,使用此函数的上级函数越多,说明函数使用效率高,但不能单纯追求高扇入而忽略了函数的独立性。 而扇出越高表明函数越复杂,同时函数越不稳定。 函数的稳定性遵循木桶原理,扇出越高表明组成木桶的木板越多,函数的稳定性越差。 因为任何一个调用的函数出问题了,这个函数也就会出问题。 一般建议函数的合理扇出数量一般为3 个~5 个。

2.8 避免省略“void”关键字

在C 语言中,“void”被翻译为“无类型”,在函数中的用法有两种:一是当函数不需要返回值时,在函数前使用void 限定,例如void func(int a,char *b);二是当函数不接受参数时, 在括号里使用void 限定, 例如int func(void)。“void”在不影响程序编译的情况下是可以省略的,但为了规范起见,建议不要省略“void”,因为有些编译器比(如ST芯片的编译器)必须要用该关键字,否则轻则出现编译警告,重则编译出错。 所以,为了使软件代码具有较高的维护性和移植性,须避免省略“void”关键字。

3 函数优化时需遵循的原则

基于以上列举的规范性要素,对已经写好的代码和处于迭代期间的代码,应该进行规范的优化。 通过优化可以使软件合作编程更加轻松,使代码维护性增强,使工程师们工作更加严谨,降低函数间的耦合度,并提高函数的独立性以及代码可读性、效率和可维护性。优化函数结构时,应遵守以下原则:1)函数的功能应当单一;2)函数的规模不应太大;3)函数的接口应当简单;4)函数的扇入尽量高;5)函数的扇出不能太高;6)函数的内聚性尽量提高[3-4]。

4 结论

软件程序由无数的函数构成,提高函数的规范性是提高整个软件代码规范性的重要一环。 对于嵌入式软件而言,无论是底层的驱动代码还是上层逻辑代码,规范性都能使软件合作编程更加轻松,使代码维护性增强,使工程师们工作更加严谨。 代码作为开发企业的无形商品,近年来企业的管理者也越来越重视代码的质量管理,好的编码规范是提高代码质量的最有效的手段之一。 越早实现规范化编码的企业,也就越能够在市场竞争中处于优势。

猜你喜欢

可读性代码编码
可读性
生活中的编码
本期缩略语表
《全元诗》未编码疑难字考辨十五则
子带编码在图像压缩编码中的应用
Genome and healthcare
创世代码
创世代码
创世代码
创世代码