Написание избыточных программных операторов для ясности или оптимизации? - PullRequest
2 голосов
/ 09 января 2011

Я отмечаю это как C, хотя это, безусловно, относится ко многим языкам.Причиной этого является часть вопроса, касающаяся оптимизации, которая зависит от компилятора.

Иногда мы встречаемся с подобными ситуациями в программах:

if(bob == 42)
{
    /* ... */
    return;
}
else
{
    /* ... */    
}

Блок else здесь не является строго необходимым, как вы, вероятно, видите.То же самое происходит и с другими структурами управления потоком программ;некоторые «обычные» конструкции становятся избыточными из-за особых условий.Вопрос в следующем: есть ли причина писать эти избыточные блоки кода?Ясность?Может ли это помочь компилятору с оптимизацией, если ситуация была достаточно сложной?

Ответы [ 4 ]

1 голос
/ 09 января 2011

Я называю то, что вы написали, «самодокументированным кодом».Используя блок else, вы упростите людям возможность увидеть, что если bob не равен 42, сработает 2-й блок кода.

На моих уроках информатики нам будут предоставлены примеры кода, подобные этому:проверить наши логические навыки.Но в деловом мире вы действительно не хотите вводить людей в заблуждение или делать что-либо, что может замедлить прогресс.Следовательно, вы должны выбрать все, что проще всего прочитать , предполагая, что снижение производительности незначительно.

Самодокументированный код означает, что объяснение происходящего можно увидеть в именах функцийили читая реальный код, уменьшая потребность в комментариях к коду.

Что касается выполнения кода, проведите несколько тестов с некоторым кодом времени, чтобы увидеть, что работает лучше.

1 голос
/ 09 января 2011

Для себя я часто пишу

if(bob == 42)
{
    /* ... */
    return;
}
/* else */

/* ... */

хотя я мог бы что-то здесь упустить.

РЕДАКТИРОВАТЬ: Я также только что понял проблему с областью здесь. По крайней мере, в C ++ (не в старом C, не уверен насчет C99?) Блок else будет иметь «свою» другую область видимости, что, возможно, стоит отметить.

0 голосов
/ 09 января 2011

Я бы предпочел только одну строку (если это эквивалентно тому, что вы имели в виду)

if (bob == 42) return;

Это просто говорит о том, что он делает, и не нуждается в дополнительных комментариях. Напротив, вставка else с блоком, комментариями и прочим запутывает код и отвлекает от происходящего, в частности от другого важного кода, который может последовать.

Повторение того же сообщения с небольшими изменениями в комментариях делает читателя кода глупым.

Если бы это было не то, что вы имели в виду с помощью своего фрагмента кода, если в обоих случаях действительно нужно что-то делать, я бы предпочел

if (bob == 42) {
  /* do something if bob is the chosen one */
} else {
  /* for all others apply the standard treatment */ 
}
return;

Это не скрывает вашу инструкцию возврата в глубине блока.

Таким образом, если вы чувствуете, что должны комментировать управление потоком, а не семантику кода, вы делаете что-то не так.

0 голосов
/ 09 января 2011

Обычно я использую следующую структуру комментариев для операторов if:

/* Is bob 42 ? */
if(bob == 42)
{
  /* Bob is 42, return from function */

  return;
}
else
{
  /* Bob is not 42, do nothing */
}

Компилятор должен оптимизировать пустое предложение else.

...