Использовать ли префиксы в именах переменных?
Изучаю я WinApi и почти все структуры определяются так:
typedef struct tagWNDCLASSEXW {
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCWSTR lpszMenuName;
LPCWSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEXW, *PWNDCLASSEXW, NEAR *NPWNDCLASSEXW, FAR *LPWNDCLASSEXW;
У всех названий полей есть префиксы cb, h, lpsz и т.д.
Используется ли сейчас данный стиль в обычном коде или он устарел?
Ответы (3 шт):
Ответ от Harry:
Чисто вкусовое решение. Если ваша команда приняла то или иное соглашение об именовании - придерживайтесь его. Если программируете в одиночку - решите сами, как вам удобнее, чтобы было в первую очередь понятно.
У всех по разному, но я расскажу как у нас.
- Запрещается менять стиль написания программы.
- Если используется Венгерская нотация то она такой и останется.
- Код пишется так что не определишь чей либо почерк. Имена переменных, классов, модулей ... придерживаютя стиля заложенного в самом начале. Счастье если оно было заложено грамотно в самом начале.
Это называется венгерской нотацией. Её суть в том, чтобы добавлять префиксы в зависимости от типа или смысла какого-либо имени (переменной/поля/типа/…).
Плюсы:
- В имени отображается тип/смысл именуемого, что при неявном апкасте всего и вся можно сложить не то с не тем, например, указатель с символом.
- Является контейнером с универсальными и устоявшимися сокращениями
Минусы:
- Ухудшает читаемость (субъективно)
- Современные текстовые редакторы нативно отображают тип именуемого и могут очень быстро перемещаться по коду, что ставит под сомнение 1-й плюс
- Есть альтернатива: добавление ключевых слов, по типу is, can, index, -s, и т. д. В отличие от префиксов они достаточно органично вписываются в имя (
Succeeded→IsSucceeded,Number→Numbers(массив)).
Венгерская нотация достаточно субъективна, чтобы сказать, что её необходимость определяете конкретно вы/ваша команда.
Лично я не использую венгерскую нотацию – использую альтернативу из минуса #3: мне этого вполне хватает. Думаю, можно назвать переменную нормально, чтобы её понимали все и без всяких префиксов (я согласен с актуальностью минуса #1). Т. е. я согласен со всеми (указанными выше) минусами венгерской нотации.
В WinAPI она используется, по причине неактуальности минуса #2: WinAPI писалось давно, и тогда не было современных текстовых редакторов – венгерская нотация стала для разработчиков из Microsoft панацеей. Можно заметить, что в современных разработках от Microsoft венгерская нотация (за редким исключением) не используется. Самый яркий пример, это C# и .NET: минус #2 актуален, а плюс #1 не имеет смысла. Следовательно, если уже говорить о венгерской нотации, то вопрос там (C#, .NET) стоит 1: использовать ли альтернативу из минуса #3 (нужно заметить, что у Microsoft по этому поводу однозначного мнения нет (IAsyncResult.IsCompleted, Socket.Connected)).