"single assignment"与"no early return"

"single assignment" vs "no early return"

本文关键字:early return no single assignment      更新时间:2023-10-16

我有一个很难理解的算法,所以我把它以对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);

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

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

对于C代码来说,避免使用多个返回来清除整个函数中的重复是非常有用的。这正是Linux内核使用的风格。

一种方法是将算法重构为多个函数,以便将返回时应该遗漏的代码放入新函数中,并颠倒测试。(然而,毫无例外,我怀疑这比你的原始代码要差一些)

所以原始

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;
}

不确定这是否属于"规避客户需求"类别,但您可以使用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;      
}

我认为这是唯一可以接受goto的结构之一。与其返回,不如给变量赋值,然后用return语句转到方法的末尾。