Pregunta

En Perl, la referencia a cualquier cosa es un simple escalar, y tiene el sello $. A veces es difícil decir qué tipo de referencia que es.

Me nombres de variables personalmente prefijo para referencias con una letra que indica el tipo ref. Ejemplos:

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

he visto tanto partidarios como oponentes a esa notación. Cómo se utiliza? ¿Tiene algunas desventajas?

¿Fue útil?

Solución

Personalmente, creemos que la notación húngara difícil de leer. Sólo tiene que utilizar las convenciones del inglés:

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

Por lo general tratar los objetos lo mismo que los escalares debido a cómo se utiliza lo hace bastante obvio que se trata de un objeto. Sin embargo, si alguna vez encuentro la necesidad de que haría uso:

my $value_obj;  # is an object

Otros consejos

Meh. Arrayrefs y hashrefs y similares no terminan siendo confuso que por aquí que la cuestión viene a nuestro Perl-tipos de datos muy a menudo. (También:??? $oValue Cómo puede usted ser genérica ¿Qué clase de un objeto es que)

Dame-semánticos unidades notación húngara en su lugar: $size_bits, $size_bytes, $size_kb, $size_blocks, $size_mb, $size_gb. El tipo de datos subyacente? No es tan importante como la adición de 3 bytes a 10 megabytes por segundo y conseguir 13. Eso es donde la notación húngara de alguna forma es útil.

Si desea lenguas tipos estáticos, ya sabes dónde encontrarlos ...

Sin embargo, la notación húngara no se pretende que sea sobre tipos de datos técnicos (a pesar de que se ha ganado la mayor parte de su mala reputación de ser mal entendido y se aplica todos los tipos de datos técnicos). El húngaro que inventó originalmente (Charles Simonyi) destinado a transmitir semántica de la información, por ejemplo, utilizando row y col prefijos en el código que se ocupa de las tablas para que no se mezclan hasta índices de fila y columna.

El propósito de la notación húngara es incrustar semántica anotaciones que

  • no puede de otro modo ser expresada dentro de la lengua, especialmente el sistema de tipos y
  • no son evidentes a partir del contexto

en los nombres de las variables. Ahora, ya que Perl no tiene un sistema de tipo estático, podría parecer que la notación húngara debe ser bastante común. Sin embargo, tomar el ejemplo canónico para el valor de la notación húngara:. Rastrear el origen de los datos no es de confianza

Uno de los ejemplos citados frecuentemente para la notación húngara es para prefijar todas las variables de cadena en una aplicación, ya sea con s o u (por seguro y inseguro ), dependiendo de si la cadena de vino de una fuente de confianza (o se ha desinfectado) o uno que no se confía. Pero: basta con sustituir insegura con contaminada y tiene una descripción perfecta de contaminar en Perl. Por lo tanto, en este caso, a pesar de que Perl no tiene un sistema de tipo estático, que tiene un dinámico sistema de tipos que le permite expresar la semántica de los que no se confía en el lenguaje y por lo tanto la notación húngara / de confianza es superfluo. (E incluso en un lenguaje sin soporte incorporado para menoscabar, por lo general hay maneras mucho mejores, como subtipificación (Python, Ruby, Smalltalk, ...), anotaciones / atributos (Java, C #, ...), los metadatos (Clojure, ...) y de tipos estáticos (Haskell, ML, ...).)

Además, Perl es bastante expresiva polígono industrial, y por lo tanto es mucho más fácil de mantener todo el contexto de una variable en la cabeza (o dentro de una pantalla completa de código), por lo que, con bastante frecuencia la semántica son evidentes a partir del código circundante.

Buena denominación también ayuda, por supuesto.

Recuerde:. Notación húngara fue inventado para C, que no es expresivo y tiene un sistema de tipo estático cuya prácticamente sólo uso es como el remate de una broma

No hago esto porque el uso de una referencia hará patente su cosita. Por ejemplo:

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

La elección de nombres para las variables que se comunican lo que representan que recorrer un largo camino. Perl fue diseñado por un lingüista y toma prestado del lenguaje natural, por lo que el contexto es clave. Nuestros cerebros ya están cableados para este tipo de procesamiento. Hacer uso de la misma en la forma en la estructura de su código!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top