WEB开发网
开发学院软件开发VC 高效开发与彻底测试 阅读

高效开发与彻底测试

 2010-09-04 20:48:16 来源:WEB开发网   
核心提示:下面以实例来进一步分析三种调试方式的优缺点,这里所用的示例是范例项目中的CExFunction::ParseOneParameter()函数,高效开发与彻底测试(3),这是一个很普通的函数,读者也可以随便拿其他有些复杂度的代码来比较,自 已尝试并对比一下,可以拿任何有一定复杂度的代码编写来对比,该函数的功能是解析C++

下面以实例来进一步分析三种调试方式的优缺点。这里所用的示例是范例项目中的CExFunction::ParseOneParameter()函数,这是一个很普通的函数,读者也可以随便拿其他有些复杂度的代码来比较。该函数的功能是解析C++代码中的一个参数,原形如下:

PARAMETER* CExFunction::ParseOneParameter(CTokenList& iList);

PARAMETER 是保存一个参数对象的结构,定义如下:

struct PARAMETER
{
CString type; //参数类型
CString name; //参数名
CString defVal; //缺省值
CString array; //如果参数是数组,保存[]及[]内的文字常量
};

参数iList是一个输入参数(范例的命名规则是用i表示输入参数),传递由C++代码中的一个参数经过词法分析转换获得的记号对象序列,例如参数int* pi,将转换为三个记号对象,分别对应于:int, *, pi。该函数将记号对象序列解析到一个PARAMETER结构的指针中,并作为返回值返回。

在这个示例中,如果要进行比较全面的调试,输入至少要考虑以下可能:

普通输入,如int i;

类型中有符号,如int* pi;

类型中有多个符号,如int*& pi;

模板类,如CList<int, int> list;

带缺省值,如int i=0;

数组,如int ai[10];

类型有多个单词,如const unsigned int& i;

缺少参数名,如const int;

我们在编写这个函数的实现代码前,首先建立调试驱动,以例边编码边执行调试。

自然驱动

假设界面和要调用这个函数的其他代码都已完成。在函数的入口处插入断点,以调试方式运行工程,在界面中选择要生成文档的工程目录,点击"生成文档",程序中断时就可以调试了。这种方式相信所有程序员都很熟悉,并且很多人都会认为这种方式最省时,但实际上,这种方式只是开头省时,当你试图把各个可能输入都调试一遍,就会发现它很费时:可能输入通常分散分布于输入源中(这里的输入源是代码文件),如果要比较全面地调试,通常要整理输入源,否则几乎不可能全面地调试,也就是说,要全面地调试,仍然要费时间整理输入,并不能完全依赖自然输入;

要针对某种输入进行调试,例如要调试参数带有缺省值的情形,一般通过反复跟踪直到想要的输入出现,或者设置条件断点拦截所需要输入,反复跟踪当然费时不少,设置条件断点也是要花时间的,并且有时无法满足需要 ,很多时候,要针对特殊输入进行调试都是很大费时的;

由于是公共输入源,输入数据很难管理,尤其是条件断点更不可能无限期地保存,以后需要再次调试时可能要做很多重复工作。

如上所述,自然驱动并不省时,不过这种方式的时间消耗隐藏在调试过程中,通常不会引起重视,其实"隐藏于调试过程中",其成本更大,因为分散了开发人员的注意力,影响思维的连续性。

自然驱动的更主要问题是不全面,开发人员常常会将思维局限于现有的输入源,导致一些可能输入根本就没有考虑到,在本例中,很可能只是试一下解析一两个文件,检查得到的结果是否正确,如果文件中没有 带数组的参数,那这种输入很可能就被忽略掉。这种不全面,导致代码功能不齐,健壮性差,后期测试和维护成本居高不下,甚至导致项目的失败,因此,这是看起来高效,实际上很低效的方式,读者可以在看完后面两种方式的介绍后,自 已尝试并对比一下,可以拿任何有一定复杂度的代码编写来对比,不局限于这里所举的例子。

上一页  1 2 3 4 5 6 7 8  下一页

Tags:高效 开发 彻底

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接