Хорошие примеры венгерской нотации?

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

Редактировать: Я согласен с тем, что венгерский язык для типов не так уж необходим, я надеюсь на более конкретные примеры, где он повышает удобочитаемость и ремонтопригодность, как Джоэл приводит в своей статье (согласно моему ответу).

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

Lance Roberts 15.03.2013 03:36
БЭМ: Конвенция об именовании CSS
БЭМ: Конвенция об именовании CSS
Я часто вижу беспорядочный код CSS, особенно если проект большой. Кроме того, я совершал эту ошибку в профессиональных или личных проектах и...
16
1
24 787
22
Перейти к ответу Данный вопрос помечен как решенный

Ответы 22

Ответ принят как подходящий

Теперь уже классическая статья, как упоминалось в других венгерских сообщениях, - это статья с сайта Джоэла:

http://www.joelonsoftware.com/articles/Wrong.html

п

(для указателя). Это практически единственный префикс, который я использую. Я думаю, что он многое добавляет к переменной (например, что это указатель), и поэтому к нему следует относиться немного более уважительно.

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

Да, это единственный раз, когда я бы тоже подумал об использовании венгерской нотации.

cheduardo 15.06.2009 15:53

Согласен, хотя мне кажется, что лучше поставить _p в конце. Это значительно упрощает чтение указателей структур, например some_struct_p->some_membersome_struct_p.some_member выделялись бы как явно неправильные (в значении статьи Джоэла)).

hlovdal 27.08.2012 18:58

У меня тоже был похожий вопрос, и я пришел к примерно аналогичным выводам. Запись здесь [осень 2014 г.].

Nick Alexeev 15.03.2015 20:49

Проблема с запросом хороших примеров венгерской нотации заключается в том, что каждый будет иметь собственное представление о том, как выглядит хороший пример. Лично я считаю, что лучший Венгерская нотация - это нет венгерской нотации. Обозначение изначально предназначалось для обозначения предполагаемое использование переменной, а не ее типа, но обычно оно используется для информации о типе, особенно для элементов управления формы (например, txtFirstName для текстового поля для чьего-либо имени). Это делает код менее удобным в обслуживании с точки зрения удобочитаемости (например, «papIn nounTermspapOf nounReadability ») и рефакторинга, когда необходимо изменить тип (в Win32 API есть« lParams », которые изменили тип).

Вероятно, вам стоит вообще не использовать его. Примеры:

  • strFirstName - это может быть просто имя, поскольку очевидно, для чего он нужен, тип не так важен и должен быть очевиден в этом случае. Если это не очевидно, IDE может вам в этом помочь.
  • txtFirstName - это может измениться на FirstNameTextBox или FirstName_TextBox. Он лучше читается, и вы знаете, что это элемент управления, а не только текст.
  • CAccount - C использовался для имен классов в MFC, но вам это действительно не нужно. Счет достаточно хорошо. Имя в верхнем регистре - это стандартное соглашение для типов (и они появляются только в определенных местах, чтобы их не перепутали со свойствами или методами).
  • ixArray (индекс к множество) - ix немного неясен. Попробуйте arrayIndex.
  • usState (небезопасная строка для Состояние) - выглядит как «Штат США». Лучше пойти с state_UnsafeString или что-то в этом роде. Возможно, даже оберните его в класс UnsafeString, чтобы хотя бы сделать его типобезопасным.

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

Lance Roberts 14.10.2008 21:49

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

Nerdfest 30.11.2008 17:41

Стоит упомянуть Общие соглашения об именах в MSDN (msdn.microsoft.com/en-us/library/ms229045.aspx). Они говорят: «Не используйте венгерскую нотацию».

Fernando 08.07.2009 21:33

@ gutofb7: ваша ссылка предназначена для .NET. Это не конкретный вопрос .NET. Мы все должны понять, почему была сделана эта рекомендация (подумайте о «Окне определения кода»), прежде чем пытаться применить этот аргумент для всех сред и языков. Есть места, где правильно используемый AppHungarian является благом, и все другие методы, упомянутые здесь (иерархии классов, использование сверхдлинных имен, информация о типе кодирования там) уступают ему.

Rom 20.09.2009 11:42

В PHP не все типы очевидны только по имени переменной. А как насчет кода сортировки банка $BankSortCode? Это "int" или "строка", потому что в ней есть дефисы? А рост пользователя $UserHeight? Может быть "int", если оно в миллиметрах, но что, если оно в футах / дюймах и является "строкой" для размещения слов feet/inches, " ' или точки? Я использую подчеркивание с camelCase - $int_BankSortCode, $str_UserName, $ary_TeamNames. Ваш ответ на самом деле не подходит для всех языков или сценариев. Хотя я согласен, что это, как вы сами заявили, всего лишь мнение.

James 01.02.2015 09:01

Вы можете привести всевозможные аргументы, которые делают определенные преимущества практики кодирования излишними. Возьмем CamelCase ... Зачем нужно записывать начало переменной в нижнем регистре? Почему следующие слова заглавными? userName = UserName = username, их все так же легко читать и понимать. Последовательность является ключевым моментом, когда вы используете соглашения о кодировании, это самая важная вещь, и предполагать, что венгерская нотация в чем-то хуже, просто игнорировать, что все соглашения о кодировании действительны и полезны, если следовать последовательно.

Mike 06.07.2015 21:07

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

Mark Cidade 06.07.2015 22:06

Адвокат дьявола: лучший пример венгерской нотации - не использовать ее. : D

Мы не получаем никаких преимуществ от использования венгерской нотации с современными IDE, потому что они знают тип. Это добавляет работы при рефакторинге типа для переменной, поскольку имя также должно быть изменено (и большую часть времени, когда вы имеете дело с переменной, вы все равно знаете, какой это тип).

Вы также можете решить проблемы с упорядочиванием нотации. Если вы используете p для указателя и a для адреса, вы называете свою переменную apStreet или paStreet? Читаемость ухудшается, когда у вас нет последовательности, и вам нужно использовать ценное пространство ума, когда вам нужно запомнить порядок, в котором вы должны писать обозначения.

Я согласен с тем, что вам не нужно использовать его для всех типов, я надеюсь на хорошие примеры, подобные приведенным Джоэлом, где он повышает удобочитаемость и удобство использования .;

Lance Roberts 14.10.2008 21:50

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

David Thornley 08.07.2009 21:20

Я считаю, что венгерские обозначения иногда могут быть полезны в динамических языках. Я специально думаю о ActionScript на стороне сервера (по сути, просто javascript), но он может применяться в другом месте. Поскольку информации о реальном типе нет вообще, венгерская нотация иногда может облегчить понимание.

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

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

Еще один трюк в венгерской нотации - «изменить тип переменной, но оставить имя переменной без изменений». Это почти всегда делается в приложениях Windows с переходом с Win16: - WndProc (HWND hW, WORD wMsg, WORD wParam, LONG lParam) на Win32 WndProc (HWND hW, UINT wMsg, WPARAM wParam, LPARAM lParam), где значения w подсказывают что это слова, но на самом деле они относятся к долгам. Настоящая ценность этого подхода становится очевидной с переходом на Win64, когда параметры будут иметь ширину 64 бита, но старые префиксы «w» и «l» останутся навсегда.

ттrong>

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

Я всегда использую только p для указателя, и все. И это только если я использую C++. В C# я не использую венгерскую нотацию. например

MyClass myClass;
MyClass* pMyClass;

Это все :)

Редактировать: Ой, я только что понял, что это ложь. Я также использую "m_" для переменных-членов. например

class
{
private:
bool m_myVar;
}

м

При использовании ORM (например, спящего режима) вы, как правило, имеете дело с управляемыми и неуправляемыми объектами. Изменение управляемого объекта будет отражено в базе данных без явного вызова сохранения, тогда как для работы с управляемым объектом требуется явный вызов сохранения. То, как вы будете обращаться с объектом, будет зависеть от того, какой он есть.

Я считаю, что единственный полезный момент - это объявление элементов управления интерфейсом, txtUsername, txtPassword, ddlBirthMonth. Это не идеально, но помогает в больших формах / проектах.

Я не использую его для переменных или других элементов, только для элементов управления.

Единственный венгерский язык, который действительно полезен, - это m_ для переменных-членов. (Я также использую sm_ для статических членов, потому что это «другая» область, которая все еще существует.) С широкоэкранными мониторами и компиляторами, которые принимают имена переменных длиной восемь миллиардов символов, сокращать имена типов просто не стоит.

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

Да, вы можете «навести указатель мыши» на переменную в своей среде IDE и узнать, что это за класс, но если вы просматриваете несколько тысяч строк кода, вы не хотите останавливаться на эти несколько секунд - каждые ... .. холост .... раз ....

Помните - вы пишете код не только для себя или своей команды. Вы также пишете его для человека, который должен через 2-5 лет подобрать этот код и улучшить его.

это полезно только в том случае, если вы включите легенду для префиксов, иначе они могут быть слишком загадочными для будущего читателя.

Mark Cidade 14.10.2008 22:21

Верблюжья оболочка и венгерская нотация - разные вещи. Camel Casing просто делает ThisWithYourNames (каждое слово начинается с заглавной буквы). Венгерская нотация предполагает добавление идентификатора типа к имени.

Herms 14.10.2008 22:57

Интересно. Первоначально я предполагал, что они одинаковы, потому что мы всегда использовали одни и те же префиксы (str, int, dbl, obj, dat и т. д.), И это было в двух разных местах.

David 15.10.2008 20:25

В дополнение к использованию 'p' для указателя мне нравится идея использования 'cb' и 'cch', чтобы указать, является ли параметр размера буфера (или переменная) количеством байтов или количеством символов (я также видел - редко - 'ce' используется для обозначения количества элементов). Таким образом, вместо передачи типа префикс передает использование или намерение.

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

Я думаю, что ключевой момент, который следует извлечь из статьи Джоэла, приведенной выше, и венгерской нотации в целом - это использовать ее, когда в переменной есть что-то неочевидное.

Один из примеров из статьи - это кодированные и некодированные строки, это не значит, что вы должны использовать венгерское «us» для небезопасных строк и «s» для безопасных строк, это то, что у вас должен быть идентификатор немного, чтобы указать, что строка либо безопасна. или нет. Если он станет стандартом, станет легко увидеть, когда стандарт нарушается.

Я согласен, что венгерская нотация больше не особенно полезна. Я думал, что его первоначальное намерение состояло в том, чтобы указать не тип данных, а тип сущности. Например, в разделе кода, включающем имена клиентов, сотрудников и пользователя, вы можете назвать локальные строковые переменные cusName, empName и usrName. Это поможет различать похожие по звучанию имена переменных. Во всем приложении будут использоваться одни и те же префиксы для сущностей. Однако, когда используется объектно-ориентированный подход и вы имеете дело с объектами, эти префиксы избыточны в Customer.Name, Employee.Name и User.Name.

не только тип данных, но и область действия .... :)

Guy Cohen 27.09.2014 21:30

Не используйте префиксы для конкретных языков.

Мы используем:

n: Number 
p: Percentage 1=100% (for interest rates etc)
c: Currency
s: String
d: date
e: enumeration
o: object (Customer oCustomer=new Customer();)
...

Мы используем одну и ту же систему для всех языков:

SQL
C
C#
Javascript
VB6
VB.net
...

Это спасатель жизни.

p в качестве префикса в языках, которые поддерживают указатели, но не означают указатель ... страшно!

Greg Beech 18.03.2009 23:48

Мы больше не используем указатели много (если таковые имеются). В нашей работе мы видим много процентных ставок (процентов) и никаких указателей. Идея состоит в том, чтобы использовать межъязыковые префиксы. Учитываются не конкретные префиксы. Выбери свой.

pkario 20.03.2009 15:06

Я использую кое-что, а не просто что-то

Guy Cohen 27.09.2014 21:29

Я использую enSomething для переменной, содержащей перечисление.

pkario 29.09.2014 08:54

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

В чем польза венгерского - это различать логически разные типы переменных, которые имеют один и тот же исходный тип. Например, если вы используете целые числа для представления координат, вы можете поставить перед координатами x префикс x, координаты y - y, а расстояния - d. Таким образом, у вас будет код, который выглядит как

dxHighlight = xStart - xEnd

yHighlight = yLocation + 3

yEnd = yStart + dyHeight

dyCode = dyField * 2

и так далее. Это полезно, потому что вы можете сразу обнаружить ошибки: если вы добавите dy к y, вы всегда получите y. Если вы вычесть два x, вы всегда получите dx. Если вы умножите dy на скаляр, вы всегда получите dy. И так далее. Если вы видите строку вроде

yTop = dyText + xButton

вы сразу понимаете, что это неправильно, потому что добавление dy и x не имеет смысла. Компилятор не может уловить это для вас, потому что, насколько он может судить, вы добавляете int к int, и это нормально.

Я тоже так делаю, но чаще всего как суффикс: startX, endY, vertexZ.

strager 30.11.2008 09:34

xEnd = xStart + dyField; // сделать область квадратной Это выглядит неправильно, но кажется вполне верным.

FryGuy 19.03.2009 00:06

@FryGuy: в этом случае вам нужно использовать другую переменную с более последовательным именем (например, dxField = dyField; xEnd = xStart + dxField;

alfred barthand 26.11.2009 17:00

«Бессмысленно использовать венгерский для обозначения типов, потому что компилятор уже делает это за вас». Это предполагает, что вы поймали его во время компиляции. Недавно я обнаружил некоторые преимущества в использовании случайных венгерских обозначений в JavaScript и при работе с вариантными типами. Я также нашел венгерскую нотацию очень полезной при написании ассемблера. Тем не менее, они бесполезны для непростых целей; Приятно знать, число это или строка, или строка, или указатель на один байт, но бесполезно различать разные HashMap <string, object>.

Dmitry 19.07.2017 14:40

Мой аргумент состоит в том, что в венгерской системе обозначений есть свои достоинства, но они становятся бесполезными (1) ваши обозначения очень ясны и на них легко найти ссылку. (2) ваши обозначения очень скудные и в них отсутствуют синонимы. Венгерская нотация не предполагает однозначного различения каждого типа объекта, но помогает намекнуть на важные вещи, которые нужно знать об идентификаторе, не открывая модный редактор.

Dmitry 19.07.2017 14:46

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

Однако иногда в дополнение к хорошему именованию переменных вы использовали бы венгерскую нотацию. m_numObjects имеет два префикса: m_ и num. м_ указывает область действия: это член данных, связанный с это. число указывает, что значение является.

Я совершенно не чувствую затруднений, когда читаю «хороший» код, даже если он действительно содержит «венгерский». Справа: я читаю код, но не нажимаю на него. (На самом деле, я почти никогда не использую мышь при кодировании или каких-либо функций поиска, связанных с программированием вуду.)

Я замедляюсь, когда читаю такие вещи, как m_ubScale (да, я смотрю на тебя, Лиран!), так как мне нужно посмотреть на его использование (без комментариев!), Чтобы узнать, что он масштабируется (если вообще?) И его тип данных (который, оказывается, является фиксированной точкой символ). Лучшее имя было бы m_scaleFactor или m_zoomFactor с комментарием в виде числа с фиксированной точкой или даже typedef. (На самом деле, typedef был бы полезен, поскольку есть несколько других членов нескольких классов, которые используют один и тот же формат с фиксированной точкой. Однако некоторые этого не делают, но по-прежнему помечены m_ubWhatever! По меньшей мере сбивает с толку.)

Я думаю, что венгерский должен был быть добавкой к имени переменной, а не заменой информации. Кроме того, часто венгерская нотация вообще ничего не добавляет к удобочитаемости переменной, тратя байты и время чтения.

Просто мои 2 цента.

Очень старый вопрос, но вот пара «венгерских» префиксов, которые я регулярно использую:

my

for local variables, to distinguish locality where the name might make sense in a global context. If you see myFoo, it's only used in this function, regardless of anything else we do with Foos anywhere else.

myStart = GetTime();
doComplicatedOperations();
print (GetTime() - myStart);

и

tmp

for temporary copies of values in loops or multi-step operations. If you see two tmpFoo variables more than a couple of lines from each other, they're almost certainly unrelated.

tmpX = X; 
tmpY = Y;
X = someCalc(tmpX, tmpY);
Y = otherCalc(tmpX, tmpY);

и иногда Старый и новый по причинам, аналогичным tmp, обычно в более длинных циклах или функциях.

Я обнаружил, что использую 'w', означающее 'рабочий', в качестве префикса вместо 'temp' или 'tmp' для локальных переменных, которые используются только для управления данными, например:

Public Function ArrayFromDJRange(rangename As Range, slots As Integer) As Variant

' this function copies a Disjoint Range of specified size into a Variant Array 7/8/09 ljr

Dim j As Integer
Dim wArray As Variant
Dim rCell As Range

wArray = rangename.Value ' to initialize the working Array
ReDim wArray(0, slots - 1) ' set to size of range
j = 0

For Each rCell In rangename
    wArray(0, j) = rCell.Value
    j = j + 1
Next rCell

ArrayFromDJRange = wArray

End Function

Я был категорически против венгерской системы обозначений, пока я действительно не начал читать об этом и пытаться понять его первоначальный замысел. Прочитав пост Джоэлса «Неправильно» и статью «Повторное открытие венгерской нотации», я действительно изменил свое мнение. Если все сделано правильно, я считаю, что он должен быть чрезвычайно мощным.

Неправильно, Джоэл Спольски http://www.joelonsoftware.com/articles/Wrong.html

Заново открывая венгерскую нотацию http://codingthriller.blogspot.com/2007/11/rediscovering-hungarian-notation.html

Я полагаю, что большинство скептиков никогда не пробовали это по-настоящему и не понимают по-настоящему. Я бы с удовольствием опробовал это в реальном проекте.

Ну, я использую его только с переменными управления окнами. Я использую btn_, txt_, lbl_ и т. д., Чтобы их обнаружить. Я также считаю полезным найти имя элемента управления, набрав его тип (btn_ и т. д.).

Другие вопросы по теме