提前认识软件开发(16) 如何对程序进行优化2015-01-24对程序进行优化,是软件开发工程师必然会涉及到的问题。那么为什么要对程序进行优化呢?原因有以下几个:第一,在原程序基础之上新增、删除或修改了功能,需要改变原程序流程。客户需求随时可能会变化,今天已经实现的功能,说不定明天就要修改或去掉。落实到程序上面,就需要我们随时准备对写好的代码进行修改,而不要奢望写好之后就永远不要动了。第二,原程序有bug。这类情况出现得非常的频繁,很多软件有1.0、2.0、3.0等版本,部分原因就是前面版本中程序有问题,在修改程序的过程中使得软件版本不断升级。第三,原程序效率较低或不便于阅读,对程序进行优化之后可提高效率或更易于阅读。在软件项目中,对每个函数包含的代码行数都有一定的规定,如果超出了规定的行数,就要考虑对代码进行优化,将部分函数提取出来单独写成一个函数。有关程序优化,我们要遵循以下两个原则:第一,“小步快跑”原则。这个原则是指每修改一点点就对程序进行测试,测试通过之后再修改一点点,再进行测试。如此不断地循环下去,直到程序修改完成并测试通过。这样可以确保程序功能的正确性,减少后期重大变更所带来的成本。第二,“两顶帽子”原则。一顶是只重构代码而不新增功能,一顶是增加新的功能以实现新需求。即如果发现原程序存在诸多问题,需要先进行优化后再添加新的功能,那么第一步就优化原代码而不增加新功能,第二步在新代码的基础之上添加新代码以实现新功能。本文以一个实际的程序为例,详细介绍如何对程序代码进行优化。1.优化之前的程序本程序实现将输入字符串中的大写字母变成小写字母的功能,具体代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h>void main() { char s[100]; unsigned inti;scanf("%s", s); for(i=0; i<strlen(s);i++){ s[i]=tolower(s[i]); } printf("%s
", s); }
可以看出,本程序存在如下问题:(1)代码排版不工整且无注释。(2)变量命名不规范,且在定义的同时没有进行初始化。(3)代码缩进不规范,for语句的书写不规范。(4)对于输入和输出,没有相应的文字提醒。(5)对于大写转换为小写的功能,可考虑封装为一个函数,利于阅读和其它的模块调用。可以看出,虽然程序能够实现基本的功能,但并非最优的。以下我们将逐步对代码进行优化。2.对代码进行优化Step 1:重新对程序排版,并添加注释对于排版不工整且注释过少的代码,优化的第一步就是规范排版并添加必要的注释。排版的规则是“{}”之内的语句相对于“{}”要缩进4个空格,同级的代码要对齐。在程序的头部、函数的头部及关键语句处要添加注释。修改之后的代码如下所示:
/********************************************************************** *版权所有 (C)2014, Zhou Zhaoxiong。 * *文件名称: StrToLowerCase.c *文件标识:无 *内容摘要:将输入字符串中的大写字母变成小写字母 *其它说明:无 *当前版本: V1.0 *作者: Zhou Zhaoxiong *完成日期: 20140426 * *修改记录1://修改历史记录,包括修改日期、版本号、修改人及修改内容 *修改日期: 20140426 *版本号: V1.0 *修改人: Zhou Zhaoxiong *修改内容:创建 **********************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h>/********************************************************************** *功能描述:主函数 *输入参数:无 *输出参数:无 *返回值:无 *其它说明:无 *修改日期版本号修改人修改内容 * ---------------------------------------------------------------------------------------------- *20140426V1.0 Zhou Zhaoxiong创建 ***********************************************************************/ void main() { char s[100]; unsigned inti;printf("Input the source string: "); scanf("%s", s);//读入原始字符串for (i = 0; i < strlen(s); i ++) { s[i] = tolower(s[i]); //将字符串中的大写字母变成小写字母,其它字符不变 }printf("Output the destination string: %s
", s); //输出目的字符串 }