一、需求描述
在项目开发过程中,有很多通用的代码,可以抽取出宏定义来简化代码。
比如我最近在做一个滤镜的项目时候,很多基本的调色代码都类似,如下所示,就可以抽取通用的代码。
1.1 原有代码
if(strcmp(buffer, "brightness") == 0)
{
float intensity;
if(sscanf(pstr, "%f", &intensity) != 1)
{
LOGE("Invalid Parameters: %s\n", pstr)
return nullptr;
}
auto* bp = new AdjustBrightness();
bp->setIntensity(intensity);
proc = bp;
}
else if(strcmp(buffer, "contrast") == 0)
{
float intensity;
if(sscanf(pstr, "%f", &intensity) != 1)
{
LOGE("Invalid Parameters: %s\n", pstr)
return nullptr;
}
auto* bp = new AdjustContrast();
bp->setIntensity(intensity);
proc = bp;
}
else if(xxxx){
xxxx
}
1.2 使用#define定义
#define ADJUSTHELP_COMMON_FUNC(str, procName, setFunc) \
do{
\
float intensity;\
if(sscanf(str, "%f", &intensity) != 1)\
{
\
LOGE("Invalid Parameters: %s\n", str) \
return nullptr;\
}\
procName* bp = new procName();\
proc = bp;\
bp->setFunc(intensity);\
}while(0)
第一个参数
str
是字符串
第二个参数procName
是类名
第三个参数setFunc
是方法名
关键是要在每一个换行的时候加上一个\
,用do{}while(0)
语句包含多语句防止错误 ,代码就只会执行一次。
1.3 改造代码
if(strcmp(buffer, "brightness") == 0)
{
ADJUSTHELP_COMMON_FUNC(pstr, AdjustBrightness, setIntensity);
}
else if(strcmp(buffer, "contrast") == 0)
{
ADJUSTHELP_COMMON_FUNC(pstr, AdjustContrast, setIntensity);
}
else if(strcmp(buffer, "exposure") == 0)
{
ADJUSTHELP_COMMON_FUNC(pstr, AdjustExposure, setIntensity);
}
else if(strcmp(buffer, "hue") == 0)
{
ADJUSTHELP_COMMON_FUNC(pstr, AdjustHue, setIntensity);
}
else if(strcmp(buffer, "saturation") == 0)
{
ADJUSTHELP_COMMON_FUNC(pstr, AdjustSaturation, setIntensity);
}
else if(strcmp(buffer, "sharpen") == 0)
{
ADJUSTHELP_COMMON_FUNC(pstr, AdjustSharpenOrBlur, setSharpenIntensity);
}
else if(strcmp(buffer, "blur") == 0)
{
ADJUSTHELP_COMMON_FUNC(pstr, AdjustSharpenOrBlur, setBlurIntensity);
}
else{
LOGE("Invalid Parameters: %s\n", pstr)
}
这样代码就可以抽取很通用的代码逻辑出去,精简代码。
1.4 更多示例
1.4.1 调用两个方法
比如,我们的代码需要调用两个不同的方法,那么可以参考类似的代码
#define ADJUSTHELP_COMMON_FUNC2(str, procName, setFunc1, setFunc2) \
do{
\
float intensity1, intensity2;\
if(sscanf(str, "%f%*c%f", &intensity1, &intensity2) != 2)\
{
\
LOG_ERROR_PARAM(str);\
return nullptr;\
}\
procName* bp = new procName();\
if(!bp->init())\
{
\
delete bp;\
}\
else \
{
\
proc = bp;\
bp->setFunc1(intensity1);\
bp->setFunc2(intensity2);\
}\
}while(0)
1.4.1 调用三个方法
#define ADJUSTHELP_COMMON_FUNC3(str, procName, setFunc1, setFunc2, setFunc3) \
do{
\
float intensity1, intensity2, intensity3;\
if(sscanf(str, "%f%*c%f%*c%f", &intensity1, &intensity2, &intensity3) != 3)\
{
\
LOG_ERROR_PARAM(str);\
return nullptr;\
}\
procName* bp = new procName();\
if(!bp->init())\
{
\
delete bp;\
}\
else \
{
\
proc = bp;\
bp->setFunc1(intensity1);\
bp->setFunc2(intensity2);\
bp->setFunc3(intensity3);\
}\
}while(0)
1.5 其他实现
C++还可以使用template来实现类似的效果,这里就不写了。