Question

En Perl, la référence à tout est un scalaire simple, et a le Sigil de $. Il est parfois difficile de dire quel genre de référence est.

I noms de variables personnellement préfixe pour les références avec une lettre, qui indique le type réf. Exemples:

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

Je l'ai vu deux partisans et opposants à cette notation. Avez-vous l'utiliser? At-il des inconvénients?

Était-ce utile?

La solution

Personnellement, je trouve la notation hongroise difficile à lire. Je viens d'utiliser les conventions anglais:

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

Je traite habituellement des objets les mêmes que parce scalaires comment il est utilisé, il est assez évident qu'il est un objet. Toutefois, si jamais je trouve un besoin de j'utiliser:

my $value_obj;  # is an object

Autres conseils

Meh. Arrayrefs et hashrefs et autres ne finissent pas par être que source de confusion ici que la question est pour nos Perl-données-types très souvent. (Aussi:? $oValue Comment pouvez-vous être générique Quelle sorte d'un objet est-il)

Donne-moi la notation hongroise sémantiques unités à la place: $size_bits, $size_bytes, $size_kb, $size_blocks, $size_mb, $size_gb. Le type de données sous-jacentes? Pas aussi important que l'ajout de 3 octets à 10 méga-octets par seconde et obtenir 13. est où la notation hongroise d'une certaine forme est utile.

Si vous voulez Les langages typés statiquement vous savez où les trouver ...

Mais la notation hongroise n'a jamais été destiné à être sur les types de données techniques (même si elle a gagné la majeure partie de sa mauvaise réputation d'être mal compris et -applied pour les types de données techniques). Le Hongrois qui à l'origine a inventé (Charles Simonyi) destiné à transmettre sémantique des informations, par exemple en utilisant des préfixes de row et col dans le code qui traite des tables afin que vous ne confondez pas les index de ligne et colonne.

Le but de la notation hongroise est d'intégrer des annotations sémantiques

  • ne peut pas être autrement exprimé dans le langage, en particulier le système de type ET
  • ne ressortent pas du contexte

dans les noms des variables. Maintenant, étant donné que Perl ne dispose pas d'un système de type statique, il pourrait sembler que la notation hongroise devrait être assez commune. Mais, prenons l'exemple canonique pour la valeur de la notation hongroise:. Suivi de l'origine des données non fiables

L'un des exemples souvent cités pour la notation hongroise est de préfixer toutes les variables de chaîne dans une application avec soit s ou u (pour sécurité et dangereux ), selon si la chaîne venait d'une source de confiance (ou a été aseptisé) ou un non fiable. Mais: il suffit de remplacer dangereux avec contaminé et vous avez une description parfaite de entachant en Perl. Donc, dans ce cas, même si Perl ne dispose pas d'un système de type statique, il a une dynamique système de type qui vous permet d'exprimer la sémantique de la notation de confiance / non fiable au sein de la langue et donc hongrois superflu. (Et même dans une langue sans prise en charge intégrée pour entachant, il y a généralement beaucoup de meilleures façons, comme le sous-typage (Python, Ruby, Smalltalk, ...), les annotations / attributs (Java, C #, ...), les métadonnées (Clojure, ...) et le typage statique (Haskell, ML, ...).)

En outre, Perl est assez expressif sacrément, et donc il est beaucoup plus facile de garder tout le contexte d'une variable dans votre tête (ou dans une page d'écran de code), donc, assez souvent la sémantique sont visibles à partir du code environnant.

Bon nommage aide aussi, bien sûr.

Souvenez-vous:. La notation hongroise a été inventé C, ce qui est expressif et dispose d'un système de type statique dont l'utilisation à peu près seulement que la punchline d'une blague

Je ne le fais pas parce que l'utilisation sera clairement son thingy de référence. Par exemple:

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

Le choix des noms pour vos variables qui communiquent ce qu'ils représentent ira un long chemin. Perl a été conçu par un linguiste et emprunte le langage naturel, si le contexte est essentiel. Nos cerveaux sont déjà câblés pour ce type de traitement. Exploitez dans la façon dont la structure de votre code!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top