Имеет ли смысл использовать венгерские префиксы для обозначения в интерпретируемых языках?

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

https://stackru.com/questions/1184717/hungarian-notation
Почему я не должен использовать "Венгерскую нотацию"?
Действительно ли префиксы переменных ("венгерская нотация") действительно необходимы?
Люди используют Венгерские Соглашения об именах в реальном мире?

Теперь все эти посты связаны с C#, C++, Java - строго типизированными языками.
Я понимаю, что префиксы не нужны, когда тип известен до компиляции.
Тем не менее, мой вопрос:

Стоит ли использовать префиксы в языках на основе интерпретатора, учитывая тот факт, что вы не можете увидеть тип объекта до времени выполнения?

Изменить: Если кто-то может сделать это сообщение вики сообщества, пожалуйста, сделайте. Меня вряд ли интересует репутация (или негативная репутация) из этого поста.

5 ответов

Решение

Причина, по которой венгерский тип передачи нотации ("венгерские системы") не одобряется в Python, проста. Это вводит в заблуждение. Переменная может быть вызвана iPhones (целое число телефонов, может быть:-), но поскольку это Python, ничто не мешает вам вставить в него что-то, кроме целого числа! И, может быть, вы найдете, что вам нужно сделать это по какой-то причине. И тогда весь код, который его использует, вводит в заблуждение того, кто пытается это понять, если, конечно, вы не измените имя переменной глобально.

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

Это зависит от того, на какую из двух версий вы ссылаетесь:

  • Если вы хотите использовать "настоящую", оригинальную венгерскую нотацию AKA Applications, венгерскую нотацию, обозначающую тип логической переменной соотв. его цель, не стесняйтесь сделать это.

  • OTOH, "неправильно понятая" версия венгерской записи AKA Systems, обозначающая только тип физической переменной, не одобряется и не должна использоваться.

ИМХО, никогда (*) не имеет смысла использовать Systems Hungarian (с префиксом типа данных). Вы используете статический или динамический язык, но компилятор или интерпретатор заботится о системе типов. Аннотирование типа переменной с помощью имени переменной может вызвать только двусмысленность (например, представьте плавающий intSomething).

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

Я часто использую такую ​​вещь в MATLAB, например idxInterest чтобы указать, что массив значений типа double - это не необработанные значения данных, а просто индексы (в другой массив), которые так или иначе представляют интерес. Я регулярно пользуюсь selInterest (sel from 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Переменные, он также служит документированием ваших переменных.

Хотя технически некорректно делать что-то вроде iFoo + jBar или же kBaz + dBarЭто действительно вызывает некоторые вопросы, когда они происходят в вашем коде, и они позволяют вам осматривать эту часть более бдительно. И это то, что представляет собой настоящая (Приложения) Венгерская Нотация.

(*) Единственный момент, когда это может иметь какой-то смысл, это когда ваш полный фреймворк / язык просит вас использовать его. Например, API-интерфейс win32 использует его, поэтому, когда вы взаимодействуете с ним напрямую, вы должны использовать эти стандарты, чтобы избежать путаницы до минимума. Тем не менее, я бы сказал, что может иметь смысл поискать другой фреймворк / язык.

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

Как было предложено, венгерская запись является разумной идеей. Как это было применено? Он должен быть сброшен с орбиты (это единственный способ быть уверенным.)

Принятый ответ на первый вопрос, на который вы ссылаетесь, относится и к Python:

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

Все это также верно для Python.

Другие вопросы по тегам