0

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

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

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

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.fviaboost::bind并将该回调传递给字符串,但随后代码不再松散耦合。

4

2 回答 2

0

让我扩展我上面的评论。

如果就程序的逻辑而言,函数的结果是boolean 并且您只需要记录一条状态消息,那么返回消息并让调用者进行记录是没有意义的,因为它引入了不相关的参数在界面中。

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

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

这个问题的另一个观点是:为什么你需要有两个以上的消息字符串?如果您的函数有两种可能的结果,则只有两种可能的内容要记录,在这种情况下,调用者可以轻松处理:

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

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

于 2013-09-28T18:03:22.917 回答
0

如果仅在“出现异常时”使用消息,那么使用get_status模型将是最好的解决方案,因为异常是(希望)很少发生,而不是定期发生。那么,当它不常用时,为什么还要维护(创建、复制、销毁)字符串呢?

于 2013-09-28T18:05:26.837 回答