9

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

https://stackoverflow.com/questions/1184717/hungarian-notation
Why shouldn't I use "Hungarian Notation"?
Are variable prefixes (“Hungarian notation”) really necessary anymore?
Do people use the Hungarian Naming Conventions in the real world?

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

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

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

ответ

4

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

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

+6

размещение других объектов в функции, которая не предназначена для него, звучит для меня как много ошибок в глубине пути. –

+0

@DirkBoer Зависит. Объектно-ориентированный подход говорит, что они зависят только от интерфейса объектов (что они ведут себя), а не от их типа (что они есть). – Kos

1

Принятый ответ от первого вопроса Вы связываетесь с применением одинаковых для Python:

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

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

13

Это зависит от того, какой из two versions вы ссылаетесь:

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

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

+0

Почему это на том языке, на котором я не знаю тип перед выполнением, он все еще нахмурился? –

+2

@ Andrey - что бы такой префикс, как «lpsz», передал вам, если вы не знали тип перед запуском? – Throwback1986

+0

@ Throwback1986. Предположим, что для ints, «b» для булевых и т. Д. Используется только префикс «i» и т. Д. Это довольно просто и позволяет мне читать код и понимать, что это за тип. –

3

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

9

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

+1

Применения Венгерский FTW! – Jonas

+0

Он может служить в Фортране с неявной типизацией. –

+0

@ VladimirF: насколько я понимаю, неявное типирование - это просто товар, синтаксический сахар, если хотите. Когда вы используете системную венгерскую нотацию, вы также можете сделать The Right Thing® и правильно определить тип, чтобы заставить компилятор работать на вас и обнаруживать любые соответствующие ошибки. IMHO Systems Hungarian Notation даже уменьшает преимущества неявного набора текста (поскольку вы прикрепляете тип неформально), но только добавляя недостатки, такие как возможные несоответствия. Не стесняйтесь спорить, поскольку у меня нет опыта работы с Fortran и его неявной типизацией. – Egon