实现一个健壮的函数
一个健壮的Fibonacci数列函数的实现
函数功能:
返回Fibonacci数列中的指定位置的元素;
1.基本函数的实现
代码如下:
int fibon_elem(int position)
{
int elem=1;
int n_1=1,n_2=1;
for(int ix=3;ix<=position;++ix)
{
elem=n_1+n_2;
n_1=n_2;
n_2=elem;
}
return elem;
}
分析:
函数满足了我们基本的功能,但实际上我们做了两个不合理的假设;
1).假设用户不会犯错,输入的均为合理的位置,不会出现输入零值或负值的情况
2).该位置上的数在int型整数的范围之内
实际上这些假设均是不合理的,也是不讲理的假设,我们不能想当然的认为函数会一切朝好的方向发展;
我们需要改进以实现更健壮的代码
2.健壮的代码和改进的方法
针对第一点的改进,在函数中检查不合理的位置,并对不合理的位置做相应的处理
//检查不合理的位置
if(pos<=0)
//....
这里尽量避免用exit(-1)这种暴力的谋杀的方式
方法1:
我们返回0值,标识用户输入一个不合理的位置,依据是0在Fibonacci数列中是一
个不合理的值;
问题:
我们假设用户知道0在Fibonacci数列中是一个不合理的值,但是"假设用户知
道"并非良好的工程原则,我们宁愿相信用户是无知的;
方法2:
改变返回值类型,使用户能够通过返回值知道函数是否计算出了用户想要的值
//重新修正函数原型
bool fibon_elem(int position, int &elem);
小技巧:
通过给函数传递引用类型的参数,实现函数提供返回两个或多个返回值
针对第二个不合理假设:
我们设置一个位置上界,检测保证用户输入的位置在合理的位置范围内
健壮的代码:
bool fibon_elem(int position, int &elem)
{
int n_1=1,n_2=1;
elem=1;
if (position<=0||position>=1024)
{
elem=0;
return false;
}
for(int ix=3;ix<=position; ++ix)
{
elem=n_1+n_2;
n_1=n_2;
n_2=elem;
}
return true;
}
总结:
编写函数时我们不但要考虑函数要实现的功能,而且要考虑函数本身的健壮性,
1.要能够处理用户不合理的输入;
2.要考虑函数中要处理的函数值在相应的类型范围内
函数健壮性通过
if(不合理)
//...
函数设计小技巧:
通过传入引用类型参数使函数有多个返回值
常用如:
bool func(int &elem);
返回布尔类型来判断函数是否正确执行,并将真正的返回值存储在elem中;