从函数中获取返回状态和字符串

时间:2013-09-28 17:53:07

标签: c++

今天早些时候我尝试重构一些代码时遇到了一个有趣的情况。返回值是一个字符串,然后在调用类方法内进行比较。

字符串比较昂贵我发现返回值可能是一个bool,但是如果发生异常,该字符串也可用于日志记录。

所以我的一个选择就是将功能作为

bool result = a.f(&status_string, other_args);

然后使用status_string。

第二个选项:

std::pair<bool, string> result = a.f(other_args); 

还有第三种选择:

bool result = a.f(other_args) and then query for `a.get_status()` for the message. 

其中哪一个是最优雅的解决方案?或者可以通过a.f将回调传递给boost::bind并让回调传递给字符串但是代码不再松散耦合。

2 个答案:

答案 0 :(得分:0)

让我扩展上面的评论。

如果关于程序的逻辑,函数的结果是bool ean,你只需要记录状态消息,没有回复消息和让调用者的意思进行日志记录,因为它在界面中引入了无关的参数。

相反,让函数执行日志记录:

bool myfun(someobj s) {
  ...
  if (cond1) {
    logger.log(message);
    return false;
  }
  else
    return true;
}

关于这个问题的另一个观点是:为什么你需要有两个以上的消息字符串?如果你的函数有两个可能的结果,那么只记录两个可能的东西,在这种情况下,调用者可以很容易地处理它:

if (myfun(s)) {
  dostuff();
  logger.log(msg1);
}
else
  ...

如果有两个以上可能的结果,也许您根本不应该返回bool,而是enum?甚至使用异常处理?

答案 1 :(得分:0)

如果消息仅用于“如果存在异常”,则使用get_status模型将是最佳解决方案,因为异常(希望)很少发生,而不是发生在定期。那么,为什么在不常用的情况下,为了维护(创建,复制,销毁)字符串而增加公共代码的负担呢?