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

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

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

22 ответов


проблема с просьбой о хороших примерах венгерской нотации заключается в том, что каждый будет иметь свое собственное представление о том, как выглядит хороший пример. Мое личное мнение, что лучший Венгерская Нотация is нет венгерской нотации. Первоначально обозначение означало использование переменной, а не ее типа, но она обычно используется для информации о типе, особенно для элементов управления формой (например, txtFirstName для текстового поля для чьего-то имени.). Это делает код менее обслуживаемым с точки зрения читаемости (например, "prepIn nounTerms prepOf nounReadability") и рефакторинга для того, когда тип должен быть изменен (в Win32 API есть "lParams", которые изменили тип).

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

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

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

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


p

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

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


t

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


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

где венгерский полезен, чтобы различать логически разные типы переменных, которые имеют один и тот же тип raw. Например, если вы используете ints для представления координат, вы можете префикс 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, что нормально.


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

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

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
...

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


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

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

вы также можете сделать заказ в вопросы с пометкой. Если вы используете P для указателя а для адреса вы называете переменную apStreet или paStreet? Читаемость уменьшается, когда у вас нет последовательности, и вы должны использовать ценное пространство ума, когда вы должны помнить порядок, в котором вы должны написать нотацию.


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


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


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

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

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


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

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

Заново Венгерский Notation
http://codingthriller.blogspot.com/2007/11/rediscovering-hungarian-notation.html

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


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

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


m

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


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

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


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

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


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


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

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

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

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

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

просто мой 2¢.


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

мой

для локальных переменных, отличить местность, где имя может иметь смысл в глобальном контексте. Если вы видите myFoo, он используется только в этой функции, независимо от того, что мы делаем с Foos в другом месте.

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

и

tmp

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

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

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


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

MyClass myClass;
MyClass* pMyClass;

вот и все :)

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

class
{
private:
bool m_myVar;
}

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


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

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

один из трюков followon в венгерской нотации - "изменить тип переменной, но оставить имя переменной без изменений". Это почти всегда делается в приложениях windows при миграции с win16 :- функция WndProc(hwnd элемента аппаратного обеспечения, слово Х Всемирных интеллектуальных игр, слово параметр wparam, lparam должен долго) в Win32 функция WndProc(hwnd элемента аппаратного обеспечения, uint с-Х Всемирных интеллектуальных игр, параметр wparam параметр wparam, lparam должен параметр lparam) где ж значения намек на то, что они слова, но они действительно относятся к длинные. Реальное значение этого подхода становится ясным с миграцией Win64, когда параметры будут иметь ширину 64 бита, но старые префиксы "w" и "l" останутся навсегда.


Я нахожу, что использую "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