2

我有一个很难理解的算法,所以我以对const变量的单一赋值的形式把它写下来,中间有很多评论解释我为什么这样做。每当算法拒绝解决方案时,return就会引出一条语句。

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

是否有一个优雅的解决方案可以让我两全其美——如果变量在范围内并且仍然是一个有点扁平的层次结构,那么这些变量是有效的?

编辑:客户也对例外不满意,并且goto. 这是一条热门路径,实施决策树来确定解决方案生成器提出的解决方案是否既可接受又优于先前的解决方案。

嵌套 if 的作用域看起来像

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

4 回答 4

5

另一方面,客户要求该方法没有“早期”返回语句

这个要求并没有使 C++ 世界中的代码变得更好,只要使用析构函数进行清理,就像在 C++ 中通常应该那样。

它仅对 C 代码有用,以避免在具有多个返回的函数中清理重复。这正是用于 Linux 内核的风格。

于 2012-11-19T16:26:20.563 回答
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;      
 }
于 2012-11-19T16:41:09.237 回答
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;
}
于 2012-11-19T16:32:24.007 回答
-1

我想说这是唯一可以接受 goto 的结构之一。不是返回,而是将返回值分配给变量,而不是使用 return 语句转到方法的末尾。

于 2012-11-19T16:25:17.457 回答