Является ли венгерская нотация применимой к Perl?

В Perl ссылка на что-либо является простым скаляром и имеет сингл $. Иногда бывает трудно сказать, что это за ссылка.

Я лично префикс имен переменных для ссылок с буквой, которая указывает тип ссылки. Примеры:

my $aValues = [];                # arrayref
my $hValue  = {};                # hashref
my $oValue  = bless {};          # object
my $sValue  = \(my $s = 'foo');  # scalarref
...

Я видел как сторонников, так и противников такие обозначения. Вы используете его? Есть ли у него какие-то недостатки?

Ответы

Ответ 1

Лично я считаю, что венгерскую нотацию трудно читать. Я просто использую английские условные обозначения:

my $values; # is an array
my $value;  # is a scalar
my $value_hash; # is a hash

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

my $value_obj;  # is an object

Ответ 2

Мех. Arrayrefs и hashrefs и т.д. Не заканчиваются тем, что запутывают здесь, что проблема часто возникает для наших типов данных Perl. (Также: $oValue? Как вы можете быть похожими на общий объект?)

Вместо этого дайте вместо семантических единиц венгерскую нотацию: $size_bits, $size_bytes, $size_kb, $size_blocks, $size_mb, $size_gb. Основной тип данных? Не так важно, как добавление 3 байт до 10 мегабайт в секунду и получение 13. Это, где полезно использовать венгерскую нотацию какой-либо формы.

Ответ 3

Если вам нужны статически типизированные языки, вы знаете, где их найти...

Но венгерская нотация никогда не была предназначена для технических типов данных (хотя она заработала большую часть своей плохой репутации, которая была неправильно понята и использовалась для технических типов данных). Венгерский, который изначально изобрел его (Чарльз Симони), намеревался передать семантическую информацию, например. используя префиксы row и col в коде, который обрабатывает таблицы, чтобы вы не смешивали индексы строк и столбцов.

Ответ 4

Цель венгерской нотации - вставить семантические аннотации, которые

  • иначе не может быть выражен в языке, особенно в системе типов AND
  • не являются очевидными из контекста

в именах переменных. Теперь, поскольку Perl не имеет системы статического типа, может показаться, что венгерская нотация должна быть довольно распространенной. Но возьмите канонический пример ценности венгерской нотации: отслеживание происхождения ненадежных данных.

Одним из часто цитируемых примеров венгерской нотации является префикс всех строковых переменных в приложении с s или u (для безопасного и небезопасного), в зависимости от того, была ли строка получена из надежного источника (или была дезинфицирована) или ненадежной. Но: просто замените небезопасное испорченным, и у вас есть отличное описание tainting в Perl. Таким образом, в этом случае, даже если Perl не имеет системы статического типа, он имеет систему динамического типа, которая позволяет вам выражать семантику доверенного/ненадежного в языке, и, следовательно, венгерская нотация является излишней. (И даже на языке без встроенной поддержки tainting обычно существуют гораздо лучшие способы, такие как подтипирование (Python, Ruby, Smalltalk,...), аннотации/атрибуты (Java, С#,...), метаданные (Clojure,...) и статической типизации (Haskell, ML,...).

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

Хорошее название также помогает, конечно.

Помните: венгерская нотация была изобретена для C, которая не является выразительной и имеет систему статического типа, которая в значительной степени используется только в качестве начальной строки шутки.

Ответ 5

Я не делаю этого, потому что ссылочное использование будет ясно объяснять его. Например:

$a->{key};  # hash
... if @$b; # array
$c->foo;    # object

Выбор имен для переменных, которые передают то, что они представляют, будет иметь большое значение. Perl был разработан лингвистом и заимствован из естественного языка, поэтому контекст является ключевым. Наши мозги уже подключены для такого рода обработки. Используйте его в том, как ваша структура вашего кода!