使用flag、return、exception、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;

现在我正在寻找更清洁的替代品来获得同样的结果。据我所见有:

  • 使用上面代码中的标志和许多条件
    • 对于相同的信息有许多冗余的测试。对运行时间的影响可以忽略不计,而且可能被编译器完全删除,但它仍然生成代码更复杂
  • 您可以将任务包装在一个方法中并从中返回
    • 这看起来更干净,但您将代码扩展为多个功能。根据您的具体情况参数列表。更多的是,它也不是最好在整个方法中分散回报
  • 你可以使用例外
    • 这将给出一些非常描述性的代码,但它也是因为你只是想跳过一些电话。更进一步这可能不是一个特例
  • 您可以从do while(0)或另一个循环中break或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;
}
}

假设所有这些函数都返回一个bool,在我看来,显示的代码在逻辑上与相同

bool ok= task1() && task2() && task3();
cleanup();
return ok;

最新更新