Pergunta

Em Perl, a referência a qualquer coisa é um escalar simples e tem o $ sigilo.Às vezes é difícil dizer que tipo de referência é.

Eu pessoalmente prefixo nomes de variáveis ​​para referências com uma letra, que indica o tipo de referência.Exemplos:

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

Já vi defensores e oponentes dessa notação.Você usa isso?Tem alguma desvantagem?

Foi útil?

Solução

Pessoalmente, acho a notação húngara difícil de ler.Eu apenas uso convenções em inglês:

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

Normalmente trato objetos da mesma forma que escalares porque a forma como são usados ​​torna óbvio que é um objeto.No entanto, se eu encontrar necessidade, usaria:

my $value_obj;  # is an object

Outras dicas

Ah, sim.Arrayrefs e hashrefs e similares não acabam sendo tão confusos por aqui que o problema surge com frequência para nossos tipos de dados Perl.(Também: $oValue?Quão genérico você pode ser?Que tipo de objeto é?)

Em vez disso, dê-me a notação húngara de unidades semânticas: $size_bits, $size_bytes, $size_kb, $size_blocks, $size_mb, $size_gb.O tipo de dados subjacente?Não é tão importante quanto adicionar 3 bytes a 10 megabytes por segundo e obter 13. Que é onde a notação húngara de alguma forma é útil.

Se você deseja linguagens digitadas estaticamente, você sabe onde encontrá-las...

Mas a notação húngara nunca teve a intenção de ser sobre tipos de dados técnicos (embora tenha ganhado a maior parte de sua má reputação por ser mal compreendida e aplicada a tipos de dados técnicos).O húngaro que o inventou originalmente (Charles Simonyi) pretendia que transmitisse semântico informações, por ex.usando row e col prefixos no código que lida com tabelas para que você não misture índices de linhas e colunas.

O objetivo da notação húngara é incorporar anotações semânticas que

  • de outra forma não pode ser expresso dentro da linguagem, especialmente o sistema de tipos AND
  • não são aparentes no contexto

nos nomes das variáveis.Agora, como Perl não possui um sistema de tipos estáticos, pode parecer que a notação húngara deveria ser bastante comum.Mas vejamos o exemplo canônico para o valor da notação húngara:rastrear a origem de dados não confiáveis.

Um dos exemplos frequentemente citados de notação húngara é prefixar todas as variáveis ​​de string em uma aplicação com s ou u (para seguro e inseguro), dependendo se a string veio de uma fonte confiável (ou foi higienizada) ou não confiável.Mas:apenas substitua inseguro com contaminado e você tem uma descrição perfeita de contaminação em Perl.Então, neste caso, mesmo que Perl não tenha um sistema de tipo estático, ele tem um dinâmico sistema de tipo que permite expressar a semântica de confiável/não confiável dentro do idioma e, portanto, a notação húngara é supérflua.(E mesmo em uma linguagem sem suporte integrado para contaminação, geralmente existem maneiras muito melhores, como subtipagem (Python, Ruby, Smalltalk, ...), anotações/atributos (Java, C#, ...), metadados (Clojure, ...) e digitação estática (Haskell, ML, ...).)

Além disso, Perl é bastante expressivo e, portanto, é muito mais fácil manter todo o contexto de uma variável em sua cabeça (ou dentro de uma tela cheia de código), portanto, muitas vezes a semântica é aparente no código circundante.

Uma boa nomenclatura também ajuda, é claro.

Lembrar:A notação húngara foi inventada para C, que não é expressiva e possui um sistema de tipo estático cujo único uso é praticamente o final de uma piada.

Não faço isso porque o uso de uma referência deixará claro o que importa.Por exemplo:

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

Escolher nomes para suas variáveis ​​que comuniquem o que elas representam será uma grande ajuda.Perl foi projetado por um linguista e toma emprestado da linguagem natural, portanto o contexto é fundamental.Nossos cérebros já estão preparados para esse tipo de processamento.Use-o na forma como você estrutura seu código!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top