Вопрос

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

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

Это было полезно?

Решение 2

Ставшая классической статья, как упоминалось в других венгерских постах, взята с сайта Джоэла:

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

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

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

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

  • стрфирстнаме - это может быть просто имя поскольку очевидно, для чего он нужен, тип не так важен и в данном случае должен быть очевиден.Если это не очевидно, IDE может вам в этом помочь.
  • txtFirstName - это может измениться на ИмяTextBox или Имя_TextBox.Он читается лучше, и вы знаете, что это элемент управления, а не просто текст.
  • CAаккаунт - С использовался для имен классов в MFC, но вам это действительно не нужно. Счет достаточно хорош.Имена в верхнем регистре являются стандартным соглашением для типов (и они появляются только в определенных местах, чтобы их не путали со свойствами или методами).
  • ixArray (индекс к множество) - ix немного неясно.Пытаться индекс массива.
  • штат США (небезопасная строка для Состояние) - выглядит как "США.Состояние".Лучше пойти с состояние_Небезопасная строка или что-то.Может быть, даже завернуть его в Небезопасная строка class, чтобы хотя бы сделать его типобезопасным.

п

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

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

т

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

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

Венгерский язык полезен для различения логически разных типов переменных, имеющих один и тот же необработанный тип.Например, если вы используете целые числа для представления координат, вы можете добавить к координатам 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 для указателя и a для адреса, вы вызываете свою переменную apStreet или paStreet?Читабельность ухудшается, если у вас нет последовательности, и вам приходится использовать ценное пространство ума, когда вам нужно запомнить порядок, в котором вы должны писать обозначения.

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

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

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

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

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

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

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

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

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

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

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

м

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

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

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

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

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

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

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

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

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

Я замедляюсь, когда читаю такие вещи, как m_ubScale (да, я смотрю на тебя, Лиран!), так как мне нужно посмотреть на его использование (без комментариев!), чтобы выяснить, как он масштабируется (если вообще?) и его тип данных (который представляет собой символ с фиксированной точкой).Лучшее имя было бы m_scaleFactor или m_zoomFactor с комментарием в виде числа с фиксированной точкой или даже определения типа.(На самом деле, определение типа было бы полезно, поскольку существует несколько других членов нескольких классов, которые используют тот же формат с фиксированной запятой.Однако некоторые этого не делают, но все равно имеют пометку 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;

Вот и все :)

Редактировать: О, я только что понял, что это ложь.Я также использую «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 подсказывают что это слова, но на самом деле они относятся к лонгам.Реальная ценность этого подхода становится очевидной при переходе на 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top