Являются ли префиксы "n" или "ch" общими префиксами при именовании переменных int или char в C++?
В настоящее время я изучаю учебные пособия C++ на http://www.learncpp.com/ и вижу, что в их тенденции именования переменных они присваивают имена переменным int с префиксом "n" (т.е. int nValue) и префиксами "ch" для переменных типа char (например, char chOperation). Является ли это чем-то обычным явлением в отрасли, которое я должен сформировать сейчас по привычке?
5 ответов
Это то, что является обычным явлением в отрасли?
Эта практика была распространена в некоторых частях Microsoft двадцать или тридцать лет назад из-за неправильного понимания более полезного соглашения, используемого другими частями компании (пометки переменных указывают на их назначение, которое на языке со слабой типизацией может помочь избегать различных видов ошибок категории). Ни одно соглашение не служит какой-либо полезной цели в строго типизированном языке, таком как C++: система типов может отлавливать такие ошибки автоматически и более надежно.
Он стал широко использоваться другими, еще долго после того, как Microsoft (предположительно) поняла, что он был бессмысленным, и не рекомендовала его использовать, предположительно, полагая, что подражание привычкам Microsoft может также подражать их успеху. Это до сих пор иногда замечают люди, которые развивают привычки и никогда не подвергают сомнению их полезность, а также компании, которые отдают предпочтение руководствам по стилю над программным обеспечением.
Лично я нахожу это полезным в качестве предупреждения о том, что код может содержать худшие ужасы.
Я должен сформироваться как привычка сейчас?
Он только усложняет чтение кода и вводит в заблуждение, если вы забудете обновить теги при изменении типа переменной. Вы должны выработать привычку писать понятный, читаемый код, а не посыпать его таинственными рунами.
Отказ от ответственности: краткие комментарии о Microsoft предназначены для предоставления исторического контекста и не предназначены для того, чтобы быть авторским отчетом о политических решениях Microsoft; в частности, фраза "[Microsoft] поняла, что [это] было бессмысленно" означает "[некоторые люди в Microsoft] поняли [обсуждаемая тема, использование избыточных тегов типа в современном C++ в большинстве случаев] не имеет смысла" (не как комментатор, кажется, прочитал) "[вся Microsoft] поняла, что [все использование тегов переменных] было бессмысленным". Все мнения мои и могут основываться на несовершенных знаниях.
Да, они распространены (особенно в проектах, связанных с Windows)
Но разные проекты могут использовать разные стили кодирования. Поэтому, если вы работаете с существующим проектом, то лучше всего придерживаться стиля, которому он уже следует.
Упомянутый вами стиль именования известен как венгерский стиль, который обычно используется в проектах, связанных с Windows. В венгерском стиле переменные форматируются в случае верблюда (например, CamelCase) и имеют префикс их области видимости и типов:
[scope prefix]_[variable type][actual variable name in camel-cased style]
Например:
m_nMemberInteger
целое число (согласно префиксу n
), кроме того, это переменная-член (в соответствии с префиксом m_
) к некоторой структуре / классу, и вы можете найти полный список префиксов областей и типов, используемых в венгерском стиле, по ссылке выше.
Однако в проектах на основе Linux вы обычно найдете людей, использующих разные стили кодирования (например, стиль кодирования Google C++), в которых используются только строчные и подчеркивания _
назвать их переменные.
Это похоже на венгерскую нотацию. Такие вещи иногда используются, особенно в определенных областях программирования. Лично я думаю, что код выглядит грязно. В C++ вы должны больше думать о том, что означает объект, а не о том, каким может быть его базовый тип. А современные редакторы легко позволяют вам искать тип переменных, так что это отчасти устарело. Я могу понять, почему он использовался, когда редакторы не были так полезны..
Как упоминалось в других комментариях, это известно как "Венгерская нотация" и используется для того, чтобы сделать тип переменной очевидным. Хотя, возможно, можно спорить о том, стоит ли беспокоиться о маркировке типа, другое распространенное соглашение (особенно в C++) заключается в использовании префиксов для указания информации об использовании переменной. Это особенно полезно для ссылок и переменных-членов. Например, можно иметь функцию, которая выглядит как
void MyClass::myMethod(const int& iInput, int& oOutput, int &ioInputAndOutput)
{
oOutput = ioInputAndOutput + mMemberData + iInput;
ioInputAndOutput *= 2;
}
Как также упоминалось выше, важна согласованность, которая предотвратит больше ошибок, чем любое конкретное соглашение. В совместных проектах обычно стоит соответствовать существующей конвенции.
Как некоторые уже прокомментировали, это похоже на версию венгерской нотации.
Венгерская нотация предназначена для кодирования типа переменной в имени. Некоторые команды разработчиков применяют эту практику, но мне кажется, что это плохой стиль, потому что:
Если вы меняете тип переменной, вы должны изменить имя, что может привести к некоторым очень опасным неявным преобразованиям, если вы этого не сделаете.
Это не поощряет четкие и целевые конкретные имена переменных, что, следовательно, заставляет сопровождающего декодировать имена переменных в венгерском стиле, а не просто читать имена, назначенные на понятном естественном языке.
Завершение имени переменной в IDE становится практически бесполезным.
Это выглядит некрасиво (примеры того, что я имею в виду, посмотрите на win32 API.
Часто возникает двусмысленность, особенно если у вас есть указатели на множество пользовательских типов данных.
Для очень хорошего обсуждения стиля см. Руководство Stanford CS106B по именам переменных для более полного охвата причин.
Кроме того, не забудьте заглянуть на страницу Википедии в венгерской нотации