范围值检验函数

目标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);
posted @ 2021-06-16 16:34  海林的菜园子  阅读(183)  评论(0编辑  收藏  举报