我有一个很难理解的算法,所以我把它写成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);
答案 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语句转到方法的结尾。