Antonshka Опубликовано 24 февраля, 2022 Поделиться Опубликовано 24 февраля, 2022 Привет всем, подскажите, как лучше называть переменные? Пишу С++ библиотеку, WinAPI Wrapper для контролов. Кнопки, чекбоксы, трекбары... Но вот встал вопрос, что если у меня есть enum class AnchorAlign, или enum class TextAlign, то получается, эти имена уже нельзя будет использовать тому кто будет писать приложение. Пробовал с namespace. wgw::AnchorAlign, - но получается долгий набор, 5 лишних символов плюс клавиша shift. Пробовал wgwAnchorAlign, - но смотрится тяжело, не сразу понятно что это. Если wgw_AnchorAlign, то тоже не очень. Если в конце, AnchorAlignwgw, совсем не то. WGWAnchorAlign, и так плохо. Думал попробовать wgAnchorAlign, как делают для wxWidgets, но тоже, лишние буквы. Для меня самое лучшее это так и оставить, AnchorAlign, а там уже, тот кто будет писать приложение, пускай все свои переменные помещает в неймспейсы. Пол дня безрезультатно потратил на то как назвать переменные. Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 24 февраля, 2022 Автор Поделиться Опубликовано 24 февраля, 2022 Посмотрел, ImGui использует неймспейс, ImGui. Библиотека std тоже неймспейс, std. Решил что и я, буду использовать неймспейс, WGW. Неудобно, но что поделать. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 25 февраля, 2022 Поделиться Опубликовано 25 февраля, 2022 Неймспейс - это как раз та самая штука, которая была придумана в плюсах для того, чтобы можно было использовать любые имена. Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 8 марта, 2022 Автор Поделиться Опубликовано 8 марта, 2022 Используете ли вы префикс 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 как мощки перед глазами. Хотя я и понимаю что он введен для удобства различать поля класса от локальных переменных. Без него лучше, - легче читать, но с ним опять меньше шансов спутать поле и локальную переменную... Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 9 марта, 2022 Поделиться Опубликовано 9 марта, 2022 11 часов назад, Antonshka сказал: он введен для удобства различать поля класса от локальных переменных Венгерская нотация была введена в те времена, когда толковых IDE не было. Уже давно ее использование перестало быть необходимым. А в некоторых компаниях и вовсе считается моветоном. Но при этом есть немало компаний, которые продолжают использовать такой стиль, и считают это нормальным. Лично на мой взгляд префикс m_ не нужен, и стараюсь его не использовать, когда пишу что-то на плюсах. Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 9 марта, 2022 Автор Поделиться Опубликовано 9 марта, 2022 (изменено) 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 - Си, а значит никаких пространств имен, вот и юзают везде и всюду эту черточку, а в стандарте прописали что она для разработчиков компиляторов Изменено 9 марта, 2022 пользователем Antonshka Ссылка на комментарий Поделиться на другие сайты Поделиться
KRYPTOPUNK Опубликовано 9 марта, 2022 Поделиться Опубликовано 9 марта, 2022 (изменено) 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; } }; никаких проблем не будет. Изменено 9 марта, 2022 пользователем KRYPTOPUNK Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 9 марта, 2022 Автор Поделиться Опубликовано 9 марта, 2022 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. Ссылка на комментарий Поделиться на другие сайты Поделиться
KRYPTOPUNK Опубликовано 9 марта, 2022 Поделиться Опубликовано 9 марта, 2022 (изменено) 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-семантику. и никаких проблем с неймингом. Изменено 9 марта, 2022 пользователем KRYPTOPUNK Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 9 марта, 2022 Автор Поделиться Опубликовано 9 марта, 2022 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 сказал: Учитывая твой пример с огромным количеством аргументов, проще структуру сделать, В моем случае это не будет удобно. Из кода выше это видно. Спасибо за советы. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 9 марта, 2022 Поделиться Опубликовано 9 марта, 2022 11 часов назад, Antonshka сказал: Здесь у тебя только у параметра "cb" нет подчеркивания, у остальных двух есть. Эти исходники писались левой пяткой задней ноги для уроков, и еще куча копипасты, чтобы велосипеды не изобретать, на них полагаться нельзя ) Те исходники, которые я пишу для себя и нормально, в паблике не лежат ) Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 10 марта, 2022 Автор Поделиться Опубликовано 10 марта, 2022 11 часов назад, Xipho сказал: Эти исходники писались левой пяткой задней ноги для уроков, и еще куча копипасты, чтобы велосипеды не изобретать, на них полагаться нельзя ) Те исходники, которые я пишу для себя и нормально, в паблике не лежат ) А как тогда ты пишешь для себя и нормально имена параметров и имена полей класса, если они по смыслу одно и тоже? Я вот вчера попробовал писать "someParameter_", и начал уже переписывать проект, но немного погодя, я решил сделать "_someParameter". Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 10 марта, 2022 Поделиться Опубликовано 10 марта, 2022 2 часа назад, Antonshka сказал: А как тогда ты пишешь для себя и нормально имена параметров и имена полей класса, если они по смыслу одно и тоже? Пишу одинаково. А там, где надо записать данные из одноименного параметра в поле класса, использую явное this->field Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 10 марта, 2022 Автор Поделиться Опубликовано 10 марта, 2022 1 час назад, Xipho сказал: Пишу одинаково. А там, где надо записать данные из одноименного параметра в поле класса, использую явное this->field Понятно. Так же что-ли делать. Но я уже весь проект переписал на нижнее подчеркивание. Хотя ни тот ни это варианты мне не нравятся Спойлер xPos = _xPos; yPos = _yPos; width = _width; height = _height; this->xPos = xPos; this->yPos = yPos; this->width = width; this->height = height; Ссылка на комментарий Поделиться на другие сайты Поделиться
youneuoy Опубликовано 10 марта, 2022 Поделиться Опубликовано 10 марта, 2022 В 08.03.2022 в 9:09 PM, Antonshka сказал: Используете ли вы префикс m_ перед именем переменной, например перед именем поля класса? не использую никаких префиксов и стараюсь именовать всё так, чтобы было хоть немного ясно назначение переменных/методов и т.п. Пишу названия вотТакВот, в том числе если они получаются длинными, из трёх-четырёх слов. В твоём примере написал бы в зависимости от ситуации или this->xPos = xPosNew или xPos = xPosNew или же вообще x= xNew. Ну или что-то ещё подобное. Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 11 марта, 2022 Автор Поделиться Опубликовано 11 марта, 2022 9 часов назад, youneuoy сказал: не использую никаких префиксов и стараюсь именовать всё так, чтобы было хоть немного ясно назначение переменных/методов и т.п. Пишу названия вотТакВот, в том числе если они получаются длинными, из трёх-четырёх слов. В твоём примере написал бы в зависимости от ситуации или this->xPos = xPosNew или xPos = xPosNew или же вообще x= xNew. Ну или что-то ещё подобное. Согласен, эти префиксы мне тоже не нравятся. У меня был выбор, либо префикс, либо каждый раз при оформлении аргументов, придумывать различаемые имена. Через сильное "не хочу" пришлось выбрать префикс. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 13 марта, 2022 Поделиться Опубликовано 13 марта, 2022 В 11.03.2022 в 1:12 PM, Antonshka сказал: У меня был выбор, либо префикс, либо каждый раз при оформлении аргументов, придумывать различаемые имена Если ты пишешь опенсорс фреймворк, хорошим стилем будет следование общепринятым код конвенциям C++. Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 13 марта, 2022 Автор Поделиться Опубликовано 13 марта, 2022 10 часов назад, Xipho сказал: Если ты пишешь опенсорс фреймворк, хорошим стилем будет следование общепринятым код конвенциям C++. Да, это будет, если будет, наподобие wxWidgets, но только для Windows. Стараюсь следовать, по несколько раз переписывал уже код. Дошел даже до того, что расположил все поля и методы класса в алфавитном порядке. В .h и .cpp. Единственное чему не следую, - я все имена параметров функции решил писать с подчеркиванием вначале. И это удобно. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения