“单一任务”与“没有早期回归”

时间:2012-11-19 16:22:48

标签: c++ coding-style return const

我有一个很难理解的算法,所以我把它写成const变量的单一赋值形式,在解释我为什么这样做之间有很多评论。每当算法拒绝解决方案时,return语句都会导致。

另一方面,客户要求该方法没有“早期”返回语句,这是一个有点冲突的目标,因为在这种情况下我可以使用const变量的唯一方法是嵌套if块。

是否有一个优雅的解决方案,可以让我充分利用两个世界 - 如果变量在范围内并且仍然是一个有点平坦的层次结构,那么这些变量是有效的吗?

编辑:客户也对异常和goto表示不满。这是一条热门途径,实施决策树,确定解决方案生成器提出的解决方案是否可接受,并且比先前的解决方案更好。

嵌套ifs的范围看起来像

if(fulfills_condition_1(sol)) {
    double const some_quality = quality_function_1(sol);
    double const normalized_quality = normalize_quality_1(some_quality);
    if(fulfills_condition_2(normalized_quality) {
    {
        double const another_quality = ...
    }
}

我目前的做法是

if(!fulfills_condition_1(sol))
    return;
double const some_quality = quality_function_1(sol);
double const normalized_quality = normalize_quality_1(some_quality);
if(!fulfills_condition_2(normalized_quality) {
    return;

...

update_current_solution(sol);

4 个答案:

答案 0 :(得分:5)

  

另一方面,客户要求该方法没有“早期”退货声明

如果使用析构函数进行清理,这个要求不会使代码在C ++世界中变得更好,就像在C ++中通常应该这样。

只有C代码才能避免在具有多个返回的函数中清除重复。这正是用于Linux内核的风格。

答案 1 :(得分:1)

一种方法是将算法重构为多个函数,以便返回时应该丢失的代码被放入一个新函数中并且测试被反转。 (但是没有例外,我怀疑这不如你的原始代码那么优雅)

原创

T algorithm_fn() {
  T result;
  ...
  if (x) {
    return result;
  }
  //do more
}

变为

T new_func( // the const parameters ) {
    //do more
}

T algorithm_fn() {
  T result;
  ...
  if (!x) {
     result = new_func( // the const parameters );
  }
  return result;
}

答案 2 :(得分:1)

不确定这是否属于“规避客户要求”类别,但您可以使用do / while循环来突破您只想运行一次的代码块。

int foo()
{
    int value = 0;
    do
    {           
       if ( condition1 ) { ... }
       else { break; }
       if ( condition2 ) { ... }
       else { break; }
    } while ( false )  // the do/while loop is only run through once.

    // do whatever clean up etc is needed.

    return value;      
 }

答案 3 :(得分:-1)

我认为这是goto可接受的唯一结构之一。 而不是返回,将返回值赋给变量,而不是使用return语句转到方法的结尾。