c++ - 使用标志、返回、异常、goto 或 break 中止过程
问题描述
我有一个代码可以解析文件并在满足无效条件时分解。代码在 C++ 中,如下所示:
bool ok = true;
if (task1() == false)
ok = false;
if (ok && (task2() == false))
ok = false;
if (ok && (task3() == false))
ok = false;
cleanup();
return ok;
现在我正在寻找更清洁的替代品以获得相同的结果。据我所知有:
- 使用上面代码中的标志和许多条件
- 对于相同的信息,有许多冗余测试。对运行时的影响可以忽略不计,并且可能完全被编译器删除,但它仍然使代码更加复杂。
- 您可以将任务包装在一个方法中并从中返回
- 这看起来更干净,但是您将代码分散在多个函数中。根据您的上下文,可能会有一长串参数。此外,在整个方法中分散回报也不是最好的。
- 你可以使用例外
- 这将提供一些描述性很强的代码,但它也很繁重,因为您只想跳过一些调用。此外,它可能并不完全是一个例外情况。
- 你可以
break
从一个do while(0)
或另一个循环或 switch 语句。- 好吧,它并不是真的适合这样的任务。除此之外,您还可以使用描述性关键字获得轻量级和紧凑的实现。
- 使用
goto
语句- 这似乎结合了大多数优点。不过,我不确定。人们到处都在说,打破多个循环是这个关键字唯一剩下的合理用途。
我没有找到有关此类代码的讨论。一般推荐哪些实现方式?是否在任何 C++ 编码指南中都提到了这种情况?还有其他实用的选择吗?
编辑:我的目标似乎并不明确。我正在寻找如何摆脱程序而不是调用三种方法的最佳方法。所描述的问题更多的是一个例子。我对支持和反对不同语法的论点感兴趣。
在对象的代码中,每个方法都是几个相似但彼此不同的代码行的占位符。可能有 50 个代码块。一个旧的代码块如下所示(我知道还有更多的东西需要优化,而不仅仅是这个问题的目标):
if (ok)
{
keyString = "speed";
tmpVal = configuration->getValue(section, keyString, -1);
if (tmpVal != -1)
{
m_speed = tmpVal;
if (m_speed < m_minSpeed)
m_minSpeed = m_speed;
m_needSpeed = true;
}
else if (m_needSpeed)
{
ok = false;
keyErr = keyString;
}
}
解决方案
假设所有这些函数都返回 a bool
,在我看来,所示代码在逻辑上与以下内容相同:
bool ok= task1() && task2() && task3();
cleanup();
return ok;
推荐阅读
- console - Atom Javascript 控制台
- javascript - 使用 vue-test-utils 在 Jasmine 测试中挂载一个简单的组件,得到“文档未定义”错误
- javascript - 将外部 javascript 包含到 Angular 中
- delphi - 为什么gdbserver没有部署在android64中?
- c++ - 如何正确处理继承(方法和指针)?
- django - 具有 id 属性的只读 Django ModelAdmin 表单字段
- mysql - 在查询中创建过程
- mysql - Mysql合并今年和去年最后一个季度的总结果?
- azure - 函数应用 EventhubTriggered Java,重试和失败
- typescript - Firebase 云功能单元测试超时