Возможно ли рефакторинг этой функции? - PullRequest
0 голосов
/ 08 февраля 2019

Я пишу программу на 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 голосов
/ 09 февраля 2019
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)

Другая альтернатива:

static void Stuff(Speed speed, Color sn_color, Color *color, char *name, char *direction)
{
    if (name)
    {
        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;
        }
    }
    pidLine(speed);
}

…
    if (rx_color <= 60)
        Stuff(speed, sn_rx_color, &rx_color, "rx", "right")
    else if (lx_color <= 60)
        Stuff(speed, sn_lx_color, &lx_color, "lx", "left")
    else
        Stuff(speed, 0, 0, 0, 0);
0 голосов
/ 09 февраля 2019

Все, что соответствует между вашими фрагментами кода, просто вставляется в вашу новую функцию.Все, что является переменной между двумя фрагментами кода, становится вашими переменными или параметрами, которые вы передаете новой функции.

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...