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

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

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

Ответ 1

В настоящее время классическая статья, как упоминалось в других венгерских сообщениях, является той, что находится на сайте Joel:

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

Ответ 2

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

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

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

Ответ 3

р

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

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

Ответ 4

т

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

Ответ 5

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

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

Ответ 6

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

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

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

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

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

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

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

Ответ 11

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

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

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

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

Ответ 12

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

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

Ответ 13

т

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

Ответ 14

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

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

Ответ 15

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

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

Ответ 16

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

Ответ 17

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

However, sometimes you'd use Hungarian notation in addition to good variable naming. m_numObjects has two "prefixes:" m_ and num. m_ indicates the scope: it a data member tied to this. num indicates what the value is.

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

I am slowed when я read things like m_ubScale (yes, I'm looking at you, Liran!), as я have to look at its usage (no comments!) to find out what it scales (if at all?) and it datatype (which happens to be a fixed-point char). A better name would be m_scaleFactor or m_zoomFactor, with a comment as a fixed-point number, or even a typedef. (In fact, a typedef would be useful, as there are several other members of several classes which use the same fixed-point format. However, some don't, but are still labeled m_ubWhatever! Confusing, to say the least.)

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

Только мои 2 ¢.

Ответ 18

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

мой

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

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

и

TMP

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

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

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

Ответ 19

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

MyClass myClass;
MyClass* pMyClass;

Что все:)

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

class
{
private:
bool m_myVar;
}

Ответ 20

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

Ответ 21

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

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

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

Ответ 22

Я использую "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