实现一个健壮的函数

一个健壮的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中;

posted @ 2012-03-25 23:47  liuhao2638  阅读(253)  评论(0编辑  收藏  举报