Перейти к содержанию

Именование переменных С++


Antonshka

Рекомендуемые сообщения

Привет всем, подскажите, как лучше называть переменные?

Пишу С++ библиотеку, WinAPI Wrapper для контролов. Кнопки, чекбоксы, трекбары...

Но вот встал вопрос, что если у меня есть enum class AnchorAlign, или enum class TextAlign, то получается, эти имена уже нельзя будет использовать тому кто будет писать приложение.

Пробовал с namespace. wgw::AnchorAlign, - но получается долгий набор, 5 лишних символов плюс клавиша shift.

Пробовал wgwAnchorAlign, - но смотрится тяжело, не сразу понятно что это.

Если wgw_AnchorAlign, то тоже не очень.

Если в конце,  AnchorAlignwgw, совсем не то.

WGWAnchorAlign, и так плохо.

Думал попробовать wgAnchorAlign, как делают для wxWidgets, но тоже, лишние буквы.

 

Для меня самое лучшее это так и оставить, AnchorAlign, а там уже, тот кто будет писать приложение, пускай все свои переменные помещает в неймспейсы.

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

Ссылка на комментарий
Поделиться на другие сайты

Посмотрел, ImGui использует неймспейс, ImGui. Библиотека std тоже неймспейс, std. Решил что и я, буду использовать неймспейс, WGW. Неудобно, но что поделать.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Используете ли вы префикс m_ перед именем переменной, например перед именем поля класса?

 

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

Так я обычно писал имена переменных

m_HosterWindow->Dock.m_LeftMainContainer->m_ChildContainer->m_LastBrotherContainer = m_HosterWindow->Dock.m_LeftMainContainer->m_ChildContainer->m_LastBrotherContainer->m_BrotherContainer;

 

Но сегодня я наконец-то понял что имена можно немного сократить , получилось это

m_host->dock.m_leftCnt->m_child->m_lastBrother = m_host->dock.m_leftCnt->m_child->m_lastBrother->m_brother;

 

А если убрать еще и префик _m, то читать становится

host->dock.leftCnt->child->lastBrother = host->dock.leftCnt->child->lastBrother->brother;

 

Этот префик _m как мощки перед глазами. Хотя я и понимаю что он введен для удобства различать поля класса от локальных переменных.

Без него лучше, - легче читать, но с ним опять меньше шансов спутать поле и локальную переменную...

 

Ссылка на комментарий
Поделиться на другие сайты

11 часов назад, Antonshka сказал:

он введен для удобства различать поля класса от локальных переменных

Венгерская нотация была введена в те времена, когда толковых IDE не было. Уже давно ее использование перестало быть необходимым. А в некоторых компаниях и вовсе считается моветоном. Но при этом есть немало компаний, которые продолжают использовать такой стиль, и считают это нормальным. Лично на мой взгляд префикс m_  не нужен, и стараюсь его не использовать, когда пишу что-то на плюсах.

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Xipho сказал:

Венгерская нотация была введена в те времена, когда толковых IDE не было. Уже давно ее использование перестало быть необходимым. А в некоторых компаниях и вовсе считается моветоном. Но при этом есть немало компаний, которые продолжают использовать такой стиль, и считают это нормальным. Лично на мой взгляд префикс m_  не нужен, и стараюсь его не использовать, когда пишу что-то на плюсах.

А как ты пишешь имена параметров функции и имена простых локальных переменным, на С++.

Например, у меня есть класс Window, а у него есть поле hWnd (это если теперь без _m). То как назвать параметр в конструкторе для поля hWnd?

У меня было поле с именем m_hWnd, а параметр с именем hWnd.

Пишешь ли ты все имена переменных в стиле "someVarName"?

 

*************************************************************

Сейчас посмотрел твои исходники на гитхабе. Например есть место

struct VFHookInfo
{
  VFHookInfo(DWORD _index, DWORD cb, DWORD* _origFunc) : index(_index), callback(cb), origFunc(_origFunc) {}
  DWORD index, callback;
  DWORD* origFunc;
};

Здесь у тебя только у параметра "cb" нет подчеркивания, у остальных двух есть.

В других местах у тебя иногда совсем нет подчеркивания у параметров.

 

Я сегодня еще прочитал на одном сайте что подчеркивание перед переменной не рекомендуется

Спойлер

Mr.TyanVary
> никак нельзя назвать аргумент _i
Вроде как согласно стандарта использование символа '_' перед именем отдается на усмотрение компилятора, он может использовать его для своих нужд - из-за чего могут появится конфликты, в жизни не видел такого, но делать так не  рекомендуют

 

war_zes
Очень странно, открыл stdio - куча констант с именами начинающимися с '__' и куча названий функций. В vector тоже самое.

 

Mr.TyanVary
> Очень странно, открыл stdio - куча констант с именами начинающимися с '__' и
> куча названий функций. В vector тоже самое.
Вот про это я и говорил. Черточка отдана разработчику компилятора чтобы он ее использовал в своих функциях. stdio не ты же написал а (в случае VS) Microsoft. При этом stdio - Си, а значит никаких пространств имен, вот и юзают везде и всюду эту черточку, а в стандарте прописали что она для разработчиков компиляторов

 

 

Изменено пользователем Antonshka
Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, Antonshka сказал:

Здесь у тебя только у параметра "cb" нет подчеркивания, у остальных двух есть.

Компиляторы достаточно умные сейчас.
Даже если я напишу так:
 

Спойлер
struct Point
{
	float x, y, z, w;
	Point(float x, float y, float z, float w)
	{
		x = x; y = y; z = z; w = w;
	}
};

 

никаких проблем не будет. 

Изменено пользователем KRYPTOPUNK
Ссылка на комментарий
Поделиться на другие сайты

32 минуты назад, KRYPTOPUNK сказал:

Компиляторы достаточно умные сейчас.

У меня в Microsoft VS 2022 при наведении на первый и второй "x"

x(первый) = x(второй); y = y; z = z; w = w;

отображается "(parameter)float x". И цвет у них обоих один, серый. А поля структуры черные. (стоят дефолтные настройки среды).

 

И опять же, что если мне нужно получить значение из "х", которое поле класса, придется писать через this->x, или Point::x.

Или получить значение параметра "x", - ну тут он имеет приоритет. Путаница визуальная также.

 

После нелегких проб и раздумий, я решил все имена параметров функций завершать нижним подчеркиванием

Button(BOOL isVisible_, DWORD exStyle_, DWORD style_, LPCWSTR name_, INT xPos_, INT yPos_, INT width_, INT height_, Window* parent_)

Имена полей класса писать в стиле "someClassFieldName".

Имена простых локальных переменных в стиле "someLocalVarName".

Имена любых функций в стиле "SomeFuncName".

Имена классов в стиле "SomeClassName".

И никаких m_, s_, g_, iVar, fRatio, pMatrix.

Ссылка на комментарий
Поделиться на другие сайты

41 минуту назад, Antonshka сказал:

отображается "(parameter)float x".

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

41 минуту назад, Antonshka сказал:

И опять же, что если мне нужно получить значение из "х", которое поле класса, придется писать через this->x, или Point::x.

Зачем тебе в конструкторе класса может понадобиться получить значение из поля объекта? Не нужно так делать. 
 

 Можешь глянуть тот же гугловский гаедлайн на тему кодстайла.

И вообще, без разницы, как ты параметры назовёшь, ты их можешь вообще никак не называть) А для избегания путаницы, можно делать так

Спойлер
void func(int A)
{
 a = A; 
}


Учитывая твой пример с огромным количеством аргументов, проще структуру сделать, 
 

Спойлер
struct ButtonData
{
  bool isVisible;
  DWORD exStyle;
  DWORD style;
  LPCWSTR name;
  int xPos;
  int yPos;
  int width;
  int height;
  Window* parent;
}

Button(ButtonData&& data)
{
	isVisible = data.isVisible;
  	exStyle = data.exStyle;
  	style = data.style;
  	name = data.name;
  	xPos = data.xPos;
  	yPos = data.yPos;
  	width = data.width;
  	height = data.height;
   	parent = data.parent
}

и передавать её через move-семантику. и никаких проблем с неймингом. 

Изменено пользователем KRYPTOPUNK
Ссылка на комментарий
Поделиться на другие сайты

33 минуты назад, KRYPTOPUNK сказал:

Зачем тебе в конструкторе класса может понадобиться получить значение из поля объекта? Не нужно так делать.

Например не в конструкторе, а в методе класса. Есть вот такой метод

ExecuteCtrl(HWND& hWnd_, UINT& msg_, WPARAM& wParam_, LPARAM& lParam_)

Он вызывается всякий раз когда система отправляет сообщение окну. Сам класс окна имеет "hWnd" поле, и параметр функции тоже имеет "hWnd". Но здесь я его назвал "hWnd_".

 

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

 

void func(int A)
{
 a = A; 
}

Была мысль такая, но у меня в классе есть публичные переменные (объекты других классов), которые удобнее писать с заглавной буквы. Например  AnchorTop и Anchor

WND_MAIN = new Window(TRUE, 0, 0, L"MainWindowClassName", L"MainWindowName", 100, 200, 500, 500);
WND_MAIN2 = new Window(TRUE, 0, 0, L"AnotherWindowClassName", L"AnotherWindowName", 50, 50, 200, 200, WND_MAIN);
WND_MAIN2->AnchorTop.Anchor = WND_MAIN; //assign an Anchor

 

44 минуты назад, KRYPTOPUNK сказал:

Учитывая твой пример с огромным количеством аргументов, проще структуру сделать,

В моем случае это не будет удобно. Из кода выше это видно.

 

Спасибо за советы.

Ссылка на комментарий
Поделиться на другие сайты

11 часов назад, Antonshka сказал:

Здесь у тебя только у параметра "cb" нет подчеркивания, у остальных двух есть.

Эти исходники писались левой пяткой задней ноги для уроков, и еще куча копипасты, чтобы велосипеды не изобретать, на них полагаться нельзя ) Те исходники, которые я пишу для себя и нормально, в паблике не лежат ) 

Ссылка на комментарий
Поделиться на другие сайты

11 часов назад, Xipho сказал:

Эти исходники писались левой пяткой задней ноги для уроков, и еще куча копипасты, чтобы велосипеды не изобретать, на них полагаться нельзя ) Те исходники, которые я пишу для себя и нормально, в паблике не лежат ) 

А как тогда ты пишешь для себя и нормально имена параметров и имена полей класса, если они по смыслу одно и тоже?

Я вот вчера попробовал писать "someParameter_", и начал уже переписывать проект, но немного погодя, я решил сделать "_someParameter".

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, Antonshka сказал:

А как тогда ты пишешь для себя и нормально имена параметров и имена полей класса, если они по смыслу одно и тоже?

Пишу одинаково. А там, где надо записать данные из одноименного параметра в поле класса, использую явное this->field

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Xipho сказал:

Пишу одинаково. А там, где надо записать данные из одноименного параметра в поле класса, использую явное this->field

Понятно.

Так же что-ли делать. Но я уже весь проект переписал на нижнее подчеркивание.

Хотя ни тот ни это варианты мне не нравятся

Спойлер
xPos = _xPos;
yPos = _yPos;
width = _width;
height = _height;

this->xPos = xPos;
this->yPos = yPos;
this->width = width;
this->height = height;

 

 

Ссылка на комментарий
Поделиться на другие сайты

В 08.03.2022 в 9:09 PM, Antonshka сказал:

Используете ли вы префикс m_ перед именем переменной, например перед именем поля класса?

 

не использую никаких префиксов и стараюсь именовать всё так, чтобы было хоть немного ясно назначение переменных/методов и т.п. Пишу названия вотТакВот, в том числе если они получаются длинными, из трёх-четырёх слов. В твоём примере написал бы в зависимости от ситуации или this->xPos = xPosNew или xPos = xPosNew или же вообще x= xNew. Ну или что-то ещё подобное. 

Ссылка на комментарий
Поделиться на другие сайты

9 часов назад, youneuoy сказал:

не использую никаких префиксов и стараюсь именовать всё так, чтобы было хоть немного ясно назначение переменных/методов и т.п. Пишу названия вотТакВот, в том числе если они получаются длинными, из трёх-четырёх слов. В твоём примере написал бы в зависимости от ситуации или this->xPos = xPosNew или xPos = xPosNew или же вообще x= xNew. Ну или что-то ещё подобное. 

Согласен, эти префиксы мне тоже не нравятся. У меня был выбор, либо префикс, либо каждый раз при оформлении аргументов, придумывать различаемые имена. Через сильное "не хочу" пришлось выбрать префикс.

Ссылка на комментарий
Поделиться на другие сайты

В 11.03.2022 в 1:12 PM, Antonshka сказал:

У меня был выбор, либо префикс, либо каждый раз при оформлении аргументов, придумывать различаемые имена

Если ты пишешь опенсорс фреймворк, хорошим стилем будет следование общепринятым код конвенциям C++.

Ссылка на комментарий
Поделиться на другие сайты

10 часов назад, Xipho сказал:

Если ты пишешь опенсорс фреймворк, хорошим стилем будет следование общепринятым код конвенциям C++.

Да, это будет,  если будет, наподобие wxWidgets, но только для Windows.

Стараюсь следовать, по несколько раз переписывал уже код. Дошел даже до того, что расположил все поля и методы класса в алфавитном порядке. В .h и .cpp.

Единственное чему не следую, - я все имена параметров функции решил писать с подчеркиванием вначале. И это удобно.

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.