是否可以重构此功能?

时间:2019-02-08 20:50:28

标签: c

我正在用C编写程序,但是我发现很难保持代码整洁。

例如,我有这段代码,在某些分支中执行与其他分支完全相同的操作。因此,我想知道,是否可以将这些分支合并在一起以获得更简洁的代码?这样好吗? (考虑此代码在for循环中运行)

if(rx_color <= 60)
{
    set_sensor_mode(sn_rx_color, "COL-COLOR");
    get_sensor_value(0, sn_rx_color, &rx_color);
    printf("rx_color is %d\n", rx_color);
    if ( rx_color == 3)
    {
        printf("turn right\n");
        killMotors(0);
        return;
    } else 
    {
        pidLine(speed);
    }
}
else if (lx_color <= 60)
{

    set_sensor_mode(sn_lx_color, "COL-COLOR");
    get_sensor_value(0, sn_lx_color, &lx_color);
    printf("lx_color is %d\n", lx_color);
    if(lx_color == 3)
    {
        printf("turn left\n");
        killMotors(0);
        return;
    } else 
    {
        pidLine(speed);
    }
}
else
{
    pidLine(speed); 
}

您可以看到多次致电pidLine(speed)。这只是感觉不对,但是我无法提出一种清理它的方法。

有可能吗?

2 个答案:

答案 0 :(得分:3)

两个代码块之间一致的所有内容都只是复制粘贴到您的新函数中。两段代码之间的所有变量都将成为您的变量或传递给新函数的参数。

int somefunction(int a, int b, const char* direction)
{
    if(b <= 60) {
        set_sensor_mode(a, "COL-COLOR");
        get_sensor_value(0, a, &b);
        printf("b is %d\n", b);
        return 1;
    }
    if (b == 3) {
        printf("%s %s%c","turn",direction,'\n');
        killMotors(0);
    }
    return 0;
}

您可以这样称呼他们:

somefunction(sn_rx_color,rx_color,"right") || somefunction(sn_lx_color,lx_color,"left") || pidLine(speed);

答案 1 :(得分:3)

D:\SomeOtherFolder\mydata

从“ ...”开始的后半部分可能是一条语句:

static int Stuff(Color sn_color, Color *color, char *name, char *direction)
{
    set_sensor_mode(sn_color, "COL-COLOR");
    get_sensor_value(0, sn_color, color);
    printf("%s_color is %d\n", name, *color);
    if (*color == 3)
    {
        printf("turn %s\n", direction);
        killMotors(0);
        return 0;
    }
    return 1;
}

…
    int DoPidLine;

    if (rx_color <= 60)
        DoPidLine = Stuff(sn_rx_color, &rx_color, "rx", "right")
    else if (lx_color <= 60)
        DoPidLine = Stuff(sn_lx_color, &lx_color, "lx", "left")
    else
        DoPidLine = 1;
    if (DoPidLine)
        pidLine(speed);

另一种选择是:

if (rx_color <= 60 ? Stuff(sn_rx_color, &rx_color, "rx", "right") :
    lx_color <= 60 ? Stuff(sn_lx_color, &lx_color, "lx", "left" ) :
    1)
    pidLine(speed)