Как называть переменные?
Если вы начали программировать, в какой-то момент вам придется подумать, как называть свои переменные и функции. С точки зрения языка программирования названия у них могут быть любыми: от i до MySuperVariable100500.
В программировании постоянно приходится придумывать имена: для функций, классов, аргументов, пакетов, исходных файлов, каталогов и другого. Но для чтения и понимания кода названия переменных и других сущностей крайне важны. Ниже объясню, почему.
Почему названия переменных важны
- Через пару недель после завершения проекта вы, скорее всего, забудете, как устроен код и за что отвечают некоторые его части. Правильное имя переменной или функции помогут раскрыть ее предназначение.
- В какой-то момент с вашим кодом придется работать другому человеку. Чем понятнее имена сущностей, тем проще ему будет разобраться в программе.
- Правильность и точность именования функций проверяют даже на собесебедовании. В какой-то степени это помогает потенциальному работодателю понять, как устроен ваш образ мыслей.
Правила именования
- Имя переменной или функции должно отражать намерение — прочитав его, должно стать понятно, зачем нужна именно эта сущность. Хотя выбор имен отнимает время, при рефакторинга кода с плохим именованием его тратится намного больше.
- Имя любой переменной, функции или класса должно отвечать на три вопроса:
- Почему оно существует? 2.Что делает?
- Для чего используется?
Лучше выбирать короткие имена, так как чем длиннее названия переменных, тем тяжелее их набрать без ошибок(хоть тут помогает автокомплит).
Часто функции называют каким-то действием. Например, getUserName() задает имя пользователя, а setSpeed() — скорость.
Вместо заключения — общее правило именования. Называйте переменные и функции так, как будто их будут читать совершенно незнакомые люди. Будто завтра вам в отпуск, а за вас код будет доделывать ваш коллега из Индии. Он должен понять ваши переменные и функции. Если сможете так сделать — вас оторвут с руками в любой компании.
Переменные в языке Си. Объявление переменной в Си
Чтобы хранить в своей программе какие-либо данные, вам понадобятся переменные. Прежде всего, нужно научиться эти переменные в программе создавать. Другими словами, вспоминая нашу аналогию с коробками, чтобы в коробку что-то положить, её, эту самую коробку, хорошо бы сначала где-нибудь раздобыть.
В книжках по программированию процесс создания переменной называют объявлением переменной . Это словосочетание хорошо бы знать, чтобы понимать профессиональную литературу и речь других программистов. Но ещё более важно понимать, что за этим словосочетанием скрывается.
Как объявить переменную?
Для того чтобы объявить переменную, необходимо указать её тип и записать её имя. Ну и не забыть поставить «;». Общая стуктура объявления переменной показана на следующем рисунке.

Рис.1. Общий синтаксис объявления переменной.».
В примере на рисунке мы создаём переменную с именем num, в которой можно будет хранить целые числа. На то, что мы собираемся использовать переменную для хранения целых чисел, указывает тип данных int.
Ещё парочка примеров:
Листинг 1. Объявление переменных
int z; // переменная z целого типа char w; // переменная w символьного типа
Для имён переменных есть одно правило, которое надо будет запомнить.
В качестве имени переменной может выступать любая последовательность символов латинского алфавита, цифр и знака нижнего подчеркивания «_», которая начинается с буквы.
На самом деле, на имя переменной есть дополнительные ограничения, но мы пока в такие детали вдаваться не будем. Давайте лучше посмотрим на примеры правильных и неправильных имён.
Правильные имена переменных
Peremennaya, flag, f3, var4, KolichestvoBukv, fd4s, FLaG, key_number
Неправильные имена переменных
2num – начинается с цифры
num flat – содержит пробел в имени
nomer-telefona – содержит дефис
И ещё один важный момент. В языке программирования Си регистр букв очень важен. Например, переменные с именами flag, FLAG, FlAg, fLAg — это всё различные переменные. Кроме того, есть ряд слов, которые нельзя использовать для названия переменных. Например, int, void, return и другие. Это специальные ключевые слова , которые зарезервированы для нужд самого языка и нигде в другом месте не могут быть использованы.
Кстати, за одно объявление можно создать сразу несколько переменных одного типа.
Листинг 2. Объявление нескольких переменных
int a,c; // объявляем переменные a и c целого типа double x, y, z; // объявляем сразу три вещественные переменные
Всё просто и логично. Сначала указывает тип переменных, а потом их имена, разделённые запятой.
Переменная в памяти компьютера.
Пару слов о том, как выглядит объявление переменной с точки зрения компьютера.
Можно считать, что при объявлении мы сообщаем компьютеру, чтобы он выделил под переменную место в памяти и связал это место определенным именем. Количество места, которое будет выделено в памяти для хранения переменной, зависит от типа этой переменной. Проиллюстрируем эту мысль следующим рисунком.
Листинг 3. Объявление двух переменных
int w; // объявляем целочисленной переменной w double z; // объявляем вещественной переменной z

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

Решите предложенные задачи: Для удобства работы сразу переходите в полноэкранный режим
Исследовательские задачи для хакеров
- Объявите в программе переменную с неправильным именем и попробуйте скомпилировать программу. Посмотрите, какую ошибку выдаст компилятор.
- Найдите список всех ключевых слов языка Си. Можно искать в стандарте языка(подсказка: «keywords»), а можно в интернете. Запоминать наизусть их не нужно, но разок посмотреть на них стоит.
Дополнительные материалы
- В ваших программах не стесняйтесь давать переменным длинные имена. Хорошо, если по имени переменной можно будет сразу понять, что в ней хранится. Есть два основных способа записи длинных имён переменных: ВерблюжьяНотация и змеиная_нотация. Подробнее о плюсах и минусах обоих подходов можно почитать по следующим ссылкам: Хабрахабр и Типичный программист.
Руководство Google по стилю в C++. Часть 8

Все мы при написании кода пользуемся правилами оформления кода. Иногда изобретаются свои правила, в других случаях используются готовые стайлгайды. Хотя все C++ программисты читают на английском легче, чем на родном, приятнее иметь руководство на последнем.
Эта статья является переводом части руководства Google по стилю в C++ на русский язык.
Исходная статья (fork на github), обновляемый перевод.
Именование
Основные правила стиля кодирования приходятся на именование. Вид имени сразу же (без поиска объявления) говорит нам что это: тип, переменная, функция, константа, макрос и т.д. Правила именования могут быть произвольными, однако важна их согласованность, и правилам нужно следовать.
Общие принципы именования
- Используйте имена, который будут понятны даже людям из другой команды.
- Имя должно говорить о цели или применимости объекта.
- Не экономьте на длине имени, лучше более длинное и более понятное (даже новичкам) имя.
- Поменьше аббревиатур, особенно если они незнакомы вне проекта.
- Используйте только известные аббревиатуры (Википедия о них знает?).
- Не сокращайте слова.
class MyClass < public: int CountFooErrors(const std::vector& foos) < int n = 0; // Чёткий смысл для небольшой области видимости for (const auto& foo : foos) < . ++n; >return n; > void DoSomethingImportant() < std::string fqdn = . ; // Известная аббревиатура полного доменного имени >private: const int kMaxAllowedConnections = . ; // Чёткий смысл для контекста >;
class MyClass < public: int CountFooErrors(const std::vector& foos) < int total_number_of_foo_errors = 0; // Слишком подробное имя для короткой функции for (int foo_index = 0; foo_index < foos.size(); ++foo_index) < // Лучше использовать `i` . ++total_number_of_foo_errors; >return total_number_of_foo_errors; > void DoSomethingImportant() < int cstmr_id = . ; // Сокращённое слово (удалены буквы) >private: const int kNum = . ; // Для целого класса очень нечёткое имя >;
Отметим, что типовые имена также допустимы: i для итератора или счётчика, T для параметра шаблона.
В дальнейшем при описании правил «word» / «слово» это всё, что пишется на английском без пробелов, в том числе и аббревиатуры. В слове первая буква может быть заглавной (зависит от стиля: «camel case» или «Pascal case»), остальные буквы — строчные. Например, предпочтительно StartRpc(), нежелательно StartRPC().
Параметры шаблона также следуют правилам своих категорий: Имена типов, Имена переменных и т.д…
Имена файлов
Имена файлов должны быть записаны только строчными буквами, для разделения можно использовать подчёркивание (_) или дефис (—). Используйте тот разделитель, который используется в проекте. Если единого подхода нет — используйте «_».
Примеры подходящих имён:
- my_useful_class.cc
- my-useful-class.cc
- myusefulclass.cc
- myusefulclass_test.cc // _unittest and _regtest are deprecated.
Не используйте имена, уже существующие в /usr/include, такие как db.h.
Старайтесь давать файлам специфичные имена. Например, http_server_logs.h лучше чем logs.h. Когда файлы используются парами, лучше давать им одинаковые имена. Например, foo_bar.h и foo_bar.cc (и содержат класс FooBar).
Имена типов
Имена типов начинаются с прописной буквы, каждое новое слово также начинается с прописной буквы. Подчёркивания не используются: MyExcitingClass, MyExcitingEnum.
Имена всех типов — классов, структур, псевдонимов, перечислений, параметров шаблонов — именуются в одинаковом стиле. Имена типов начинаются с прописной буквы, каждое новое слово также начинается с прописной буквы. Подчёркивания не используются. Например:
// classes and structs class UrlTable < . class UrlTableTester < . struct UrlTableProperties < . // typedefs typedef hash_mapPropertiesMap; // using aliases using PropertiesMap = hash_map; // enums enum UrlTableErrors < .
Имена переменных
Имена переменных (включая параметры функций) и членов данных пишутся строчными буквами с подчёркиванием между словами. Члены данных классов (не структур) дополняются подчёркиванием в конце имени. Например: a_local_variable, a_struct_data_member, a_class_data_member_.
Имена обычных переменных
std::string table_name; // OK - строчные буквы с подчёркиванием
std::string tableName; // Плохо - смешанный стиль
Члены данных класса
Члены данных классов, статические и нестатические, именуются как обычные переменные с добавлением подчёркивания в конце.
class TableInfo < . private: std::string table_name_; // OK - подчёркивание в конце static Pool* pool_; // OK. >;
Члены данных структуры
Члены данных структуры, статические и нестатические, именуются как обычные переменные. К ним не добавляется символ подчёркивания в конце.
struct UrlTableProperties < std::string name; int num_entries; static Pool* pool; >;
См. также Структуры vs Классы, где описано когда использовать структуры, когда классы.
Имена констант
Объекты объявляются как constexpr или const, чтобы значение не менялось в процессе выполнения. Имена констант начинаются с символа «k», далее идёт имя в смешанном стиле (прописные и строчные буквы). Подчёркивание может быть использовано в редких случаях когда прописные буквы не могут использоваться для разделения. Например:
const int kDaysInAWeek = 7; const int kAndroid8_0_0 = 24; // Android 8.0.0
Все аналогичные константные объекты со статическим типом хранилища (т.е. статические или глобальные, подробнее тут: Storage Duration) именуются также. Это соглашение является необязательным для переменных в других типах хранилища (например, автоматические константные объекты).
Имена функций
Обычные функции именуются в смешанном стиле (прописные и строчные буквы); функции доступа к переменным (accessor и mutator) должны иметь стиль, похожий на целевую переменную.
Обычно имя функции начинается с прописной буквы и каждое слово в имени пишется с прописной буквы.
void AddTableEntry(); void DeleteUrl(); void OpenFileOrDie();
(Аналогичные правила применяются для констант в области класса или пространства имён (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), это тип. Следовательно, используется смешанный стиль.
enum UrlTableErrors < kOk = 0, kErrorOutOfMemory, kErrorMalformedInput, >; enum AlternateUrlTableErrors < OK = 0, OUT_OF_MEMORY = 1, MALFORMED_INPUT = 2, >;
Вплоть до января 2009 года стиль именования значений перечисления был как у макросов. Это создавало проблемы дублирования имён макросов и значений перечислений. Применение стиля констант решает проблему и в новом коде предпочтительно использовать стиль констант. Однако, старый код нет необходимости переписывать (пока нет проблем дублирования).
Имена макросов
Вы ведь не собираетесь определять макросы? На всякий случай (если собираетесь), они должны выглядеть так:
MY_MACRO_THAT_SCARES_SMALL_CHILDREN_AND_ADULTS_ALIKE.
Пожалуйста прочтите как определять макросы; Обычно, макросы не должны использоваться. Однако, если они вам абсолютно необходимы, именуйте их прописными буквами с символами подчёркивания.
#define ROUND(x) . #define PI_ROUNDED 3.0
Исключения из правил именования
Если вам нужно именовать что-то, имеющее аналоги в существующем C или C++ коде, то следуйте используемому в коде стилю.
bigopen()
имя функции, образованное от open()
uint
определение, похожее на стандартные типы
bigpos
struct или class, образованный от pos
sparse_hash_map
STL-подобная сущность; следуйте стилю STL
LONGLONG_MAX
константа, такая же как INT_MAX
Прим.: ссылки могут вести на ещё не переведённые разделы руководства.
- C++
- styleguide
- перевод с английского
Как называть переменные

Для меня основной критерий хорошего когда — его читаемость. Поэтому важно чтобы переменные, функции и методы легко читались и понимались. Далее я расскажу как я называю переменные и что мне в этом помогает.
Строки
Традиционно название строковой переменной — существительное. Как и везде, мы должны понимать что находится в переменной по её названию. Со строкой сложно напортачить, используйте существительные и давайте более осмысленные имена, например:
const serverMessage = 'hello from server' const componentHtml = 'Hello
' const login = 'username' const password = 'qwerty' const ACCESS_TOKEN = 'xxxxx'
Числа
- код чего-либо (code)
- размер (size, length)
- номер (number)
- количество (count)
Использование этих слов привычно и не вызывает дополнительных вопросов:
const keyCode = 17 const numberFromEnd = 10 const maxWindowSize = 800 const minCharacterLength = 10 const newMessageCount = 2
Булевое значение
Лучшее название для булевой переменной — вопрос с ответом да-нет. Так-же часто встречаются в виде префиксов и суфиксов слова:
- это (is)
- содержит (has/contain)
- может (can)
- должен (shoud)
- возможность (able)
const isPopupOpen = true; const hasUpperLetters = true; const containsObject = false; const shouldUpdate = false; const disabled = true;
Массивы
Массивы это существительные во множественном числе. Оканчиваются на суффиксы s и es.
const users = [ name: 'Yury'>]; const letters = ['A', 'B', 'C']; const codes = [21, 37];
Объекты
Так-же как и строки. Мне это не очень нравится, т.к. нельзя сразу-же отличить строку от объекта. Можно добавлять суффикс obj, но это мне кажется уже лишним.
Важное правило, не дублируйте название объекта в названии свойства или метода:
// Плохо const user = userName: 'test', getUsername() <>, >; // Хорошо const user = name: 'test', getName() <>, >;
Функции и методы
Для функций первое слово глагол:
- init/initialize
- compute
- find
- create (object, array…)
- to (string, array…)
- filter
const initApp = () => <>; const computeMaxHeight = () => <>; const findClosestElement = () => <>; const toString = () => <>; const filterUsers = () => <>;
Симметричные пары
Общие:
- old/new
- begin/end
- first/last
- up/down
- min/max
- next/previous
Для функций:
- get/set
- add/remove
- create/destroy
- start/stop
- insert/delete
- increment/decrement
- open/close
- show/hide
- suspend/resume
Если вы новичек в программировании, или плохо знакомы с английским языком, то вот вам лайфхак:
- Хорошо подумайте и назовите переменную на русском языке
- Переведите её через Google Translate
Это все что я хотел сказать о переменных. Для дополнительного чтения советую статью 90 рекомендаций по стилю написания программ на C++.
Я что-то забыл или где-то ошибся, напишите об этом в комментариях. Спасибо.
Еше можно подписаться на email рассылку новых заметок. Не чаще раза в неделю, без спама.
![Код. Плейсхолдер для [contenteditable]](https://ymatuhin.ru/assets/img/contenteditable.jpg)
Код. Плейсхолдер для [contenteditable]
Placeholder полифил для contenteditable элемента

Плавный, нативный скрол
Выкиньте лишние библиотеки для прокрутки внутри страницы

Лайфхак. Номер телефона на сайте
Надоели звонки от клиентов в 2 часа ночи? Покажите номер телефона на сайте только в рабочее время. Подробности в статье.

На чем тестировать JavaScript фреймворки
На чем испробовать новую технологию или фреймоврк если нет сайд/пет проекта? Пара интересных задачек в этой заметке.