我正在C环境工作:
a)我们禁止使用异常
b)是应用/数据服务器代码,用于评估不同类型的请求
a)我们禁止使用异常
b)是应用/数据服务器代码,用于评估不同类型的请求
我有简单的类封装服务器操作的结果,也是内部使用的很多功能.
class OpResult { ..... bool succeeded(); bool Failed(); .... ... data error/result message ... };
当我尝试使所有的功能都小而简单时,就会出现很多这样的块:
.... OpResult result = some_(mostly check)function(....); if (result.Failed()) return result; ...
问题是,使宏观看起来像这样吗?
#define RETURN_IF_Failed(call) \ { \ OpResult result = call; \ if (result.Failed()) \ return result; \ }
解决方法
这是一个权衡.您正在交易代码大小来模糊逻辑.我更喜欢将逻辑保留为可见.
我不喜欢这种类型的宏,因为它们打破Intellisense(在Windows上)和程序逻辑的调试.尝试在函数中的所有10个返回语句上放置一个断点,而不是检查,只是返回.尝试逐步浏览宏中的代码.
最糟糕的一点是,一旦你接受这一点,很难反对一些程序员喜欢用于常见的迷你任务的30行怪物宏,因为他们澄清了事情.我已经看到代码,其中不同的异常类型由四个级联宏处理,导致源文件中的4行,宏实际上扩展到> 100条真线.现在,你是否减少代码膨胀?不可以用宏来容易地说出来.
反对宏的另一个一般论据即使在这里并不明显适用,也是能够将它们嵌套在难以破译的结果上,或传递引起奇怪但可编译的参数的参数.在使用参数两次的宏中使用x.我总是知道我在哪里站立的代码,我不能说一个宏.
编辑:我应该补充的一个意见是,如果你真的重复这个错误检查逻辑一遍又一遍,也许在代码中有重构机会.不是一个保证,但更好的方法减少代码膨胀,如果它适用.查找重复的调用序列,并将公共序列封装在自己的函数中,而不是解决每个调用如何单独处理.