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

Теперь уже классическая статья, как упоминалось в других венгерских сообщениях, - это статья с сайта Джоэла:
(для указателя). Это практически единственный префикс, который я использую. Я думаю, что он многое добавляет к переменной (например, что это указатель), и поэтому к нему следует относиться немного более уважительно.
Венгерский язык для типов данных несколько устарел, теперь IDE могут сказать вам, что это за тип (всего за несколько секунд, наведя курсор на имя переменной), поэтому это не так важно. Но обращаясь с указателем так, как будто его данные не подходят, поэтому вы хотите, чтобы пользователю было очевидно, что это такое, даже если он делает предположения, которых не следует делать при кодировании.
Да, это единственный раз, когда я бы тоже подумал об использовании венгерской нотации.
Согласен, хотя мне кажется, что лучше поставить _p в конце. Это значительно упрощает чтение указателей структур, например some_struct_p->some_member (и some_struct_p.some_member выделялись бы как явно неправильные (в значении статьи Джоэла)).
У меня тоже был похожий вопрос, и я пришел к примерно аналогичным выводам. Запись здесь [осень 2014 г.].
Проблема с запросом хороших примеров венгерской нотации заключается в том, что каждый будет иметь собственное представление о том, как выглядит хороший пример. Лично я считаю, что лучший Венгерская нотация - это нет венгерской нотации. Обозначение изначально предназначалось для обозначения предполагаемое использование переменной, а не ее типа, но обычно оно используется для информации о типе, особенно для элементов управления формы (например, txtFirstName для текстового поля для чьего-либо имени). Это делает код менее удобным в обслуживании с точки зрения удобочитаемости (например, «papIn nounTermspapOf nounReadability ») и рефакторинга, когда необходимо изменить тип (в Win32 API есть« lParams », которые изменили тип).
Вероятно, вам стоит вообще не использовать его. Примеры:
ix немного неясен. Попробуйте arrayIndex._UnsafeString или что-то в этом роде. Возможно, даже оберните его в класс UnsafeString, чтобы хотя бы сделать его типобезопасным.Я согласен с тем, что мы должны использовать его для преднамеренного использования, и я надеюсь, что люди внесут свой вклад, поскольку для моего будущего приложения я хотел бы создать стандарт с самого начала.
Последний пункт, представленный здесь, - первое, что пришло мне в голову после прочтения оригинальной статьи Джоэла. Это одна из целей иерархий классов, и использование для этого соглашений об именах не оптимально.
Стоит упомянуть Общие соглашения об именах в MSDN (msdn.microsoft.com/en-us/library/ms229045.aspx). Они говорят: «Не используйте венгерскую нотацию».
@ gutofb7: ваша ссылка предназначена для .NET. Это не конкретный вопрос .NET. Мы все должны понять, почему была сделана эта рекомендация (подумайте о «Окне определения кода»), прежде чем пытаться применить этот аргумент для всех сред и языков. Есть места, где правильно используемый AppHungarian является благом, и все другие методы, упомянутые здесь (иерархии классов, использование сверхдлинных имен, информация о типе кодирования там) уступают ему.
В PHP не все типы очевидны только по имени переменной. А как насчет кода сортировки банка $BankSortCode? Это "int" или "строка", потому что в ней есть дефисы? А рост пользователя $UserHeight? Может быть "int", если оно в миллиметрах, но что, если оно в футах / дюймах и является "строкой" для размещения слов feet/inches, " ' или точки? Я использую подчеркивание с camelCase - $int_BankSortCode, $str_UserName, $ary_TeamNames. Ваш ответ на самом деле не подходит для всех языков или сценариев. Хотя я согласен, что это, как вы сами заявили, всего лишь мнение.
Вы можете привести всевозможные аргументы, которые делают определенные преимущества практики кодирования излишними. Возьмем CamelCase ... Зачем нужно записывать начало переменной в нижнем регистре? Почему следующие слова заглавными? userName = UserName = username, их все так же легко читать и понимать. Последовательность является ключевым моментом, когда вы используете соглашения о кодировании, это самая важная вещь, и предполагать, что венгерская нотация в чем-то хуже, просто игнорировать, что все соглашения о кодировании действительны и полезны, если следовать последовательно.
Если венгерская нотация используется последовательно с первоначальное намерение из показывая намерение, тогда нормально. Но глупая последовательность - хобгоблин ума молодого программиста.
Адвокат дьявола: лучший пример венгерской нотации - не использовать ее. : D
Мы не получаем никаких преимуществ от использования венгерской нотации с современными IDE, потому что они знают тип. Это добавляет работы при рефакторинге типа для переменной, поскольку имя также должно быть изменено (и большую часть времени, когда вы имеете дело с переменной, вы все равно знаете, какой это тип).
Вы также можете решить проблемы с упорядочиванием нотации. Если вы используете p для указателя и a для адреса, вы называете свою переменную apStreet или paStreet? Читаемость ухудшается, когда у вас нет последовательности, и вам нужно использовать ценное пространство ума, когда вам нужно запомнить порядок, в котором вы должны писать обозначения.
Я согласен с тем, что вам не нужно использовать его для всех типов, я надеюсь на хорошие примеры, подобные приведенным Джоэлом, где он повышает удобочитаемость и удобство использования .;
Венгерскую нотацию не следует использовать для обозначения типов. Вы здесь совершенно правы. Однако первоначальное намерение состояло в том, чтобы использовать его для вещей, не указанных типами, и в этом есть потенциальные применения.
Я считаю, что венгерские обозначения иногда могут быть полезны в динамических языках. Я специально думаю о 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 лет подобрать этот код и улучшить его.
это полезно только в том случае, если вы включите легенду для префиксов, иначе они могут быть слишком загадочными для будущего читателя.
Верблюжья оболочка и венгерская нотация - разные вещи. Camel Casing просто делает ThisWithYourNames (каждое слово начинается с заглавной буквы). Венгерская нотация предполагает добавление идентификатора типа к имени.
Интересно. Первоначально я предполагал, что они одинаковы, потому что мы всегда использовали одни и те же префиксы (str, int, dbl, obj, dat и т. д.), И это было в двух разных местах.
В дополнение к использованию 'p' для указателя мне нравится идея использования 'cb' и 'cch', чтобы указать, является ли параметр размера буфера (или переменная) количеством байтов или количеством символов (я также видел - редко - 'ce' используется для обозначения количества элементов). Таким образом, вместо передачи типа префикс передает использование или намерение.
Признаюсь, я не использую префикс так последовательно, как, наверное, следовало бы, но идея мне нравится.
Я думаю, что ключевой момент, который следует извлечь из статьи Джоэла, приведенной выше, и венгерской нотации в целом - это использовать ее, когда в переменной есть что-то неочевидное.
Один из примеров из статьи - это кодированные и некодированные строки, это не значит, что вы должны использовать венгерское «us» для небезопасных строк и «s» для безопасных строк, это то, что у вас должен быть идентификатор немного, чтобы указать, что строка либо безопасна. или нет. Если он станет стандартом, станет легко увидеть, когда стандарт нарушается.
Я согласен, что венгерская нотация больше не особенно полезна. Я думал, что его первоначальное намерение состояло в том, чтобы указать не тип данных, а тип сущности. Например, в разделе кода, включающем имена клиентов, сотрудников и пользователя, вы можете назвать локальные строковые переменные cusName, empName и usrName. Это поможет различать похожие по звучанию имена переменных. Во всем приложении будут использоваться одни и те же префиксы для сущностей. Однако, когда используется объектно-ориентированный подход и вы имеете дело с объектами, эти префиксы избыточны в Customer.Name, Employee.Name и User.Name.
не только тип данных, но и область действия .... :)
Не используйте префиксы для конкретных языков.
Мы используем:
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 в качестве префикса в языках, которые поддерживают указатели, но не означают указатель ... страшно!
Мы больше не используем указатели много (если таковые имеются). В нашей работе мы видим много процентных ставок (процентов) и никаких указателей. Идея состоит в том, чтобы использовать межъязыковые префиксы. Учитываются не конкретные префиксы. Выбери свой.
Я использую кое-что, а не просто что-то
Я использую enSomething для переменной, содержащей перечисление.
Бессмысленно использовать венгерский для обозначения типов, потому что компилятор уже делает это за вас.
В чем польза венгерского - это различать логически разные типы переменных, которые имеют один и тот же исходный тип. Например, если вы используете целые числа для представления координат, вы можете поставить перед координатами 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.
xEnd = xStart + dyField; // сделать область квадратной Это выглядит неправильно, но кажется вполне верным.
@FryGuy: в этом случае вам нужно использовать другую переменную с более последовательным именем (например, dxField = dyField; xEnd = xStart + dxField;
«Бессмысленно использовать венгерский для обозначения типов, потому что компилятор уже делает это за вас». Это предполагает, что вы поймали его во время компиляции. Недавно я обнаружил некоторые преимущества в использовании случайных венгерских обозначений в JavaScript и при работе с вариантными типами. Я также нашел венгерскую нотацию очень полезной при написании ассемблера. Тем не менее, они бесполезны для непростых целей; Приятно знать, число это или строка, или строка, или указатель на один байт, но бесполезно различать разные HashMap <string, object>.
Мой аргумент состоит в том, что в венгерской системе обозначений есть свои достоинства, но они становятся бесполезными (1) ваши обозначения очень ясны и на них легко найти ссылку. (2) ваши обозначения очень скудные и в них отсутствуют синонимы. Венгерская нотация не предполагает однозначного различения каждого типа объекта, но помогает намекнуть на важные вещи, которые нужно знать об идентификаторе, не открывая модный редактор.
Имя переменной должно описывать, что это такое. Хорошее именование переменных делает венгерскую нотацию бесполезной.
Однако иногда в дополнение к хорошему именованию переменных вы использовали бы венгерскую нотацию. 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_ и т. д.).
Этот вопрос был создан, когда впервые был запущен Stack Overflow, и на самом деле это не тот тип вопросов, который сегодня разрешен для этого сайта. Это по-прежнему полезный ресурс, и его следует сохранить по историческим причинам и по тем причинам, которые он приносит на сайт.