Вопрос

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

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

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

Я видел как сторонников, так и противников такой нотации. Вы используете это? Есть ли у него недостатки?

Это было полезно?

Решение

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

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

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

my $value_obj;  # is an object

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top