"single assignment"与"no early return"
"single assignment" vs "no early return"
我有一个很难理解的算法,所以我把它以对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语句转到方法的末尾。
相关文章:
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- C++函数中的精确"return"矩
- '[](std::list& list)<int>{return std::move(list)}(list)' 是否保证将 'list' 留空?
- 方法错误"not all control paths return a value"和方法不返回值
- GLFW glfwCreateWindowSurface return -7
- "Missing type specifier - int assumed"无法通过向主函数添加"return 0"来解决
- 如何解决类成员函数中的"return a value"错误?
- C++概念assignable_from不接受 const&-return 运算符=
- Malloc void return char 数组有时不起作用(Terry Davis 对 C++);
- 返回引用实例和非引用实例(return mystr & vs mystr)之间的区别是什么?
- 错误:调用 .. at return 语句时没有匹配函数
- 当你只使用 return 时,函数返回什么类型;在 c++ 中
- GLSL C++ glVertexAttribPointer & glDrawElements return GL_INVALID_OPERATION
- return ((fileatr & FILE_ATTRIBUTE_DIRECTORY) == 0);
- "Warning : No return statement in function returning non-void"是什么意思?
- 当出现错误ld return 1退出状态时,如何编译程序
- 使用flag、return、exception、goto或break中止过程
- 我一直收到错误"cannot convert 'float*' to 'float' in return"
- 如何解决g++问题"internal compiler error: Illegal instruction min() _GLIBCXX_USE_NOEXCEPT { return __FLT_MI
- "single assignment"与"no early return"