Ответ 1
В настоящее время классическая статья, как упоминалось в других венгерских сообщениях, является той, что находится на сайте Joel:
Этот вопрос заключается в поиске хороших примеров венгерской нотации, поэтому мы можем собрать их коллекцию.
Изменить: Я согласен с тем, что венгерский тип не является необходимым, я надеюсь на более конкретные примеры, где он повышает читаемость и ремонтопригодность, как это дает Джоэл в своей статье (согласно моему ответу).
В настоящее время классическая статья, как упоминалось в других венгерских сообщениях, является той, что находится на сайте Joel:
Проблема с просьбой о хороших примерах венгерской нотации заключается в том, что каждый будет иметь собственное представление о том, как выглядит хороший пример. Мое личное мнение состоит в том, что лучший Венгерская нотация без венгерской нотации. Первоначально обозначение предназначалось для обозначения предполагаемого использования переменной, а не ее типа, но обычно используется для информации о типе, особенно для элементов управления Form (например, txtFirstName для текстового поля для имени человека). Это делает код менее ремонтопригодным с точки зрения удобочитаемости (например, "prepIn nounTerms prepOf nounReadability" ) и рефакторинг для того, когда тип необходимо изменить (в API-интерфейсе Win32, который изменил тип, есть "lParams" ).
Вероятно, вам следует подумать о том, чтобы не использовать его вообще. Примеры:
ix
немного неясен. Попробуйте arrayIndex._
UnsafeString или что-то в этом роде. Возможно, даже оберните его в класс UnsafeString, чтобы сделать его безопасным по типу.(для указателя). Это почти единственный префикс, который я использую. Я думаю, что это добавляет много к переменной (например, к ее указателю), и поэтому ее следует относить чуть более с уважением.
Венгерский для типов данных несколько passe теперь IDE могут рассказать вам, что такое тип (всего за несколько секунд, зависающий над именем переменной), поэтому его не так важно. Но обработка указателя, как если бы его данные были не очень хорошими, поэтому вы хотите убедиться, что для пользователя очевидно, что это даже если он делает допущения, которые он не должен делать при кодировании.
т
Загрязненные данные. Префикс всех данных, поступающих из ненадежного источника, чтобы сделать эту переменную как испорченную. Все испорченные данные должны быть очищены до того, как на нем будет сделана настоящая работа.
Бессмысленно использовать венгерский язык для обозначения типов, потому что компилятор уже делает это для вас.
Где венгерский полезен - это различать логически различные виды переменных, которые имеют один и тот же тип 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
Мы не пользуемся преимуществами использования венгерской нотации с современными IDE, потому что они знают тип. Он добавляет работу при рефакторинге типа для переменной, так как имя также должно быть изменено (и большую часть времени, когда вы имеете дело с переменной, которую знаете, какой тип она в любом случае).
Вы также можете задать вопросы с обозначением. Если вы используете p для указателя и для адреса, вы вызываете переменную apStreet или paStreet? Считываемость уменьшается, когда у вас нет согласованности, и вам нужно использовать ценное пространство разума, когда вам нужно запомнить порядок, в котором вы должны записать нотацию.
Я считаю, что венгерская нотация иногда может быть полезна в динамических языках. Я специально думаю о Server Side Actionscript (по сути, просто javascript), но он может применяться в другом месте. Поскольку нет никакой реальной информации о типе вообще, венгерская нотация может иногда помочь сделать вещи немного легче понять.
Единственный венгерский, который действительно полезен больше, является m_ для переменных-членов. (Я также использую sm_ для статических членов, потому что это "другая" область, которая все еще существует.) С широкоэкранными мониторами и компиляторами, которые используют имена переменных длиной в восемь миллиардов символов, сокращение имен типов просто не стоит.
Венгерская нотация (оболочка верблюда, как я ее узнал) неоценима, когда вы наследуете программный проект.
Да, вы можете "нависнуть" над переменной с вашей IDE и узнать, какой класс она есть, но если вы просматриваете несколько тысяч строк кода, которые вы не хотите останавливать на эти несколько секунд - каждый.... одиночный.... время....
Помните - вы не пишете код для себя или своей команды. Вы также пишете его для человека, который должен забрать этот код через 2-5 лет и улучшить его.
Я был категорически против венгерской нотации, пока я действительно не начал читать об этом и не пытался понять ее оригинальные намерения. Прочитав статью Джоэлса "Неправильно" и статью "Переоткрывая венгерскую нотацию", я действительно передумал. Правильно, я верю, что он должен быть чрезвычайно сильным.
Неправильно Джоэл Спольский
http://www.joelonsoftware.com/articles/Wrong.html
Переоткрытие венгерской нотации
http://codingthriller.blogspot.com/2007/11/rediscovering-hungarian-notation.html
Я считаю, что большинство Naysayers никогда не пробовали это по-настоящему и не понимают по-настоящему. Я хотел бы попробовать его в реальном проекте.
Я думаю, что ключевым моментом, который следует убрать из статьи Джоэля, связанной выше, и венгерской нотации в целом, является ее использование, когда что-то неявное относительно переменной.
Один пример, из статьи, закодирован против некодированных строк, это не значит, что вы должны использовать венгерские "us" для небезопасных строк и "s" для безопасных строк, это значит, что у вас должен быть некоторый идентификатор, чтобы указать, что строка либо безопасен, либо нет. Если он становится стандартным, становится легче увидеть, когда стандарт нарушается.
т
При использовании ORM (например, спящий режим) вы имеете дело с управляемыми и неуправляемыми объектами. Изменение управляемого объекта будет отражено в базе данных без вызова явного сохранения, в то время как управление управляемым объектом требует явного вызова сохранения. Как вы относитесь к объекту, будет отличаться в зависимости от того, что это такое.
Я считаю, что единственной полезной моментом является объявление элементов управления интерфейсом, txtUsername, txtPassword, ddlBirthMonth. Это не идеально, но помогает в больших формах/проектах.
Я не использую его для переменных или других элементов, просто элементы управления.
В дополнение к использованию "p" для указателя мне нравится идея "cb" и "cch", чтобы указать, является ли параметр (или переменная) размера буфера количеством байтов или количеством символов (я также видно - редко - 'ce' используется для обозначения количества элементов). Поэтому вместо типа передачи префикс передает использование или намерение.
Я признаю, что я не использую префикс так последовательно, как я, вероятно, должен, но мне нравится идея.
Я согласен, что венгерская нотация больше не особенно полезна. Я думал, что его первоначальное намерение состояло в том, чтобы указать не тип данных, а тип сущности. Например, в разделе кода, включающем имена клиентов, сотрудников и пользователя, можно указать локальные строковые переменные cusName, empName и usrName. Это поможет различать имена похожих переменных. Те же префиксы для сущностей будут использоваться во всем приложении. Однако, когда OO используется и вы имеете дело с объектами, эти префиксы являются избыточными в Customer.Name, Employee.Name и User.Name.
Имя переменной должно описывать, что это такое. Хорошее имя переменной делает венгерскую нотацию бесполезной.
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 ¢.
Очень старый вопрос, но здесь несколько "венгерских" префиксов, которые я использую регулярно:
мой
для локальных переменных, чтобы различать локальность, где имя может иметь смысл в глобальном контексте. Если вы видите myFoo, он используется только в этой функции, независимо от того, что мы делаем с Foos в другом месте.
myStart = GetTime();
doComplicatedOperations();
print (GetTime() - myStart);
и
TMP
для временных копий значений в циклах или многошаговых операций. Если вы видите две переменные tmpFoo больше, чем пару строк друг от друга, они почти наверняка не связаны.
tmpX = X;
tmpY = Y;
X = someCalc(tmpX, tmpY);
Y = otherCalc(tmpX, tmpY);
а иногда старый и новый по тем же причинам tmp, обычно в более длинных циклах или функциях.
Я использую только p для указателя, и что он. И это только если я на С++. В С# я не использую никаких венгерских обозначений. например.
MyClass myClass;
MyClass* pMyClass;
Что все:)
Изменить: О, я просто понял, что ложь. Я также использую "m_" для переменных-членов. например.
class
{
private:
bool m_myVar;
}
Ну, я использую его только с переменными оконного управления. Я использую btn_, txt_, lbl_ и т.д., Чтобы определить их. Мне также полезно найти контрольное имя, набрав его тип (btn_ и т.д.).
Нет такого понятия, как хороший пример венгерской нотации. Просто не используйте его. Даже если вы используете слабо типизированный язык. Вы будете жить счастливее.
Но если вам действительно нужна причина не использовать его, это мой любимый, извлеченный из эта отличная ссылка:
Один трюк в венгерской нотации - "изменить тип переменной, но оставить имя переменной неизменным". Это почти всегда выполняется в приложениях 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" останутся навсегда.
Я использую "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