Какой стиль кодирования лучше? - PullRequest
12 голосов
/ 29 октября 2009

Во время проверки кода старший разработчик прокомментировал некоторые вложения, которые я использовал в своем коде. Он предложил мне установить значение bool, чтобы у меня никогда не было более одного уровня вложенности. Я думаю, что мой код более читабелен, но хочу узнать мнение других разработчиков по этому поводу. Какой стиль лучше? Обоснована ли его неприязнь к гнездованию?

Ниже приведены несколько упрощенных примеров кода.

Уплотненный:

If(condition1)
{
    If(condition2)
    {
        if(condition3)
        {
            return true;
        }
        else
        {
            log("condition3 failed");
        }
    else
    {
        log("condition2 failed")
    }
}
else
{
    log("condition1 failed")
}

return false;

или

Bool Driven:

bool bRC = false;

bRC = (condition1);
if(brc)
{
    bRC = (condition2);
}
else
{
    log("condition1 failed");
    return false;
}

if(bRC)
{
    bRC = (condition3);
}
else
{
    log("condition2 failed");
    return false;
}

if(bRC)
{
    return true;
}
else
{
    log("condition3 failed");
    return false;
}

Ответы [ 14 ]

1 голос
/ 29 октября 2009

Если язык поддерживает обработку исключений, я бы сказал следующее:

try {
    if (!condition1) {
        throw "condition1 failed";
    }

    if (!condition2) {
        throw "condition2 failed";
    }

    if (!condition3) {
        throw "condition3 failed";
    }

    return true;

} catch (e) {
    log(e);
    return false;
}

РЕДАКТИРОВАТЬ Из Charles Bretana: Пожалуйста, смотрите Использование исключений для потока управления

1 голос
/ 29 октября 2009

Я бы наверное пошел с

   if (!condition1)      log("condition 1 failed");
   else if (!condition2) log("condition 2 failed");
   else if (!condition3) log("condition 3 failed");
   // -------------------------------------------
   return condition1 && condition2 && condition3;

который я считаю эквивалентным и намного чище ...

Кроме того, как только клиент решит, что все условия должны быть оценены и записаны в журнал в случае их сбоя, а не только в первом, который выходит из строя, его гораздо легче изменить, чтобы сделать это:

   if (!condition1) log("condition 1 failed");
   if (!condition2) log("condition 2 failed");
   if (!condition3) log("condition 3 failed");
   // -------------------------------------------
   return condition1 && condition2 && condition3;
0 голосов
/ 29 октября 2009
if( condition1 && condition2 && condition3 )
    return true;

log(String.Format("{0} failed", !condition1 ? "condition1" : (!condition2 ? "condition2" : "condition3")));
return false;

Таким образом, вам не нужно видеть много строк кода только для регистрации. И если все ваши условия выполняются, вы не тратите время на их оценку, если вам нужно войти.

0 голосов
/ 29 октября 2009

Код должен переформулировать проблему на данном языке. Поэтому я утверждаю, что любой фрагмент может быть «лучше». Это зависит от моделируемой проблемы. Хотя я предполагаю, что ни одно из решений не будет соответствовать реальной проблеме. Если вы поставите реальные условия вместо условия 1,2,3, это может полностью изменить «лучший» код. Я подозреваю, что есть лучший (3d) способ написать все это вместе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...