ИМХО, никогда (*) не имеет смысла использовать венгерские системы (с префиксом типа данных). Либо вы используете статический язык, либо динамический язык, но и компилятор, и интерпретатор заботятся о системе типов. Аннотирование типа переменной с помощью имени переменной может вызвать только двусмысленность (например, представьте себе число с плавающей запятой с именем intSomething
).
Совершенно иначе обстоит дело с Application Hungarian, то есть с префиксом с каким-то шаблоном использования. Я бы сказал, что это хорошая практика использовать такие обозначения, например usValue для небезопасного (т.е. непроверенного) значения. Это дает визуальную подсказку относительно использования и предотвращает смешивание различных вариантов использования переменных, которые имеют один и тот же тип, но не предназначены для совместного использования (или когда они предназначены для использования вместе, вы, по крайней мере, имеете представление о том, как к тому, что используется, и они производят отметку на вашем радаре проверки кода).
Я часто использую такую вещь в MATLAB, например. idxInterest
, чтобы указать, что массив двойников не является значениями необработанных данных, а просто индексами (в другой массив), которые так или иначе представляют интерес. Я регулярно использую selInterest
(sel
из select), чтобы сделать то же самое с логическими индексами (я согласен, это может выглядеть как пограничные системы венгерского языка), но во многих случаях оба могут использоваться в одном контексте.
Аналогично для итераторов: я регулярно использую многомерные массивы (например, 4D), в нечетном случае я запускаю (par)for
по измерению, итераторы называются iFoo
, jBar
, kBaz
, ... в то время как их верхний предел обычно составляет nFoo
, nBar
, nBaz
, ... (или numFoo
, ...). При выполнении более сложных манипуляций с индексами вы можете легко увидеть, какой индекс принадлежит какому измерению (по префиксу вы знаете, какое числовое измерение используется, по полному имени вы знаете, что представляет это измерение). Это делает код более читабельным.
Рядом с этим я регулярно использую dFoo=1;
, dBar=2;
, ... для обозначения номера измерения для определенного набора переменных. Таким образом, вы можете легко увидеть, что что-то вроде meanIncome = mean(income, dBar)
принимает среднее income
по Bar
, а meanIncome = mean(income, 2)
не передает ту же информацию. Поскольку вам также необходимо установить d
Variables, он также служит документацией для ваших переменных.
Хотя технически это не является некорректным, делать что-то вроде iFoo + jBar
или kBaz + dBar
, это вызывает некоторые вопросы, когда они возникают в вашем коде, и они позволяют вам более внимательно проверять эту часть. И в этом суть настоящей (прикладной) венгерской нотации.
(*) Единственный момент, когда это может иметь какой-то смысл, - это когда ваш полный фреймворк / язык просит вас использовать его. Например. API win32 использует его, поэтому, когда вы взаимодействуете с ним напрямую, вы должны использовать эти стандарты, чтобы свести путаницу к минимуму. Тем не менее, я бы сказал, что может иметь даже больше смысла искать другой фреймворк / язык.
Обратите внимание, что это отличается от сигилов, используемых в Perl, некоторых BASIC диалектах. и т.д. Они также передают тип, но во многих реализациях это определение типа, поэтому двусмысленность отсутствует или возможна небольшая. Другой вопрос, является ли использование такого объявления типа хорошей практикой (и я не совсем уверен в своей позиции в этом отношении).
person
Egon
schedule
09.01.2012