今天早些时候我尝试重构一些代码时遇到了一个有趣的情况。返回值是一个字符串,然后在调用类方法内进行比较。
字符串比较昂贵我发现返回值可能是一个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
并让回调传递给字符串但是代码不再松散耦合。
答案 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
模型将是最佳解决方案,因为异常(希望)很少发生,而不是发生在定期。那么,为什么在不常用的情况下,为了维护(创建,复制,销毁)字符串而增加公共代码的负担呢?