减少两个类似的功能以避免重复

时间:2019-11-10 01:04:08

标签: c

我有一个项目。在那个函数中,有些函数非常相似,因为差异只是计算的方法。一方面,我们使用平均计算,另一方面,我们使用中位数计算。 这些函数使用相同的参数和相同的代码。

这是区别:

find_median(some parameters)
{
    /* some code */
    best_windows_median(same parameters);
    /* some code */
}

find_average(some parameters)
{
    /* some code */
    best_windows_average(some parameters);
    /* some code */
}

,并且对于2-3个功能是相同的。如何将两个函数重新组合为一个,但保留使用中位数或平均值的选择?

3 个答案:

答案 0 :(得分:3)

有几种方法可以做到这一点,包括传递一个值来切换要使用的计算,以及传递一个函数指针(如果感兴趣的话,这是依赖转换的本质)。

所以:

find_average(data parameters, avg_type) {
    same code
    switch (avg_type) {
    case AVG_MEAN:
        best_windows_mean(data parameters);
        break;
    case AVG_MEDIAN:
        best_windows_median(data parameters);
        break;
    case AVG_MODE:
        ...
    default:
        report unrecognised option;
    }
    same code;
}

find_average(data parameters, best_windows_function) {
    same code;
    best_windows_function(data parameters);
    same code;
}

使用哪种,取决于您是否对函数指针感到满意,以及您真正喜欢的那个指针。

答案 1 :(得分:3)

友好的功能可能隐藏了API的复杂性:

typedef enum { Median, Average } CentralTendencyMeasure;

find_median(parameters)
{
    find_general(parameters, Median);
}

find_average(parameters)
{
     find_general(parameters, Average);
}

find_general(parameters, CentralTendencyMeasure Measure)
{
    Some code...
    switch (Measure)
    {
        case Median:  best_windows_median (parameters); break;
        case Average: best_windows_average(parameters); break;
        default:      Report error.
    }
    Some code...
}

仅将find_medianfind_average暴露给客户端,因此他们看不到CentralTendencyMeasurefind_general

答案 2 :(得分:2)

如果编写一个带有参数的函数,则该函数可以作为函数的指针。

例如:

`
int add (int a, int b){
return a+b;
}

int mul (int a, int b){
return a*b;
}

int function (int a, int b, int (*func) (int, int))
{
  return func(a,b);
}

int main (void){
 int x = function(4, 3, add);
 return EXIT_SUCCESS; }`

因此,此参数“ int(* func)(int,int)”是一个指向函数的指针,其名称为func,并且该指针指向的函数必须带有2个参数,其类型必须为int并返回一个int。 请注意不要忽略* punc周围的括号,否则它将在您编写“(int *)func(int,int)”时解释,这不再是指针。