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


9

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

Ответы:


8

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

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

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

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


3

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


3

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


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? Вероятно, лучше спросить человека, который написал руководство, почему правило все еще там.


2

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

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

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


1

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

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


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

1

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.