【发布时间】:2013-04-30 17:40:09
【问题描述】:
将业务逻辑功能实现为宏是个好主意吗?
我继承了一些遗留的 C++ 代码,我发现很多业务逻辑功能都是用长而神秘的宏来实现的。
宏比函数有优势吗? 使用宏的一般原理是什么?
哪种逻辑最适合宏?
这是一个简单的代码示例
#define INSERT_VALUES(IN,ID,EO) {\
double evaluationOutput = EO;\
int controls = 0;\
int input_controls = m_input_controls[IN];\
if(m_value_list[IN].ShouldProcess())\
{\
evaluationOutput = m_evaluationOutput[IN];\
controls = m_controls[IN];\
}\
VALUE_EXIST(evaluationOutput,controls,input_controls,IN,ID,Adj);\
m_evaluationOutput[IN] = controls > 0 ? evaluationOutput : 0.0;\
m_controls[IN] = controls;\
m_input_controls[IN] = input_controls;\
}
【问题讨论】:
-
很少需要宏——过度使用宏是一种“代码味道”。
-
从你继承的代码中,你的判断调用是什么?宏是否有用?
-
宏是隐藏一些杂乱/样板/重复代码的有用快捷方式。一个例子是通过短的(可能是参数化的)宏在类中生成一些常见的声明。然而,就业务逻辑而言,通过适当利用 C++ 武器库(模板、函数重载等)来实现简洁、可读和安全的代码,可以做得更好。所以,一般来说,答案是:否。
-
你确定是 C++ 代码,而不是 C?
-
是的,代码一直是 C++。在我的情况下,宏的使用是用于业务逻辑(如果 a> b 然后执行 c 或填充数组等),而不是用于条件编译。许多函数也被定义为#define MY_MACROS(A,B,C,D) GET##A() 然后它继续下去。