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

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

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

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

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

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


person Andrey Rubshtein    schedule 09.01.2012    source источник


Ответы (5)


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

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

person kindall    schedule 09.01.2012
comment
Помещение других типов объектов в функцию, которая не предназначена для этого, звучит для меня как множество ошибок в будущем. - person Dirk Boer; 04.01.2013
comment
@DirkBoer Зависит. В объектно-ориентированном подходе говорится, что они зависят только от интерфейса объектов (как они ведут себя), а не от их типа (от того, что они собой представляют). - person Kos; 11.03.2013

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

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

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

person glglgl    schedule 09.01.2012
comment
Почему на языке, в котором я не знаю тип до времени выполнения, он все еще осуждается? - person Andrey Rubshtein; 09.01.2012
comment
@Andrey - что бы вам передал такой префикс, как lpsz, если бы вы не знали тип до времени выполнения? - person Throwback1986; 09.01.2012
comment
@ Throwback1986, Предположим, я использую только префикс i для целых чисел, b для логических и т. Д. Это довольно просто и позволяет мне читать код и понимать, что это за тип. - person Andrey Rubshtein; 09.01.2012
comment
Я предлагаю вам прочитать первоначальное назначение венгерской системы обозначений. Подводя итог, цель заключалась в том, чтобы передать использование или семантику, а не тип хранения данных. Я считаю поучительным, что Microsoft - организация, в значительной степени ответственная за распространение некорректного использования - теперь выступает за отказ от использования HN. msdn.microsoft.com/en-us/library/ fzcth91k% 28VS.71% 29.aspx - person Throwback1986; 09.01.2012

ИМХО, никогда (*) не имеет смысла использовать венгерские системы (с префиксом типа данных). Либо вы используете статический язык, либо динамический язык, но и компилятор, и интерпретатор заботятся о системе типов. Аннотирование типа переменной с помощью имени переменной может вызвать только двусмысленность (например, представьте себе число с плавающей запятой с именем 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) не передает ту же информацию. Поскольку вам также необходимо установить dVariables, он также служит документацией для ваших переменных.

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

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

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

person Egon    schedule 09.01.2012
comment
Он вполне может работать в Фортране с неявной типизацией. - person Vladimir F; 10.01.2012
comment
@VladimirF: насколько я понимаю, неявная типизация - это просто товар, синтаксический сахар, если хотите. Когда вы используете Системную венгерскую нотацию, вы также можете использовать The Right Thing® и правильно определить тип, чтобы компилятор работал на вас и обнаруживал любые соответствующие ошибки. Венгерская нотация IMHO Systems даже уменьшает преимущества неявной типизации (поскольку вы прикрепляете тип неформально), добавляя только такие недостатки, как возможные несоответствия. Не стесняйтесь спорить, поскольку у меня нет опыта работы с Фортраном и его неявной типизацией. - person Egon; 12.01.2012

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

person Throwback1986    schedule 09.01.2012

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

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

Все это верно и для Python.

person Community    schedule 09.01.2012