Каков возможный недостаток размещения объявлений во внутренних блоках, а не в начале функции?

9

Там, где я работаю, есть четкие рекомендации по размещению объявлений переменных. В соответствии с этим их необходимо размещать на глобальном уровне и / или в начале функций, а не во внутренних блоках (таких как цикл for). Поскольку они были указаны людьми более опытными, чем я, я уверен, что для этого должна быть веская причина, но я не могу понять, что это может быть. Было бы неплохо узнать, есть ли какие-либо преимущества времени компиляции / выполнения при объявлении их в большем объеме.

TCSGrad
источник

Ответы:

8

Я вижу два основных преимущества:

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

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

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

thiton
источник
3

Единственное преимущество, которое я нашел, это простота кода. Вы всегда знаете, где искать объявления переменных, и все в команде используют один и тот же стиль кодирования. Эти вещи облегчают обслуживание кода, но я не уверен, что они облегчают написание лучшего кода. Я не имею в виду, что вы пишете худший код только из-за того, что иногда сложнее писать хороший код. Тем не менее, если команда разработчиков большая или ее члены часто меняются с использованием стандартов кода, это полезно.

Гас
источник
3

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

perreal
источник
3

Каждый язык может отличаться предпочтениями стиля и практики. Далее следуют JSF-AV-правила , на которые Страуструп указывает в качестве стандартов кодирования, которые он предпочитает.

AV Правило 136
Declarations should be at the smallest feasible scope

Обоснование этого описано как

This rule attempts to minimize the number of live variables that must be simultaneously considered. Furthermore, variable declarations should be postponed until enough information is available for full initialization

Если вы находитесь в C ++, предпочтительнее объявлять переменные, когда они вам нужны.

Кларк Гейбл
источник
3

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

Я не одинок с этим мнением. Вот вопрос, который решает ту же проблему: /software/56585/where-do-you-declare-variables-the-top-of-a-method-or-when-you-need Их ответ здесь - объявить их там, где вы их используете. Та же практика описана в книге Роберта Мартина «Чистый код».

Однако, если вы используете более старый стандарт C (C-89), вы должны определить локальные переменные в верхней части функции. Так, может быть, руководство является остатком со времени, когда использовался C-89? Вероятно, лучше спросить человека, который написал руководство, почему правило все еще там.

Johan
источник
2

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

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

Есть причины делать что-то в обоих направлениях.

NWS
источник
1

Старый стандарт С 1989 года допускает объявления переменных только в начале блока.

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

Патрик
источник
Мы используем C99 - но что более важно, я искал, каковы последствия объявления его в самом внутреннем блоке, а не в начале функции. Возможно, я не был достаточно ясен ...
TCSGrad
1

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

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

JeffO
источник