LINUX.ORG.RU

Как вы называете переменные и не только?

 ,


1

2

Привет

Есть ли у вас правила именования переменных и не только для следующих кейсов?

Case 1. Предположим есть некие объекты. Есть функция, которая должна что-то сделать с объектом, например вызываем её вот так: fn(obj). Как понять, аргумент функции - сам объект, указатель на объект, или индекс объекта в каком-то массиве? А как на счет массива индексов? Я понимаю, что можно посмотреть объявление obj (в тех языках, где оно есть), но если это посредине кода, то хочется как-то понять из имени: облегчило бы чтение кода. Думал про obj/iObj/pObj или obj/obj_i/obj_ptr, но может есть лучшие идеи?

Case 2. Функция-член класса. Как по имени различить локальные переменные, глобальные переменные, переменные-члены класса?

Case 3. У вас есть правила именования, которые бы по имени позволяли различать переменную, тип, класс, функциу, макрос и т. п? Я пока переменные называю с маленькой буквы, функции - с большой, макросы - все большие, а вот типы/классы пока называют TType и CClass, но у многих это вызывает отвращение. Варианты получше есть?

★★★★★

В hlsdk такая венгерка:
g_ - глобалки
m_ - мемберы
p - указатель
rg - массив
Далее тип если он примитивный, например fl-float, b - byte, f - boolean/flag, i - int, vec - вектор, sz - null-terminated string
Иногда это кажеися избыточным.
Например, мембер массив указателей на строки будет:
m_rgpszFoo

mittorn ★★★★★
()

В /dev/

  • Именно поэтому я обожаю венгерскую нотацию. А ещё стараюсь придерживаться правила — тип переменной должен быть объявлен в пределах одного экрана, если это не член класса;
  • Венгерская нотация (так, как я её использую):
    • Локальные переменные не обозначаю никак;
    • Члены класса имеют префикс «m_»: int m_foo;
    • Указатели дополнительно имеют префикс «p» и, если тип нестандартный, сокращённый тип: int *pFoo; Object *m_pobjBar;
    • Глобальные объекты имеют префикс «_»: int _globObj;
XMs ★★★★★
()

Век живи век учись
Всем спасибо, попробую.

Kroz ★★★★★
() автор топика

Так вот как размножаются люди, использующие венгерскую нотацию.

Линус Торвальдс будет очень недоволен этим тредом.

EXL ★★★★★
()

именую по смыслу, чтобы удобно читать.

единственное - сущности local-scope всегда с маленькой буквы, иные с Большой. И традиционно в С макросы и константы ЗАГЛАВНЫЕ

PS/ за венгерскую нотацию надо в тёмной подворотне долго бить ногами :-) не должно имя сущности нести в себе признаков её типа и отношений.

MKuznetsov ★★★★★
()

Как понять, аргумент функции - сам объект, указатель на объект, или индекс объекта в каком-то массиве?

По типу переменной // К.О.

Если функция настолько велика, что не влазит на один экран, ее надо рефакторить

annulen ★★★★★
()
Ответ на: комментарий от MKuznetsov

именую по смыслу, чтобы удобно читать.

В топике 3 кейса. Приведи пример как бы ты назвал переменные и др.

Kroz ★★★★★
() автор топика
Ответ на: комментарий от annulen

По типу переменной // К.О.

А когда в одной функции используются как объекты, так и их индексы и указатели?

А еще есть языки, где переменные не объявляются, тот же js, python и т. п. как с ними быть?

И как ты решаешь Case 2 и Case 3?

Kroz ★★★★★
() автор топика
Ответ на: комментарий от XMs

Горите в аду с такими наименованиями!

Идите учите, что такое семантический разрыв, быдлокодеры!

anonymous
()
Ответ на: комментарий от XMs

Глобальные объекты имеют префикс «_»:

Лол. У тебя сплошное UB. https://timsong-cpp.github.io/cppwp/n4659/lex#name-3

In addition, some identifiers are reserved for use by C++ implementations and shall not be used otherwise; no diagnostic is required.
— Each identifier that contains a double underscore __ or begins with an underscore followed by an uppercase letter is reserved to the implementation for any use.
— Each identifier that begins with an underscore is reserved to the implementation for use as a name in the global namespace.

anonymous
()
Ответ на: комментарий от XMs

Глобальные объекты имеют префикс «_»: int _globObj;

In addition to the names documented in this manual, reserved names include all external identifiers (global functions and variables) that begin with an underscore (‘_’) and all identifiers regardless of use that begin with either two underscores or an underscore followed by a capital letter are reserved names. This is so that the library and header files can define functions, variables, and macros for internal purposes without risk of conflict with names in user programs.

(c) https://www.gnu.org/software/libc/manual/html_node/Reserved-Names.html

Ну и в целом, венгерская нотация - нечитабельное УГ.

Deleted
()
Ответ на: комментарий от Kroz

А когда в одной функции используются как объекты, так и их индексы и указатели?

Для индекса я использую суффикс Idx, считаю это допустимым применением венгерской ереси. Отличать указатели от объектов не имеет смысла, так как в объявлении типа переменной все сказано

А еще есть языки, где переменные не объявляются, тот же js, python и т. п. как с ними быть?

Вообще языки с такой фичей посасывают, как по читаемости, так и по возможности захвата локальных переменных в лямбды. Предпочитаю perl, где в strict-режиме все объявления явные :) Но ни в питоне, ни в жопоскрипте нет отдельных указателей на объекты, поэтому и отличать нечего, а с индексами см. п1

annulen ★★★★★
()
Ответ на: комментарий от Kroz

В принципе с динамической типизацией венгерка имеет какое-то право на жизнь

annulen ★★★★★
()
Ответ на: комментарий от Deleted

Если в рамках одной единицы трансляции, одинарное подчёркивание с последующей строчной — можно. Extrn делать не надо, только и всего.

И да, я знаю, что в твоей цитате это и написано, но почему-то многие считают, что все идентификаторы с подчёркиванием в начале — зарезервированы.

i-rinat ★★★★★
()

case 1

Подбираю имена так, чтобы было понятно. Когда фантазия кончается, в ход идут p, ptr, src, dst и тому подобные суффиксы и префиксы.

case 2

Имена полей класса оканчиваюися на _, то есть ptr_, sz_, data_, filename_. Локальные переменные и параметры методов никогда в названии на имеют последним символом _. Такое — только для полей класса. У структур тоже в конце имён полей _ быть не должно.

case 3

Просто названия с большой буквы, одной. Добавлять C всем классам не обязательно: File f{"input.txt"};.

i-rinat ★★★★★
()
Ответ на: комментарий от intelfx

Там нет extrn. Если переменная внутри безымянного пространства имён или static, то она не попадает наружу единицы трансляции, и такие переменные не зарезервированы.

i-rinat ★★★★★
()
Ответ на: комментарий от XMs

_ вообще зарезервирован. g_ для глобалок очевиднее.

Ну и s_ для статики до кучи.

a1batross ★★★★★
()
Ответ на: комментарий от anonymous

Найди определение «глобальных» объектов в стандарте. :)

Я знаю как минимум две трактовки «глобальный объект». Ты используешь одну, и не допускаешь мысли, что кто-то другой может использовать другую.

i-rinat ★★★★★
()
Ответ на: комментарий от intelfx

Если объявишь так, чтобы был external linkage, будет external linkage.

Но о людях сначала нужно думать хорошо, а не считать по умолчанию, что они делают плохое.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Но о людях сначала нужно думать хорошо, а не считать по умолчанию, что они делают плохое.

В C++ оправдано второе.

anonymous
()
Ответ на: комментарий от mittorn

Дополню плюсами и минусами венгерской нотации:
Минусы:
1. Избыточная информация. У переменной есть тип и его можно посмотреть в IDE
2. При изменении типа переменную нужно переименовывать
3. Имя может не моответствовать типу и вводить в заблуждение
Плюсы:
1. Если редактируешь код без ide, проще понять какой тип у переменной и где её искать
2. Меньше коллизий при переименовании чего-либо автозаменой
3. При изменении типа в IDE переименовал все использования. Делаешь git diff, смотришь всё ли нормально после переименования
4. Видно тип даже если использовал auto

mittorn ★★★★★
()
Ответ на: комментарий от mittorn

Ещё в минусы (редактирование на лоре сломали)
Вызывает привыкание
В разных проектах разная венгерка, могут быть несоответствия и даже коллизии. Ещё одно место для различия стиля кода

mittorn ★★★★★
()
Ответ на: комментарий от anonymous

Each identifier that begins with an underscore is reserved to the implementation for use as a name in the global namespace

Век живи, век учись. Я думал, зарезервированы только с двумя подчёркиваниями.

Справедливости ради, глобальные переменные — зло, поэтому я их почти не использую

XMs ★★★★★
()
Ответ на: комментарий от intelfx

Там пример без static только затем, чтобы придерживаться формата «тип имя». А в жизни я глобальные переменные почти не использую (по крайней мере, не могу вспомнить, когда приходилось ими пользоваться последний раз)

XMs ★★★★★
()
Ответ на: комментарий от i-rinat

Как я уже ответил чуть выше, не могу вспомнить, когда последний раз ими пользовался. ЕМНИП, это было что-то для микроконтроллера, а значит, к этим сорцам у меня доступа уже нет

XMs ★★★★★
()

Как понять, аргумент функции - сам объект, указатель на объект, или индекс объекта в каком-то массиве?

Посмотреть документацию или объявление функции. Для нормальных языков программирования давно есть тулзы, которые самостоятельно генерируют документацию из исходного кода. Так же в нормальных языках можно натравить компилятор на вызов с неверными параметрами.

Функция-член класса. Как по имени различить локальные переменные, глобальные переменные, переменные-члены класса?

Использовать языки программирования, где обращение к членам класса/полям рекорда происходит явно.

Варианты получше есть?

Константы в UPPER_CASE, переменные/функции в snake_case/camelCase, имена типов в CapitalizedCamelCase. Имя макроса заканчивается восклицательным знаком.

Глобальные мутабельные переменные естественно должны быть забанены. Функции > 50 строк тоже.

Nexmean
()

Как понять? В комментарии пиши, что за фигня - аргумент (in/out/inout)!

anonymous
()
Ответ на: комментарий от mittorn

Есть венгерка. Её хватит всем

Но не всем нужна. В документации MSDN её применение оправданно, так как примеры являются частью документации. Но она мало кому нравится - выглядит уродливо и ухудшает читаемость. Не видел, чтобы этот стиль применялся в учебниках по C/C++.

Когда программировал на C/C++, предпочитал стиль Camel Case, как хорошо читаемый.

Если есть коллектив программистов, то им нужно договориться между собой, какой стиль использовать. Отсутствие единообразия неудобно. Но если какой-нибудь идиот станет навязывать венгерскую нотацию, то в мягкой форме объяснить ему, что возможны другие варианты.

Partisan ★★★★
()

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

peregrine ★★★★★
()
Ответ на: комментарий от Partisan

ну я потому и перечислил это в минусах. Но если есть надобность в венгерке и это мелкий личный проект который часто подпиливаешь быстренько в nano через ssh, она точно не помешает. В крупных же решает общее мнение. Современные открытые проекты редко используют венгерку.

mittorn ★★★★★
()

В разработке ПО есть 2 главных затруднения:

  • Именование сущностей
  • Инвалидация кэша
  • Ошибка на единицу

По теме - если не понятно из контекста, то или код или имя - уг.

pon4ik ★★★★★
()

Как понять, аргумент функции - сам объект, указатель на объект, или индекс объекта в каком-то массиве?

Пишущему вызов функции - юзать нормальную IDE с подсказками.

Читающему вызов функции -

сам объект vs указатель на объект

при нормальном дизайне индиффирентно,

индекс объекта

по названию переменной/константы, которую ты в функцию передаёшь. objectIndex или как-то так.

Думал про obj/iObj/pObj или obj/obj_i/obj_ptr

Гореть в аду.

Как по имени различить локальные переменные

Начинаются с маленькой буквы.

глобальные переменные, переменные-члены класса?

Являются взаимоисключающими в рамках одной программы. Оба можно начинать с префикса «_».

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

Начинаются с маленькой буквы/«_».

тип, класс

Начинаются с большой буквы.

функциу

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

макрос

Большими буквами через подчёркивание.

Под начинаются с маленькой/большой буквы следует понимать camelCase/PascalCase.

Esper
()

Ппц, что я только что прочитал?! Школьник опять угнал 5 звездочный аккаунт?

fn(obj)

Вон из профессии!

Как понять, аргумент функции - сам объект, указатель на объект, или индекс объекта в каком-то массиве

Вон из профессиии!!

Я пока переменные называю с маленькой буквы, функции - с большой

ААаа! ВВвооон из проффеессии!!!

бомбануло

Deleted
()
Последнее исправление: rj45 (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

но человеческого IDE работающего в терминале до сих пор нет. vi и emacs для осьминогов. Выкручиваемся как можем

mittorn ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.