范围值检验函数
目标1
需要一个函数,用来判定当前value,是否在给定的数值范围里。
实现1
bool range_check(int min, int max, int value)
{
return (min <= value && value >= max);
}
//调用方式
bool ret = range_check(0,9,6);
思考:能不简化一下函数参数?
最理想的函数参数个数是0,其次是1个参数,再次就是双参数函数,避免三个参数以上的情况出现。
减少函数参数的最佳方法是一个函数只做一件事,要么do something,要么return something.
实现2
typedef struct
{
const int min;
const int max;
}range_t;
bool range_check(range_t *p_range, int value)
{
return (p_range->min <= value && value >= p_range->max);
}
//调用方式
range_t range = {.min=0,.max=9};
bool ret = range_check(&range, 6);
目标2
需要一个函数对value进行判断是奇数还是偶数
typedef struct
{
bool is_even;
}odd_even_t;
bool odd_even_check(odd_even_t *p_odd_even, int value)
{
return (!p_odd_even->is_even && (value % 2)) || (p_odd_even->is_even && !(value%2));
}
目标3
写出一个通用的校验接口,在具体使用时,由用户决定使用哪个函数
分析
上面写的校验器,有共同的函数声明模式,将不同的数据指针可以统一成通用指针void *p_data
故有
bool validator(void *p_data, int value)
同时,具体的执行函数接口也需要改造
bool range_check(void *p_data, int value)
{
range_t *p_range = p_data;
return (p_range->min <= value && value <= p_range->max);
}
bool odd_even_check(void *p_data, int value)
{
odd_even_t *p_odd_even = p_data;
return (!p_odd_even->is_even && (value % 2)) || (p_odd_even->is_even && !(value%2));
}
使用方法如下:
typedef bool (*validator_t)(void *, int);
validator_t validator = NULL;
validator = range_check;
range_t range = {.min=0,.max=9};
bool ret = validator(&range, 6);