codecamp

C++ 先决条件

通常当你写函数时会对接收的参数做了隐含的假设。如果这些假设成立,程序没有问题;如果假设不成立,你的程序可能就会崩溃了。
为了让你的程序更为健壮,将你的假设明确,以程序文档的方式写下来或写代码来进行检查。
比如我们观察calculateCartesian方法。是否存在对当前对象进行了假设呢?没错,我们假设极坐标系的标志量已经设置了并且mag和theta的值是有效的。如果假设不成立,那么这个函数的结果无意义。
一种做法是对函数添加注释说明先决条件以警告他人。

void Complex::calculateCartesian () 
// 先决条件:当前对象包含有效的极坐标值,其极坐标标志量已设定。
// 后置条件:当前对象包含有效的笛卡尔坐标系和极坐标系的值,两个标志量皆已设置。
{ 
        real = mag * cos (theta); 
        imag = mag * sin (theta); 
        cartesian = true; 
}   

同时,我添加了后置条件,即我们认为函数执行完毕后为真的事情。
这些注释对于阅读你代码的人很有用,但更好的办法是通过代码来检查先决条件,并输出合适的错误信息:

void Complex::calculateCartesian () 
{ 
        if (polar == false) { 
                cout << "calculateCartesian failed because the polar representation is invalid"  << endl; 
                exit (1); 
        } 
        real = mag * cos (theta); 
        imag = mag * sin (theta); 
        cartesian = true; 
} 

exit函数会使程序很快的退出执行。返回值是一个错误码以告诉系统(或该程序执行者)某些错误发生。
这种错误检测方式很是常见,于是C++提供了一个内置函数来检查先决条件并打印错误信息。如果你包含了assert.h头文件,你可以使用一个以布尔值或条件表达式为参数的assert函数。只要参数为真,assert函数就啥也不做。如果参数为假,assert打印一个错误信息并退出,用法如下:

void Complex::calculateCartesian () 
{ 
        assert (polar); 
        real = mag * cos (theta); 
        imag = mag * sin (theta); 
        cartesian = true; 
        assert (polar && cartesian); 
} 

第一句assert检查先决条件(事实上只是一部分先决条件),第二句assert检查后置条件。
在我的开发环境中,当一个断言失败时会得到以下信息:

Complex.cpp:63: void Complex::calculatePolar(): Assertion ‘cartesian’ failed.   
Abort  

信息中会有许多内容可以帮助我跟踪错误,包括文件名和断言失败的出错行,断言语句的内容和所在函数名。

C++ 不变式
C++ 私有函数
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }