Lutando para não usar a notação húngara

10

Eu já vi argumentos a favor e contra a Systems Hungarian . Por alguns anos eu tenho trabalhado em um projeto legado que usa esse sistema, nomeando cada variável, função com um prefixo do tipo de variável, por exemplo (strName, intAge, btnSubmit etc.) (conheço os prefixos originais do Hungarian Apps pelo tipo de variável, não o tipo). Gostaria que meu próximo projeto o abandonasse completamente, mas acho mais difícil nomear coisas semelhantes de maneira única, sem recorrer a ela.

Digamos que eu tenha um formulário da Web para coletar endereços de email e armazená-los em uma tabela de banco de dados e um botão que chama a função que salva o endereço no banco de dados.

Se estiver usando a notação de estilo húngaro, posso chamar a caixa de txtEmailbotão btnEmaile o valor contido na caixa de texto strEmail. Eu poderia usar uma função storeEmail(strEmail)para armazenar o email. Eu tenho uma convenção clara aqui, é óbvio o que cada variável é.

Qual seria a melhor prática para nomear essas variáveis

  • sem recorrer aos sistemas húngaros,
  • sem torná-los longos ou confusos
  • e com uma convenção clara para usar em todo o meu projeto?
medo
fonte
2
Talvez haja algo errado com o restante de suas convenções de nomenclatura ou com o tamanho de suas funções, se você tiver problemas para encontrar nomes exclusivos.
Qual tecnologia você está usando? Esses prefixos parecem se prestar a formulários da Web.
StuperUser
Estou usando ASP.NET (com C # para trás)
fearoffours
@ delnan - você pode elaborar por favor? Por que o tamanho da função facilita a nomeação de maneira exclusiva?
Fearoffours
@earofours: Uma função menor precisa de menos variáveis, e menos variáveis ​​obviamente significam menos conflitos de variáveis. Isso pressupõe, é claro, que você coloque todas as variáveis ​​no menor escopo possível.

Respostas:

8

Seu último ponto é o mais importante - o que você precisar, precisa ser consistente em todo o seu projeto e com seus colegas. Existem duas maneiras principais de obter consistência e, se possível, você deve usar as duas. Primeiro, use uma ferramenta para verificar as convenções de nomenclatura no momento da criação. No mundo .Net, o StyleCop seria um bom exemplo dessa ferramenta. A segunda maneira de obter consistência é ter revisões por pares de todo o código, para que todos possam ficar de olho.

Seus outros dois pontos parecem estar perguntando sobre uma alternativa. Não tenho certeza se você precisa de uma alternativa; o ponto sobre o húngaro não ser mais popular é que ele costumava ser usado para descrever o tipo quando o sistema e as ferramentas de tipo eram um pouco, digamos, menos rigorosos. Ou seja, se você estava programando em C e passando ponteiros pela única maneira de acompanhar o tipo, era usando o húngaro. Agora, se você estiver usando uma linguagem como C # ou Java, não usará ponteiros (ou muito raramente); portanto, a necessidade de qualquer tipo de húngaro desaparece. Além disso, os IDEs modernos permitem ver o tipo com muita facilidade, passando o mouse sobre a variável ou, na pior das hipóteses, usando alguns atalhos para ver a declaração original. Então, acho que você não precisa de nenhum tipo de notação, apenas nomeie a variável pelo que ela faz. Se for um endereço de email, use "email" ou "

Steve
fonte
2
Ele fica um pouco mais complicado quando o formulário / página / janela / whatever tem um botão de e-mail, uma caixa de texto para e-mail, e talvez um outro widget / controle por e-mail ...
FrustratedWithFormsDesigner
7
@FrustratedWithFormsDesigner Não necessariamente. A caixa de texto pode ser emailAddressInput, onde, como botão, emailAddressSubmit e a representação interna, simplesmente emailAddress.
Jonathan
@ Jonathan: Bom ponto.
FrustratedWithFormsDesigner
3

Ao lidar com formulários da web / formulários do Windows / outras coisas gráficas, faz sentido usar o sistema húngaro, já que é possível ter controles muito estreitos - por exemplo, uma caixa de texto e um rótulo juntos; você pode nomeá-los txtEmaile lblEmaildistingui-los. Na minha experiência, isso é comum e é realmente útil.

Mas no seu code-behind, esse tipo de nomeação é desnecessário. Se você tem uma variável do tipo stringque está sendo usada para armazenar um email, apenas nomeie-o email. Se, por algum motivo, você ficar confuso, a maioria dos IDEs deve permitir que você passe o mouse sobre ele e veja seu tipo. (Idealmente, nas coisas OO, pode ser um atributo de algum objeto e user.Emailé ainda mais claro.)

Eu acho que se você tiver mais de um objeto sendo declarado no seu código que não é um controle da GUI que poderia ser nomeado com razão email, algo está inerentemente errado com o seu design.

Andrew Arnold
fonte
11
Atualmente txt e lbl não são húngaro, txt é apenas o texto e lbl é o nome de Label, não há razão para não usar apenas a palavra completa, por exemplo, EmailText e EmailLabel em um formulário. Húngaro seria o tipo, que em ambos os casos é uma sequência.
9788 Steve
11
@ Steve Haigh - Não, eu estou falando sobre os próprios controles. Você tem um objeto do tipo "caixa de texto" chamado txtEmail e um objeto do tipo "rótulo" chamado lblEmail. Nenhum deles são cordas. Eles podem ter propriedades de cadeia, mas não são cadeias de caracteres.
Andrew Arnold
11
Ah desculpa. Sim, claro. Mesmo assim, não há razão para não usar um nome mais descritivo, como EmailTextBox. Só porque o VS gera um nome ruim não significa que você deve mantê-lo. No entanto, no contexto de formulários, as abreviações txt e lbl são tão bem compreendidas que eu provavelmente não me preocuparia nesse caso.
Steve
3

O que torna uma variável "muito longa"?

Em vez de txtEmail, btnEmailvocê poderia usar UserEmailText, UserEmailButtone AdminEmailText,AdminEmailButton

O problema é que você pode começar a sentir que a variável começa a ficar longa:

AdminEmailIsValid começa a limitar o tempo que eu permitiria que a variável tivesse.

Além disso, você pode começar a perceber que está reutilizando um conjunto de variáveis ​​e um conjunto de operações nessas variáveis. É para isso que a OOP foi projetada . Em vez de um conjunto de variáveis, crie um objeto genérico:

class EmailForm
  var textBox, button, text
  function storeEmail()

Em seguida, você pode instanciar uma nova variável como uma classe e usar a mesma notação de ponto para acessar seus dados:

userEmailForm = new EmailForm(...data...)
adminEmailForm = new EmailForm(...different data...)
doSomething( userEmailForm.text )
doSomethingElse( adminEmailForm.text )

Obviamente, isso é direcionado a linguagens que usam o paradigma OOP, mas a maioria das linguagens populares de desenvolvimento da Web é orientada a objetos ou permite código orientado a objetos (PHP, Python, C #, C ++, Java, JavaScript, ActionScript, etc. )

zzzzBov
fonte
Não vejo a vantagem do UserEmailText para o txtEmail - você está apenas com o sufixo do tipo em vez de o prefixar. Eu gosto de "É para isso que o OOP foi projetado", no entanto.
Fearoffours
@fearoffours, OP admitiu ter um problema com nomes exclusivos, adicionei esse exemplo como uma maneira descritiva de distinguir entre duas variáveis ​​semelhantes ( UserEmailTexte AdminEmailTextespecificamente). Normalmente, sufixo os tipos, pois ele se move para uma classe UserEmailText-> UserEmail.text-> User.email.textdependendo da quantidade de abstração / funcionalidade necessária.
precisa saber é o seguinte
OK, veja de onde você está vindo. +1 para a comparação de sufixo / classe. Ah, e eu sou o OP!
Fear11ours
@fearoffours, lol gritos ...
zzzzBov