Как называть переменные в программировании
Как называть переменные и функции, чтобы вас уважали бывалые программисты
Если вы опытный разработчик, покажите эту статью начинающим.
Зачем как-то по-особому называть переменные и функции
Вам по-любому придётся как-то назвать переменные и функции. С точки зрения языков программирования, переменные могут быть почти любыми: хоть a, b и c, хоть SuperImportantVariable3000. То же с функциями: они могут быть суперкороткими типа yo(), а могут быть невероятно замороченными вроде getNewPageNumberAndNavigateToThatPage(). Как скажете — так и будет. Тем более что современные текстовые редакторы делают автоподстановку всех названий, так что вам даже не придётся их запоминать.
Но есть три момента:
Как называть переменные
Когда начинаешь писать код, у тебя простые программы, к которым нужны простые переменные: screen, score, text и так далее. Потом проекты становятся сложнее, и переменные нужны всё более сложные: totalScore, totalScoreBefore, totalScoreAfter, totalScoreMaxProgressiveLimit и тому подобные. Тут надо остановиться и подумать вот о чём.
Чем длиннее название переменной, тем тяжелее её набрать без ошибок. Спасает автоподстановка, но если её нет — почти наверняка ваш код не полетит из-за опечатки.
Если вы пишете на JavaScript, то будет ещё хуже: так как он генерирует переменные на ходу, ошибка в переменной totalScoreMaxProgresLimit у него не вызовет подозрений. Он создаст новый элемент с этим названием, и у вас будут две переменные — одна правильная, другая неправильная. Программа запустится, но работать будет непредсказуемо.
Поэтому стремитесь выбирать короткие названия переменных, которые при этом понятны без глубокого вникания. Например, totalScore — итоговый счёт в игре, maxWidth — максимальная ширина. Если есть необходимость хранить много переменных на разных полочках, в группах или еще какими-то пачками, изучите понятия объектов и классов в JavaScript — это то, что вам нужно.
Как называть функции
Функция — это подпрограмма внутри вашей программы, которую вы часто используете. Например, можно написать функцию getNumber(), которая будет выдавать случайное число в нужном вам диапазоне. Или сказать setTimer() — и где-то внутри программы установится таймер, который выполнит то, что необходимо, по завершении отсчёта времени.
Функция может просто сделать свою работу, а может вернуть при этом какое-то значение, переменную, массив или объект. Например, можно дать подпрограмме строку текста, написать алгоритм перевода на иностранный язык, и она будет возвращать переведённый текст.
У функций тоже могут быть какие угодно названия. Но обычно они будут примерно такими:
Вы заметите, что из названия функции можно понять, что она сделает и сообщит ли какой-то результат. Например, getScore() вернёт счёт игры, setScore() задаст счёт игры и ничего не вернёт, а clearScore() обнулит счёт игры и тоже ничего не вернёт.
А что с заглавными буквами?
В программировании есть два подхода к оформлению функций и переменных: camelCase и snake_case.
В camelCase переменные из нескольких слов соединяются без пробела, все новые слова пишутся с заглавной: getMoney, renderToFrame, removeFromBase и т. д. Этот подход рекомендуется в JavaScript. Обратите внимание: названия переменных и функций в JavaScript чувствительны к заглавным, то есть переменные getmoney и getMoney — это разные переменные.
Snake_case — это когда слова склеиваются нижним подчеркиванием. Это чаще используют в классах CSS. Примеры: header_marginal, form_success.
Выбирайте тот подход, который характерен для выбранного вами языка. Помните, что потом ваш код будут читать другие люди, и видеть необычно названные функции и переменные им будет тяжеловато.
Как не надо называть ни переменные, ни функции
Программисты не советуют называть переменные и функции креативно, например crazyUnicorn или wonderfulWorld(). Из названий этих функций непонятно, что они делают, возвращают ли они что-то и вообще зачем нужны.
Но, например, unicornCount — нормальная переменная с количеством единорогов. А initWorld() — функция, которая создаёт мир компьютерной игры.
Не называйте функции и переменные словами function или variable. MyVar и superFunction() — плохие варианты, потому что вы сами же через две недели забудете, что эти штуки делают.
Лучше не называть функции и переменные по-русски типа solnce или KYCb() — забудете потом, как они правильно пишутся. А когда ваша программа станет международно признанной, разработчики поблагодарят вас. При этом: если ваша функция делает «кусь», чтобы это ни значило, ее можно назвать bite() или getPiece().
Не делайте названия слишком секретными: переменные p, m, t, z или функция hm() — это слишком коротко. Исключение — когда вы пишете циклы: там используются переменные типа i, n, p — с их помощью считают, сколько раз цикл уже отработал. Но эти переменные создались, исполнили свою роль и уничтожились сразу после закрытия цикла, больше к ним не обращаются.
Стили именования переменных и функций. Используйте их все
Чтобы обеспечить легкую читаемость кода программисты используют разные стили именования для разных типов объектов, функций и переменных. Именно поэтому нет какого-то одного «идеального» формата. Выбор уместного стиля поможет быстро понять к какому типу относится сущность в коде, но не забывайте и о том, что имя должно объяснять что делает это сущность. Мы расскажем какой стиль существует для каждой из возможных ситуаций.
В программировании пробел является зарезервированным символом, поэтому все названия обходятся без него. Чтобы строки без пробелов всё же напоминали естественный язык и нужны все эти кейсы.
camelCase (dromedaryCase)
Каждое слово, кроме первого, начинается с большой буквы.
Применяется для именования переменных и функций в большинстве языков.
PascalCase (CamelCase, StudlyCase)
В этом стиле каждое слово начинается с заглавной буквы. Обычно используется для названий классов.
snake_case (pothole_case)
Вместо пробела ставится нижнее подчёркивание. Используется в основном для имён полей баз данных, переменных и функций.
SCREAMING_SNAKE_CASE (MACRO_CASE, CONSTANT_CASE)
Тот же snake_case, только буквы всегда в верхнем регистре. Обычно используется для именования констант.
kebab-case (dash-case, lisp-case)
В этом случае пробел заменяется дефисом. Используется в URL и CSS. В языке Lisp так пишутся любые названия. Примеры:
TRAIN-CASE (COBOL-CASE, SCREAMING-KEBAB-CASE)
Все буквы в верхнем регистре, соединены дефисом. Применяется в языке COBOL для всех названий. Пример:
Train-Case (HTTP-Header-Case)
Каждое слово с большой буквы, соединены дефисом. Стиль названий HTTP заголовков. Пример:
flatcase
Все слова в нижнем регистре, без пробелов. Используется в тегах. Пример:
Как правильно называть переменные
Переменные нужны для хранения информации. Это своеобразная «коробка» для данных с уникальным именем. Туда можно положить любое значение и потом менять его сколько угодно раз. Важно назвать переменные так, чтобы даже через несколько месяцев, понять, что и как обозначается в коде. Разберёмся, как именовать переменные в JavaScript и PHP.
Базовые правила
Без них вы просто не сможете создать переменную.
Называйте переменную по правилам именования языка
В PHP переменные создаются с помощью символа доллара в начале имени.
Все правила вы найдёте в документации к языку: для JavaSrcipt — это MDN; для PHP — php.net.
Не используйте зарезервированные имена
Это имена, которые уже выполняют в языке конкретные функции. Если назвать переменную зарезервированным именем, вы получите синтаксическую ошибку:
Условные правила
Соблюдение этих правил не обязательно. Но они помогут сделать код более понятным для вас самих и других разработчиков.
Понятные имена
Перепишем код, используя хорошее именование и получим функцию, считающую длину окружности.
Единый стиль написания
Есть два основных принципа написания многословных переменных. Не смешивайте их в одном скрипте:
Общепринятые подходы
В сообществе устоялись правила, относящиеся к большинству языков. Их нужно знать, чтобы писать код, понятный другим разработчикам. Вот так принято называть переменные в зависимости от содержимого:
Использование этих правил сделает ваш код намного понятнее.
Если хотите разобраться с переменными, операциями, типами данных и написать программу, пройдите бесплатно первую главу интерактивного курса «Основы JavaScript».
Как называть переменные
Одним из важных критериев хорошего кода, является его читаемость. Например, мы три месяца назад написали код, а сегодня нам потребовалось кое что поменять. Изменить свойства товара, или изменить производителя.
Поэтому очень важно, чтобы функции, переменные и методы легко читались и понимались.
1. Строковые переменные
Как правило, при создании имен для строковой переменной, используют существительное. Вам, и тому, кто будет читать ваш код, должно быть понятно, что находится в переменной по её названию.
2. Никакого транслита. Только английский.
Почему плох транслит? В команде могут быть иностранные разработчики, и они конечно же не поймут, что вы имели ввиду.
Длина переменных, как правило на английском короче, чем на транслите.
Также, наверняка вы используете в своем коде библиотеки, и они написаны другими людьми, и все они используют названия переменных и функций на английском языке.
3. Числовые переменные
Почти в каждом проекте приняты следующие правила.
4. Переменные из нескольких слов пишутся вместеВотТак
Приведенный ниже способ, называется «верблюжьей нотацией» или, по-английски, «camelCase».
Так же часто применяется альтернативный стандарт, когда несколько слов пишутся через знак нижнего подчеркивания.
5. Булевое значение
Логичным названием для булевой переменной — вопрос с ответом да или нет.
6. Массивы
Это существительные во множественном числе, которые имеют окончание на s и es.
7. Использование коротких имен переменных только для небольшого фрагмента кода
8. Объекты
Не стоит дублировать название объекта в названии свойства или метода.
9. Функции и методы
Для функций, используйте первое слово глагол.
10. Симметричные пары
Общие:
Для функций:
Руководство Google по стилю в C++. Часть 8
Все мы при написании кода пользуемся правилами оформления кода. Иногда изобретаются свои правила, в других случаях используются готовые стайлгайды. Хотя все C++ программисты читают на английском легче, чем на родном, приятнее иметь руководство на последнем.
Эта статья является переводом части руководства Google по стилю в C++ на русский язык.
Исходная статья (fork на github), обновляемый перевод.
Именование
Основные правила стиля кодирования приходятся на именование. Вид имени сразу же (без поиска объявления) говорит нам что это: тип, переменная, функция, константа, макрос и т.д. Правила именования могут быть произвольными, однако важна их согласованность, и правилам нужно следовать.
Общие принципы именования
Отметим, что типовые имена также допустимы: i для итератора или счётчика, T для параметра шаблона.
В дальнейшем при описании правил «word» / «слово» это всё, что пишется на английском без пробелов, в том числе и аббревиатуры. В слове первая буква может быть заглавной (зависит от стиля: «camel case» или «Pascal case»), остальные буквы — строчные. Например, предпочтительно StartRpc(), нежелательно StartRPC().
Параметры шаблона также следуют правилам своих категорий: Имена типов, Имена переменных и т.д…
Имена файлов
Имена файлов должны быть записаны только строчными буквами, для разделения можно использовать подчёркивание (_) или дефис (—). Используйте тот разделитель, который используется в проекте. Если единого подхода нет — используйте «_».
Примеры подходящих имён:
Не используйте имена, уже существующие в /usr/include, такие как db.h.
Старайтесь давать файлам специфичные имена. Например, http_server_logs.h лучше чем logs.h. Когда файлы используются парами, лучше давать им одинаковые имена. Например, foo_bar.h и foo_bar.cc (и содержат класс FooBar).
Имена типов
Имена типов начинаются с прописной буквы, каждое новое слово также начинается с прописной буквы. Подчёркивания не используются: MyExcitingClass, MyExcitingEnum.
Имена всех типов — классов, структур, псевдонимов, перечислений, параметров шаблонов — именуются в одинаковом стиле. Имена типов начинаются с прописной буквы, каждое новое слово также начинается с прописной буквы. Подчёркивания не используются. Например:
Имена переменных
Имена переменных (включая параметры функций) и членов данных пишутся строчными буквами с подчёркиванием между словами. Члены данных классов (не структур) дополняются подчёркиванием в конце имени. Например: a_local_variable, a_struct_data_member, a_class_data_member_.
Имена обычных переменных
Члены данных класса
Члены данных классов, статические и нестатические, именуются как обычные переменные с добавлением подчёркивания в конце.
Члены данных структуры
Члены данных структуры, статические и нестатические, именуются как обычные переменные. К ним не добавляется символ подчёркивания в конце.
См. также Структуры vs Классы, где описано когда использовать структуры, когда классы.
Имена констант
Объекты объявляются как constexpr или const, чтобы значение не менялось в процессе выполнения. Имена констант начинаются с символа «k», далее идёт имя в смешанном стиле (прописные и строчные буквы). Подчёркивание может быть использовано в редких случаях когда прописные буквы не могут использоваться для разделения. Например:
Все аналогичные константные объекты со статическим типом хранилища (т.е. статические или глобальные, подробнее тут: Storage Duration) именуются также. Это соглашение является необязательным для переменных в других типах хранилища (например, автоматические константные объекты).
Имена функций
Обычные функции именуются в смешанном стиле (прописные и строчные буквы); функции доступа к переменным (accessor и mutator) должны иметь стиль, похожий на целевую переменную.
Обычно имя функции начинается с прописной буквы и каждое слово в имени пишется с прописной буквы.
(Аналогичные правила применяются для констант в области класса или пространства имён (namespace) которые представляют собой часть API и должны выглядеть как функции (и то, что они не функции — некритично))
Accessor-ы и mutator-ы (функции get и set) могут именоваться наподобие соответствующих переменных. Они часто соответствуют реальным переменным-членам, однако это не обязательно. Например, int count() и void set_count(int count).
Именование пространства имён (namespace)
Пространство имён называется строчными буквами. Пространство имён верхнего уровня основывается на имени проекта. Избегайте коллизий ваших имён и других, хорошо известных, пространств имён.
Пространство имён верхнего уровня — это обычно название проекта или команды (которая делала код). Код должен располагаться в директории (или поддиректории) с именем, соответствующим пространству имён.
Не забывайте правило не использовать аббревиатуры — к пространствам имён это также применимо. Коду внутри вряд ли потребуется упоминание пространства имён, поэтому аббревиатуры — это лишнее.
Избегайте использовать для вложенных пространств имён известные названия. Коллизии между именами могут привести к сюрпризам при сборке. В частности, не создавайте вложенных пространств имён с именем std. Рекомендуются уникальные идентификаторы проекта (websearch::index, websearch::index_util) вместо небезопасных к коллизиям websearch::util.
Для internal / внутренних пространств имён коллизии могут возникать при добавлении другого кода (внутренние хелперы имеют свойство повторяться у разных команд). В этом случае хорошо помогает использование имени файла для именования пространства имён. (websearch::index::frobber_internal для использования в frobber.h)
Имена перечислений
Перечисления (как с ограничениями на область видимости (scoped), так и без (unscoped)) должны именоваться либо как константы, либо как макросы. Т.е.: либо kEnumName, либо ENUM_NAME.
Предпочтительно именовать отдельные значения в перечислителе как константы. Однако, допустимо именовать как макросы. Имя самого перечисления UrlTableErrors (и AlternateUrlTableErrors), это тип. Следовательно, используется смешанный стиль.
Вплоть до января 2009 года стиль именования значений перечисления был как у макросов. Это создавало проблемы дублирования имён макросов и значений перечислений. Применение стиля констант решает проблему и в новом коде предпочтительно использовать стиль констант. Однако, старый код нет необходимости переписывать (пока нет проблем дублирования).
Имена макросов
Вы ведь не собираетесь определять макросы? На всякий случай (если собираетесь), они должны выглядеть так:
MY_MACRO_THAT_SCARES_SMALL_CHILDREN_AND_ADULTS_ALIKE.
Пожалуйста прочтите как определять макросы; Обычно, макросы не должны использоваться. Однако, если они вам абсолютно необходимы, именуйте их прописными буквами с символами подчёркивания.
Исключения из правил именования
Если вам нужно именовать что-то, имеющее аналоги в существующем C или C++ коде, то следуйте используемому в коде стилю.
bigopen()
имя функции, образованное от open()
uint
определение, похожее на стандартные типы
bigpos
struct или class, образованный от pos
sparse_hash_map
STL-подобная сущность; следуйте стилю STL
LONGLONG_MAX
константа, такая же как INT_MAX
Прим.: ссылки могут вести на ещё не переведённые разделы руководства.