Именование: Почему именованные константы должны быть в верхнем регистре в C ++ / Java? - PullRequest
31 голосов
/ 08 мая 2009

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

public final static Color BACKGROUND_COLOR = Color.WHITE;
public final static Color TEXT_COLOR = Color.BLACK;

Это соглашение об именах легко понять и соблюдать, но я спрашиваю себя, зачем выбирать это соглашение об именах по сравнению с обычным соглашением об именах для переменных:

public final static Color backgroundColor = COLOR.WHITE;
public final static Color textColor = COLOR.BLACK;

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

Так какова основная причина писать именованные константы в верхнем регистре? Исторические причины?

Ответы [ 16 ]

1 голос
/ 08 мая 2009

Возможно, вы правы. Компьютеры и компиляторы (особенно) были не такими быстрыми, как сегодня.

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

Я помню, когда компиляция не слишком большой программы (10-20KLOC) с оверлеями в Turbo Pascal 5.0 на ПК XT 10 МГц заняла около 20 минут ...

Я полагаю, что ожидание компиляции для обнаружения ошибки было неприемлемым.

И подобное соглашение помогает избежать ошибок и напрасной траты времени при неправильной компиляции.

0 голосов
/ 14 января 2018

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

На самом деле нет причин, касающихся компиляции. Соглашения об именах - это просто соглашения, а не технические ограничения.

0 голосов
/ 20 мая 2016

На самом деле большинство правил именования в C ++ (включая ISO, Boost, Sutter & Stroustrup и Google) категорически не одобряют использование констант имен со всеми заглавными буквами. Это связано с тем, что в макросах также используются все заглавные буквы, и они могут быть засорены в заголовочных файлах, что может привести к странному поведению. Люди все равно используют все заглавные буквы, потому что они учатся на старом C / K & R или старом унаследованном коде. Однако в новом коде Modern C ++ вы должны избегать использования всех заглавных букв для чего-либо, кроме макросов.

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

Большинство руководств C ++ теперь согласны с использованием «k» в качестве префикса для константы, за которой следует имя с подчеркиванием или CamelCase. Я лично предпочитаю kCameCase, потому что он легко позволяет отличить переменные с именами under_scores.

const float kFixedRadius = 3.141;
0 голосов
/ 14 февраля 2011

Это определенно техническая проблема в Java. Рассмотрим:

import static com.test.constants.white;
public class Foo {
  void bar(){
    //String white = "black";
    String whatAmI = white;
  }
}

Какое значение "whatAmI" до и после раскомментирования предыдущей строки?

Если имя константы имеет то же соглашение, что и имя локальной переменной, то это вызовет проблемы РЕАЛЬНОГО кода. Константы всегда должны иметь соглашение UPPERCASE, чтобы избежать этого.

0 голосов
/ 08 мая 2009

Кодирование преобразований для улучшения читабельности. Вам не нужно использовать буквы. Java допускает символ $, например.

public final static Color $$ = COLOR.WHITE;
public final static Color $_ = COLOR.BLACK;

Вы могли бы также нумеровать свои переменные, но это не значит, что это хорошая идея. ;)

0 голосов
/ 08 мая 2009

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

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