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