Следует ли старательно и сознательно пытаться отложить определения переменных как можно дольше? - PullRequest
5 голосов
/ 21 июня 2011

В своей книге Effective C++ Scott Meyers приведено одно интересное указание:

Пункт 26: Отложите определения переменных как можно дольше.Это повышает ясность программы и повышает ее эффективность.

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

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

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

Ответы [ 10 ]

8 голосов
/ 21 июня 2011

Совет Скотта Мейерса (как обычно) очень хорош, и вы должны следовать ему. Я занимаюсь этим уже два десятилетия, и мне не нравится тот факт, что Java использовала C-способ для этого.

5 голосов
/ 21 июня 2011

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

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

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

5 голосов
/ 21 июня 2011

Даже в современном C вы должны отложить объявление до тех пор, пока вы не сможете инициализировать с разумным значением. Скотт - учитель, мы - только последователи ...

2 голосов
/ 21 июня 2011

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

1 голос
/ 30 марта 2016

Я собираюсь в значительной степени игнорировать утверждение о лучшей читаемости, но я не согласен с ним. Правило C89 было обусловлено ограничениями компилятора, а не читабельностью (и C99 изменил правило, чтобы переменные могли быть объявлены где угодно).

В C нет необходимости объявлять неинициализированные переменные, потому что все переменные являются POD, поэтому вы можете объявить все в верхней части функции и инициализировать ее позже. В C ++ некоторые типы имеют нетривиальные конструкторы по умолчанию, поэтому вы платите за их немедленную инициализацию, поэтому лучше отложить это до тех пор, пока они вам не понадобятся.

Использование ваших привычек C в качестве руководства в C ++ не очень хорошая идея. Те же правила не применяются.

1 голос
/ 21 июня 2011

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

0 голосов
/ 22 июня 2011

Я тоже так делаю.С современными IDE это не так полезно, но если у вас есть объявление рядом с тем местом, где оно используется, вы можете увидеть тип без поиска.

0 голосов
/ 21 июня 2011

Я часто группирую свои определения переменных логически, а не определяю каждое из них по мере необходимости. Это может означать сразу все вверху функции, а может и нет.

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

Иногда есть способы реорганизовать функцию, чтобы устранить подобные соображения, но иногда нет.

0 голосов
/ 21 июня 2011

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

IMO, однако, если «где это необходимо» действительно лот отличается от «начала блока» (или даже «начала функции»), шансы довольно справедливы, что вы ' переписываете отдельные функции, которые, вероятно, больше идеального, и ваш код может выиграть от разбиения на более мелкие, простые и понятные части.

0 голосов
/ 21 июня 2011

Я делаю оба.

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

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