Стилистический вопрос о возвращении пустоты - PullRequest
5 голосов
/ 06 августа 2009

Рассмотрим следующий надуманный пример:

void HandleThat() { ... }

void HandleThis()
{
    if (That) return HandleThat();
    ...
}

Этот код работает просто отлично, и я вполне уверен, что он корректен по спецификации, но я (возможно, сам по себе) рассматриваю этот необычный стиль, так как кажется, что вызов возвращает результат функции, несмотря на то, функции являются прототипами, чтобы быть недействительными.

Как правило, я ожидаю увидеть:

if (That) {HandleThat(); return;}

что, я чувствую, не оставляет двусмысленности относительно того, что происходит.

ТАК сообщество, могу ли я узнать ваше мнение о том, является ли стиль кодирования возврата-пустоты запутанным или проблематичным? У этого есть чувство идиомы; я должен использовать это или избежать этого?

Обычно я бы стремился к ясности и использовал второй стиль. С другой стороны, в первой форме есть аккуратность, которая меня несколько привлекает.

Ответы [ 5 ]

13 голосов
/ 06 августа 2009

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

При возврате из прототипа функции void она должна просто возвращаться;

11 голосов
/ 06 августа 2009

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

return HandleThat();

с типом возврата void и выясните ум, прежде чем они действительно поймут код. Когда вы делаете больше, чем одну вещь в ветке if / else, вы должны действительно использовать фигурные скобки и помещать шаги в разные строки. Занимает больше места, но легче понять:

if (That) {
    HandleThat();
    return;
}
4 голосов
/ 06 августа 2009

Правила языка C говорят, что если функция, объявленная как возвращающая void, пытается вернуть выражение, выражение не будет оценено.

http://c0x.coding -guidelines.com / 6.8.6.4.html

3 голосов
/ 06 августа 2009

Никогда раньше такого не видел.

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

Я бы не изменил его, если бы кто-то не показал, что он недействителен.

2 голосов
/ 07 августа 2009

Я считаю, что первая версия в основном позволила упростить программирование шаблонов. Если HandleThat возвратил тип T, который может или не может быть недействительным, удобно использовать первую версию.

Но в "нормальных" случаях вторая версия более понятна, и я бы предпочел это.

...