高质量程序设计

如果不懂得如何有效地提高软件质量,项目会付出很高的代价,你(开发人员)不仅没有功劳,也没人欣赏你的苦劳,你拥有最多的将只是疲劳。

开发人员只有在自己思路清晰的时候才可能写出让别人易读、易理解的程序和文档。可理解的东西通常是简洁的。一个原始问题可能很复杂,但高水平的人就能够把软件系统设计得很简洁。如果软件系统臃肿不堪,它迟早会出问题。所以简洁是人们对工作“精益求精”的结果,而不是潦草应付的结果。

测试经验谈:

        ✧ 测试能提高软件的质量,但是提高质量不能依赖测试。

        ✧ 测试只能证明缺陷存在,不能证明缺陷不存在。“彻底地测试”难以成为现实,要考虑时间、费用等限制,不允许无休止地测试。我们只好祈祷:软件的缺陷在产品被淘汰之前一直没有机会发作!

        ✧ 测试的主要困难是不知道如何进行有效的测试,也不知道什么时候可以放心地结束测试。

        ✧ 每个开发人员应当测试自己的程序(分内之事),但是不能作为该程序已经通过测试的依据(所以项目才需要独立的测试人员)。

        ✧ 2-8原则:80的缺陷聚集在20的模块中,经常出错的模块改错后还会经常出错。

 

现提出以下编程原则(实时更新):

        1、凡是功能开发的代码,必须有相应的文档。文档中应简述该代码的实现思路以及功能。代码中要有相应的注释,尤其是全局变量、函数、结构体、类成员、以及复杂的逻辑运算等。文件头也需要有相关的说明。

        2、所有的变量(无论是全局变量还是局部变量或静态变量等)都应该进行初始化。

        3、全局变量的初始值不要依赖定义于另一个编译单元中的全局变量的初始值。这是因为:虽然编译器和连接器可以决定同一个编译单元中定义的全局变量的初始化顺序保持与它们定义的先后顺序一致,但是却无法决定当两个编译单元连接在一起时哪一个的全局变量的初始化先于另一个编译单元的全局变量的初始化。

        4、所有宏定义的单词、字母必须大写。

        5、所有变量、函数、类、宏定义等命名必须清晰明了、有意义(不限定命名方式),命名必须为完整的单词或者通用的单词缩写。要遵循“用最短的名字包含最多的信息量”的原则。

        6、避免使用前导“_”和“__”来定义你自己的标识符,因为语言及其实现使用它来定义一些内部名称或预定义的宏,因此如果你也使用它,就有可能造成命名冲突。

        7、在不同的实现下true的值可能不一致。但是false的值是确定的,因此应该总是和false比较,建议不要将布尔变量flag直接与true或者1、-1、0等进行比较。正确使用:

int func(bool bFlag)
{
    if(bFlag != false)
    {
        ...
    }
    else
    {
        ...
    }
    /*
    if(bFlag)   整型变量应该避免这种使用方法
    {
        ...
    }
    else
    {
        ...
    }
    */
}

        8、禁止直接用“==”或“!=”对两个浮点数进行比较。

        9、进行相等、不等判断的时候,建议将值写在左边,变量写在右边,避免少写等号而出错。(nullptr = p不合法,但p = nullptr合法且总成立)

        10、switch的效率比if/else结构高,这正是switch语句存在的理由。所以当选择条件过多时,应尽可能使用switch。切记:不要忘记最后那个default子句。即使程序真的不需要default处理,也应该保留语句default : break;,这样做并非多此一举,而是为了防止别人误以为你忘了default处理,以及出于清晰性和完整性的考虑。

        11、不要在循环体内修改循环变量——除了循环控制变量的递增递减,防止循环失去控制,尤其是for循环。

        12、C++/C是以“先行后列”的顺序来连续存储数组元素,就C++/C多维数组来说,“先行后列”遍历效率肯定好于“先列后行”遍历,不管其行数远大于列数还是情况相反甚至接近,即使在最坏的情况下也至少与“先列后行”遍历的效率相当。影响效率的实际上主要是大型数组导致的内存页面交换次数以及cache命中率的高低,而不是循环次数本身。

        13、少用、慎用goto语句,但不禁用。

        14、应尽量使用const来定义符号常量,而不是宏,包括字符串常量。

        15、函数参数必须遵循:输出参数放在前面,输入参数放在后面,并且不要交叉出现输入输出参数。(如标准函数strcpy(输出参数,输入参数))。

        16、应避免函数有太多的参数,参数个数尽量控制在5个以内。如果参数太多,在使用时容易将参数类型和顺序搞错。此时,可以将这些参数封装为一个对象并采用地址传递或引用传递方式。

        17、 函数的功能要单一,即一个函数只完成一件事情。

        18、建议尽量少用static局部变量,除非必须。这可能会导致函数具有“记忆”特性,带有“记忆”功能的函数,其行为可能是不可预测的,因为它的行为可能取决于某种“记忆状态”。这样的函数既不易于理解又不利于测试和维护。

        19、对于赋值给值为‘空’的变量。整数用0,实数用0.0,字符(串)用\0,指针用nullptr/NULL。

        20、内联函数不允许超过20行。

        21、不允许把多个短语句写在一行中,即一行只写一条语句。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值