今天想分享的小技巧是如何利用结构体嵌套,使得底层代码与应用层代码耦合性降低。
首先创建一个函数指针,用于底层函数。
typedef bool(* const Validate)(void* pThis, int value);
创建两个应用函数,一个是范围值校验函数,一个是偶校验函数。
bool validateRange(Validator* pThis, int value)
{
RangeValidator* pValidator = (RangeValidator*)pThis;
return pValidator->min <= value && value <= pValidator->max;
}
bool validateOddEven(Validator* pThis, int value)
{
OddEvenValidator *pOddEvenValidator = (OddEvenValidator*)pThis;
return (!pOddEvenValidator->isEven && (value % 2)) || (pOddEvenValidator->isEven && !(value % 2));
}
重点来了,创建两个结构体用于调用这两个函数。
typedef struct _Validator
{
bool (*const validate)(struct _Validator* pThis, int value); //函数指针
}Validator;
typedef struct
{
Validator via;
const int min;
const int max;
}RangeValidator;
typedef struct
{
Validator via;
bool isEven;
}OddEvenValidator;
然后底层创建一个泛化型函数,适用于所有需要调用的函数:
bool RangeCheck(void * pValidator, int value)
{
Validate validate = *((Validate*)pValidator);//泛型化
return validate(pValidator, value);
}
在主函数中应用:
int main(void)
{
bool a = 0;
bool b = 0;
RangeValidator validate = newRangeValidator(2,10);
a = RangeCheck(&validate, 5);
OddEvenValidator validate2 = newOddRangeValidator(4);
b = RangeCheck(&validate2, 2);
if (true == a)
{
printf("success!\n");
}
else
{
printf("Fail!\n");
}
if (true == b)
{
printf("success!\n");
}
else
{
printf("Fail\n");
}
}
如此一来,只需要修改或者增加应用层的代码,就可以了,这也降低了应用层和底层的耦合性!!