试析C语言零缺陷编程方法研究
摘要:C语言是一种用途广泛、使用方便的编程语言。但是它也存在着语法检验不够严格等问题。该文章根据软件编程方法并结合C语言的特点创设零缺陷编程方法,以供广大编程爱好者借鉴。
关键词:C语言;编程规范;零缺陷;测试
C语言简单、易用,是许多编程爱好者的首选语言。但由于C语言的语法不是很严格,许多程序设计者在编程过程中会遇到许多错误,在程序设计方法上,国外有许多学者对程序零缺陷程序设计提出了自已的观点和方法。如美国管理学家philipb。croby的“零缺陷”思想引进来,用以提高编程的质量,增大软件中的验证力度。IBM公司70年代末和80年代初提出的“净室软件工程”(clean room software engineering),“净室”一词源于精密半导体器件中的无尘生产车间,它强调在生产过程中就消除问题,而不是在产品生产以后,才依靠检测来挑选有问题的产品。传统的软件工程建模、形式化方法、程序验证(正确性证明)、以及统计SQA的集成使用已经组合成一种可以导致极高质量软件的技术。净室软件工程(Cleanroom software engineering)是一种在软件开发过程中强调在软件中建立正确性的需要的方法。本文通过建立良好的C语言的编程风格,避免出现常见的错误,并通过净室过程的方法来提高C语言编程的效率。 http://www.751com.cn/
1 良好的编程风格
良好的编程风格可以在许多方面帮助开发人员。如果你阅读过 Linux 内核源代码的话,可能会对程序的优美编排所倾倒。良好的编程风格可以增加代码的可读性,并帮助你理清头绪。如果程序非常杂乱,大概看一眼就该让你晕头转向了。编程风格最能体现一个程序员的综合素质。
许多人可能对 Windows 所推崇的匈牙利命名法很熟悉。这种方法定义了非常复杂的函 数、变量、类型等的命名方法,典型的命名方法是采用大小写混写的方式,对于变量名称,则采用添加前缀的办法来表示其类型,例如:
char szBuffer[20];
int nCount;
利用 sz 和 n 分别代表字符串和整数。为了表示一个变量名称,采用如下的变量名称是可能的:
int iThisIsAVeryLongVariable;
在 Linux 中,我们经常看到的是定义非常简单的函数接口和变量名称。在 Linux 内核的源代码中,可以看到 Linux 内核源代码的编码风格说明。UNIX 系统的一个特点是设计精巧,并遵守积木式原则。C 语言最初来自 UNIX操作系统,与 UNIX 的设计原则一样, C 语言被广泛认可和使用的一个重要原因是它的灵活性以及简洁性。因此,在利用 C 语言编写程序时,始终应当符合其简洁的设计原则,而不应当使用非常复杂的变量命名方法。C 语言编程代码格式要点如下:
缩进时,使用长度为 8 个字符宽的 Tab 键。如果程序的缩进超过 3 级,则应考虑重新设计程序。
大括号的位置。除函数的定义体外,应当将左大括号放在行尾,而将右大括号放在行首 。函数的定义体应将左右大括号放在行首。对变量名,不赞成使用大小写混写的形式,但鼓励使用描述性的名称;尽可能不使用全局变量;不采用匈牙利命名法表示变量的类型;采用短小精悍的名称表示局部变量;保持函数短小,从而避免使用过多的局部变量。保持函数短小精悍。不应过分强调注释的作用,应尽量采用好的编码风格而不是添加过多的注释。函数函数应该短小而迷人,而且它只作一件事情,并且只作一件事情,而且将它做好。一个函数的最大长度和函数的复杂程度以及缩进大小成反比。于是,如果你已经写了简单但长度较长的的函数,而且你已经对不同的情况做了很多很小的事情,写一个更长一点的函数也是无所谓的。然而,假如你要写一个很复杂的函数,而且你已经估计到假如一般人读这个函数,他可能都不知道这个函数在说些什么,这个时候,使用具有描述性名字的有帮助的函数。另外一个需要考虑的是局部变量的数量。他们不应该超过5-10个,否则你有可能会出错。重新考虑这个函数,将他们分割成更小的函数。
注释是一件很好的事情,但是过多的注释也是危险的,不要试图区解释你的代码是注释如何如何的好,你应该将代码写得更好,而不是花费大量的时间去解释那些糟糕的代码。
2 C语言中容易出现的问题
C语言由于语法检查不是很严格,所以程序的编写过程中它会出现一些你意想不到的问题。下面举一些简单的例子来说明这一点。
2.1 赋值语句与比较语句容易出现混淆
我们举一个简单的例子:
如果x等于y,则打印。我们有时候会写成
(x=y) printf();
这实际上把比较语句和赋值语句混淆起来了,真正的语句应该写成这样
(x==y) printf();
2.2 逻辑与(&&)和二进制与(&)运算之间的区别
逻辑运算,就是“布尔代数”意义上的运算。运算结果只有两种情况,0和非0,即false与true。从中可以建立起一种判断逻辑表达式是否为“真”的语句。而按位运算,则是二进制意义上的运算。
如(11)十进制=(1011)二进制
(5)十进制=(0101)二进制
则11 & 5为
1011
&0101
=(0001)二进制=(1)十进制
逻辑或(||)和二进制或(|)运算与上述相同。
2.3 自加或自减
简单的来说,++i 和 i++,在单独使用时,就是 i=i+1。
而 a = ++i,相当于 i=i+1; a = i;
而 a = i++,相当于 a = i; i=i+1;
i++ 是先赋值后加减,++i 是先加减后赋值。所以我们在使用自加或自减进行赋值时,一定要注意变量使用的先后次序。
C语言编程时的注意事项还有很多,这里由于篇幅的原因就不再一一列举了。
3 “净室”化的程序设计方法
净室(Cleanroom,无尘室或洁净室)是指一个具有低污染水平的环境,这里所指的污染来源有灰尘、空气传播的微生物、悬浮颗粒和化学挥发性气体。更准确地讲,一个净室具有一个受控的污染级别,污染级别可用每立方米的颗粒数,或者用最大颗粒大小来厘定的。净室被广泛地应用在对环境污染特别敏感的行业,例如半导体生产、生化技术、生物技术等。我们这里为了提高软件编程的水平引入了净室软件工程的方法,总体说来是采用传统的软件工程建模、形式化方法、程序验证(正确性证明)以及统计SQA的集成使用已经组合成一种可以导致极高质量软件的技术。净室软件工程(Cleanroom software engineering)是一种在软件开发过程中强调在软件中建立正确性的需要的方法用来代替传统的分析、设计、编码、测试和调试周期。净室软件工程的哲学是:通过在第一次正确地书写代码增量并在测试前验证它们的正确性来避免对成本很高的错误消除过程的依赖。它的过程模型是在代码增量积聚到系统的过程的同时进行代码增量的统计质量验证。净室方法在很多方面将软件工程提升到另一个层次。
净室过程强调在规约和设计上的严格性,以及使用基于数学的正确性证明来对结果设计模型的每个元素进行形式化验证。作为对形式化方法中采用的方法的扩展,净室方法还强调统计质量控制技术,包括基于客户对软件预期的使用的测试。当现实世界中软件失败时,则充满了立即的和长期的危险。这些危险可能和人的安全、经济损失、或业务和社会基础设施的有效运作相关。净室软件工程是一个过程模型,它在可能产生严重的危险前消除错误。
净室方法使用增量软件模型的一个专门版本。一个“软件增量的流水线”被若干小的、独立的软件工程小组开发,一旦每个增量被认证通过,它将被集成为一个整体。因此,系统的功能随时间增加。开发一个采用增量策略的项目计划,建立每个增量的功能、它的项目大小、以及净室开发进度表。必须特别小心以保证通过认证的增量将被定时集成。使用一个运用盒结构的规约方法来描述功能规约。盒结构“在每一个精化级别上分离和分开行为、数据及过程的创造性定义”。使用盒结构方法,净室设计是规约的自然的无缝的扩展。
4 严密的测试方法
净室过程的测试方法描述通过箱式结构和统计质量验证(statistical quality certification)箱式结构来完成的。它是通过形式化方法来保证证软件是完美无缺陷的。它是将程序的初始状态、运行状态和结果以状态图的形式表出,它能够很严格发现程序运行中出现的问题。在程序完成后进行测试,其主要是测试质量,次要目的是发现那些在验证中没有被发现的缺陷。这种程序验证由程序员本人完成是不够的,应该由小组成员在验证回顾会议上进行验证。合理的验证小组成员3-8人,特别是新程序员要参加讨论,主持者最重要的任务是使团队的每一个成员都理解验证每一步并同意其正确性。
验证的主要目的是:
a 是否程序做了不合理的假设;
b 是忘记了编程语言中的某些细节;
c 是否忽略了某些程序逻辑中的可疑部分。
通过这种方式用全新的眼光来看待工作,他们常常会提出自己发现不了的问题。
验证的方式上可以采用“黑盒”、“ 白盒”或“灰盒”的检查模式。
黑盒测试也称功能测试或数据驱动测试,它是在已知产品所应具有的功能,通过测试来检测每个功能是否都能正常使用,在测试时,把程序看作一个不能打开的黑盆子,在完全不考虑程序内部结构和内部特性的情况下,测试者在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数锯而产生正确的输出信息,并且保持外部信息(如数据库或文件)的完整性。
黑盒测试方法主要有等价类划分、边值分析、因—果图、错误推测等,主要用于软件确认测试。“黑盒”法着眼于程序外部结构、不考虑内部逻辑结构、针对软件界面和软件功能进行测试。“黑盒”法是穷举输入测试,只有把所有可能的输入都作为测试情况使用,才能以这种方法查出程序中所有的错误。实际上测试情况有无穷多个,人们不仅要测试所有合法的输入,而且还要对那些不合法但是可能的输入进行测试。
白盒测试也称结构测试或逻辑驱动测试,它是知道产品内部工作过程,可通过测试来检测产品内部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都有能按预定要求正确工作,而不顾它的功能,白盒测试的主要方法有逻辑驱动、基路测试等,主要用于软件验证。 “白盒”法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。“白盒”法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。贯穿程序的独立路径数是天文数字。但即使每条路径都测试了仍然可能有错误。第一,穷举路径测试决不能查出程序违反了设计规范,即程序本身是个错误的程序。第二,穷举路径测试不可能查出程序中因遗漏路径而出错。第三,穷举路径测试可能发现不了一些与数据相关的错误。
灰盒测试,是介于二者之间的。灰盒测试关注输出对于输入的正确性,同时也关注内部表现,但这种关注不象白盒那样详细、完整,只是通过一些表征性的现象、事件、标志来判断内部的运行状态,有时候输出是正确的,但内部其实已经错误了,这种情况非常多,如果每次都通过白盒测试来操作,效率会很低,因此需要采取这样的一种灰盒的方法。灰盒测试结合了白盒测试盒黑盒测试的要素。它考虑了用户端、特定的系统知识和操作环境。它在系统组件的协同性环境中评价应用软件的设计。灰盒测试由方法和工具组成,这些方法和工具取材于应用程序的内部知识盒与之交互的环境,能够用于黑盒测试以增强测试效率、错误发现和错误分析的效率。
在程序测试阶段可根据实际情况选择不同的具体的测试方法。
5 总结
本文通过C语言编程中的编程规范、易出错的地方和用净室的方法来提高C语言的编程质量,提高软件开发的效率。净室方法是一种理论性强的编程方法,严格按照此方法进行编程是很多程序员难以达到的,本文将这种方法用以提高C语言编程质量是一种尝试,供广大编程爱好者借鉴。
参考文献
[1]斯蒂夫里.零缺陷程序设计[M].夏昕,王尧,译.北京:机械工业出版社,2003.
[2]佩腾.软件测试[M].张小松,等译.北京:机械工业出版社,2006.
[3]张芳妮,吕波.语言编程常见问题解答[M].北京:清华大学出版社,1996.
[4]谭浩强.C语言程序设计[M].北京:清华大学出版社,2000。