Uma das coisas com as quais luto é não usar a notação húngara. Eu não quero ter que ir para a definição de variável apenas para ver que tipo é. Quando um projeto é extenso, é bom poder olhar para uma variável prefixada por 'bool' e saber que ele está procurando por true / false em vez de um valor 0/1 .
Eu também faço muito trabalho no SQL Server. Prefixo meus procedimentos armazenados com 'sp' e minhas tabelas com 'tbl', sem mencionar todas as minhas variáveis no banco de dados, respectivamente.
Vejo em toda parte que ninguém realmente deseja usar a notação húngara, a ponto de evitá-la. Minha pergunta é: qual é o benefício de não usar a notação húngara e por que a maioria dos desenvolvedores evita isso como uma praga?
coding-style
coding-standards
naming
user29981
fonte
fonte
Respostas:
Como sua intenção original (consulte http://www.joelonsoftware.com/articles/Wrong.html e http://fplanque.net/Blog/devblog/2005/05/11/hungarian_notation_on_steroids ) foi mal compreendida e tem sido ( ab) usado para ajudar as pessoas a lembrarem que tipo de variável é quando o idioma usado não é estaticamente digitado. Em qualquer idioma estaticamente digitado, você não precisa do lastro adicional de prefixos para informar qual é o tipo de variável. Em muitas linguagens de script não tipadas, isso pode ajudar, mas muitas vezes foi abusado a ponto de se tornar totalmente pesado. Infelizmente, em vez de voltar à intenção original da notação húngara, as pessoas acabaram de transformá-lo em uma daquelas coisas "más" que você deve evitar.
A notação húngara, em suma, pretendia prefixar variáveis com alguma semântica. Por exemplo, se você tiver coordenadas de tela (esquerda, superior, direita, inferior), prefixaria variáveis com posições absolutas na tela com "
abs
" e variáveis com posições relativas a uma janela com "rel
". Dessa forma, seria óbvio para qualquer leitor quando você passasse uma coordenada relativa para um método que requer posições absolutas.update (em resposta ao comentário de delnan)
IMHO a versão abusada deve ser evitada como uma praga porque:
listboxXYZ
ouMyParticularFlavourListBoxXYZ
.ui
número inteiro não assinado? uma interface contada não referenciada? algo a ver com interfaces de usuário? E essas coisas podem demorar . Vi prefixos de mais de 15 caracteres aparentemente aleatórios que deveriam transmitir o tipo exato de var, mas realmente apenas mistificar.fonte
AbsoluteXType
e aRelativeYType
, não poderá passar erroneamente uma coordenada relativa Y para uma X absoluta. Prefiro que variáveis que representam entidades incompatíveis sejam de tipos incompatíveis, em vez de ter prefixos incompatíveis. O compilador não cuida de prefixos (ou sufixos).A notação húngara é um anti-padrão de nomeação nos ambientes de programação modernos e na forma de Tautologia .
Repete inutilmente informações sem benefícios e despesas adicionais de manutenção. O que acontece quando você muda
int
para um tipo diferentelong
, agora você precisa pesquisar e substituir toda a sua base de códigos para renomear todas as variáveis ou elas agora estão semanticamente erradas, o que é pior do que se você não tivesse duplicado o tipo no nome.Viola o princípio DRY. Se você precisar prefixar suas tabelas de banco de dados com uma abreviação para lembrá-lo de que é uma tabela, você definitivamente não estará nomeando suas tabelas semanticamente descritivamente. O mesmo vale para todas as outras coisas com as quais você está fazendo isso. É apenas uma digitação extra e trabalha sem ganho ou benefício com um ambiente de desenvolvimento moderno.
fonte
int
para um tipo diferente comolong
..." Simples: <sarcasm> Não mude o nome, porque não há como dizer quantos lugares a mudança ocorrerá. </sarcasm> Então agora você tem uma variável cuja O nome húngaro entra em conflito com a sua implementação. Não há absolutamente nenhuma maneira de dizer quão amplos serão os efeitos da alteração do nome se a variável / função tiver visibilidade pública.A Wikipedia tem uma lista de vantagens e desvantagens da notação húngara e, portanto, provavelmente pode fornecer a resposta mais abrangente para essa pergunta. As opiniões notáveis também são uma leitura bastante interessante.
O benefício de não usar a notação húngara é basicamente apenas evitar suas desvantagens:
Eu mesmo não uso essa notação, porque não gosto do ruído técnico desnecessário. Quase sempre sei com qual tipo estou lidando e quero uma linguagem limpa no meu modelo de domínio, mas escrevo principalmente em linguagens estáticas e com tipos fortes.
fonte
Como um problema específico do MS SQL Server:
fonte
sp_
então fiquei com a convenção.O IMO, o maior benefício de não usar o húngaro, é o fato de obriga a usar nomes significativos . Se você estiver nomeando as variáveis corretamente, deve saber imediatamente que tipo é ou pode deduzi-las rapidamente em qualquer sistema bem projetado. Se você precisa confiar em
str
oubln
ou pior de todos osobj
prefixos para saber que tipo de uma variável é, eu diria que indica um problema de nomenclatura - ou nomes de variáveis pobres em geral ou demasiado genérico para transmitir um significado.Ironicamente, por experiência pessoal, o cenário principal que vi húngaro é a programação de "cult de carga" (ou seja, outro código a usa, então vamos continuar a usá-la apenas porque) ou no VB.NET para solucionar o fato de que a linguagem é diferencia maiúsculas de minúsculas (por exemplo,
Person oPerson = new Person
porque você não pode usarPerson person = new Person
ePerson p = new Person
é muito vago); Também vi prefixar "the" ou "my" (nesse casoPerson thePerson = new Person
ou mais feioPerson myPerson = new Person
), nesse caso específico.Acrescentarei que a única vez em que uso o húngaro tende a ser para controles do ASP.NET, e isso é realmente uma questão de escolha. Acho muito feio digitar
TextBoxCustomerName
ou nãoCustomerNameTextBox
o mais simplestxtCustomerName
, mas até isso parece "sujo". Sinto que algum tipo de convenção de nomenclatura deve ser usada para controles, pois pode haver vários controles que exibem os mesmos dados.fonte
Vou me concentrar no SQL Server desde que você mencionou. Não vejo razão para colocar 'tbl' na frente de uma mesa. Você pode simplesmente olhar para qualquer código tSQL e distinguir uma tabela pela maneira como ela é usada. Você nunca iria
Select from stored_procedure.
ouSelect from table(with_param)
como se fosse uma UDF ouExecute tblTableOrViewName
como um procedimento armazenado.As tabelas podem ser confundidas com uma View, mas quando se trata de como elas são usadas; não há diferença, então qual é o objetivo? A notação húngara pode poupar seu tempo de procurá-la no SSMS (sob tabela ou visualizações?), Mas é isso.
As variáveis podem apresentar um problema, mas precisam ser declaradas e, realmente, a que distância de sua declaração de declaração você planeja usar uma variável? Rolar algumas linhas não deve ser tão importante, a menos que você esteja escrevendo procedimentos muito longos. Pode ser uma boa idéia dividir um pouco o código extenso.
O que você descreve é uma dor, mas a solução da notação húngara não resolve realmente o problema. Você pode olhar o código de outra pessoa e descobrir que o tipo de variável pode ser alterado, o que agora exige uma alteração no nome da variável. Apenas mais uma coisa para esquecer. E se eu usar um VarChar, você precisará examinar a declaração de qualquer maneira para saber o tamanho. Os nomes descritivos provavelmente o levarão mais longe. @PayPeriodStartDate se explica bastante.
fonte
Outra coisa a acrescentar é que, quais abreviações você usaria para uma estrutura inteira como o .NET? Sim, é tão simples lembrar que isso
btn
representa um botão etxt
uma caixa de texto. No entanto, o que você tem em mente para algo assimStringBuilder
?strbld
? Que talCompositeWebControl
? Você usa algo como isto:Uma das ineficiências da notação húngara era que, por ter estruturas cada vez maiores, provou não apenas adicionar benefícios extras, mas também adicionar mais complexidade aos desenvolvedores, porque agora eles precisavam aprender os prefixos não padronizados cada vez mais.
fonte
Para o meu modo de ver as coisas, a notação húngara é uma ilusão para contornar um sistema de tipos insuficientemente poderoso. Nas linguagens que permitem definir seus próprios tipos, é relativamente trivial criar um novo tipo que codifique o comportamento esperado. No discurso de Joel Spolsky sobre notação húngara, ele fornece um exemplo de como usá-lo para detectar possíveis ataques XSS, indicando que uma variável ou função é insegura (nós) ou segura (s), mas que ainda depende do programador para verificar visualmente. Se você possui um sistema de tipos extensível, basta criar dois novos tipos, UnsafeString e SafeString, e usá-los conforme apropriado. Como bônus, o tipo de codificação se torna:
e não acessar as partes internas do UnsafeString ou usar outras funções de conversão torna-se a única maneira de passar de um UnsafeString para um SafeString. Se todas as suas funções de saída tiverem apenas instâncias do SafeString, torna-se impossível gerar uma string não escapada [descobrindo travessuras com conversões como StringToSafeString (someUnsafeString.ToString ())].
Deveria ser óbvio por que permitir que o sistema de tipos verifique corretamente seu código é superior a tentar fazê-lo manualmente, ou talvez esteja de olho nesse caso.
Em um idioma como C, é claro, você está convencido de que int é int e é int, e não há muito o que fazer sobre isso. Você sempre pode jogar com estruturas, mas é discutível se isso é uma melhoria ou não.
Quanto à outra interpretação da notação húngara, o IE prefixa o tipo da variável, isso é estúpido e incentiva práticas preguiçosas como nomear variáveis uivxwFoo em vez de algo significativo como countOfPeople.
fonte
int[]
que pode ser modificado livremente, mas nunca compartilhado" ou "int[]
que pode ser compartilhado livremente apenas entre coisas que nunca o modificarão"? Se umint[]
campofoo
encapsula os valores,{1,2,3}
pode-se encapsular{2,2,3}
sem saber qual "tipo"int[]
dele representa? Eu pensaria que Java e .NET teriam sido muito melhores se - na ausência de suporte ao sistema de tipos, eles tivessem adotado pelo menos uma convenção de nomenclatura para distinguir esses tipos.A notação húngara é quase completamente inútil em um idioma estaticamente tipado. É um recurso básico do IDE para mostrar o tipo de uma variável colocando o mouse sobre ela ou por outros meios; além disso, você pode ver qual é o tipo procurando algumas linhas onde foi declarado, se não houver inferência de tipo. O ponto principal da inferência de tipo é não repetir o ruído do tipo em todos os lugares; portanto, a notação húngara é geralmente vista como algo ruim em idiomas com inferência de tipo.
Em linguagens de tipo dinâmico, às vezes pode ajudar, mas para mim parece unidiomatic. Você já deixou suas funções restritas a domínios / codomains exatos; se todas as suas variáveis são nomeadas com notação húngara, você está apenas reproduzindo o que um sistema de tipos teria lhe dado. Como você expressa uma variável polimórfica que pode ser um número inteiro ou uma string na notação húngara? "IntStringX"? "IntOrStringX"? O único lugar que eu já usei notação húngara foi no código de montagem, porque eu estava tentando recuperar o que obteria se tivesse um sistema de tipos e foi a primeira coisa que já codifiquei.
De qualquer forma, eu poderia me importar menos com o que as pessoas denominam suas variáveis, o código provavelmente ainda será incompreensível. Os desenvolvedores perdem muito tempo com coisas como estilo e nomes de variáveis e, no final do dia, você ainda recebe uma tonelada de bibliotecas com convenções completamente diferentes no seu idioma. Estou desenvolvendo uma linguagem simbólica (ou seja: não baseada em texto) em que não há nomes de variáveis, apenas identificadores exclusivos e nomes sugeridos para variáveis (mas a maioria das variáveis ainda não tem nome sugerido porque simplesmente não existe um nome razoável para eles); ao auditar código não confiável, você não pode depender de nomes de variáveis.
fonte
Como sempre, nesse caso, postarei uma resposta antes de ler as respostas de outros participantes.
Eu vejo três "bugs" em sua visão:
1) Se você deseja conhecer o tipo de uma variável / parâmetro / atributo / coluna, pode passar o mouse ou clicar nele e ele será exibido, na maioria dos IDE modernos. Não sei quais ferramentas você está usando, mas a última vez que fui forçado a trabalhar em um ambiente que não fornecia esse recurso foi no século 20, a linguagem era COBOL, oops, não, era Fortran e meu chefe não entendi porque eu fui embora.
2 / Os tipos podem mudar durante o ciclo de desenvolvimento. Um número inteiro de 32 bits pode se tornar um número inteiro de 64 bits em algum momento, por boas razões que não foram detectadas no início do projeto. Portanto, renomear intX para longX ou deixá-lo com um nome que aponte para o tipo errado é um karma ruim.
3) O que você está pedindo é de fato uma redundância. Redundância não é um padrão ou hábito de design muito bom. Até os humanos relutam em muita redundância. Até os humanos relutam em muita redundância.
fonte
Eu acredito que estar em extrema necessidade de húngaro é um sintoma .
Um sintoma de muitas variáveis globais ... ou de ter funções muito longas para serem sustentáveis .
Se sua definição de variável não estiver à vista, normalmente você terá problemas.
E se suas funções não seguem alguma convenção memorável , novamente há um grande problema.
Essa é ... praticamente a razão pela qual muitos locais de trabalho o resolvem, suponho.
Originou-se nos idiomas que precisavam .
Em tempos de bonança global de variáveis . (por falta de alternativas)
Isso nos serviu bem.
O único uso real que temos para ele hoje é o Joel Spolsky um .
Para rastrear alguns atributos particulares da variável, como sua segurança .
( por exemplo, "A variável
safeFoobar
possui uma luz verde para ser injetada em uma consulta SQL?- Como é chamada
safe
, sim")Algumas outras respostas falaram sobre as funcionalidades do editor que ajudaram a ver o tipo de uma variável à medida que você passa o mouse sobre ela. Na minha opinião, esses também são problemáticos para a sanidade do código . Eu acredito que eles foram feitos apenas para refatoração , como muitos outros recursos (como dobrar funções) e não devem ser usados em novos códigos.
fonte
Acho que as razões para não usar a notação húngara foram bem cobertas por outros pôsteres. Eu concordo com os comentários deles.
Com bancos de dados, eu uso a notação húngara para objetos DDL que raramente são usados no código, mas que, de outra forma, colidiriam nos espaços para nome. Principalmente, isso se resume a prefixar índices e restrições nomeadas com seu tipo (PK, UK, FK e IN). Use um método consistente para nomear esses objetos e você poderá executar algumas validações consultando os metadados.
fonte
TABLE SomeStringById(int somestringId, varchar somestring)
o índice, também seria logicamente,SomeStringById
mas isso causa uma colisão. Então eu chamoidx_SomeStringById
. Então, para seguir o exemplo, fareiidx_SomeStringByValue
apenas porque é bobagem teridx_
um por um e não por outro.o motivo é evitado por causa de sistemas húngaros que violam DRY (o prefixo é exatamente o tipo que o compilador e (um bom) IDE podem derivar)
os aplicativos húngaros OTOH prefixam com o uso da variável (por exemplo, scrxMouse é uma coordenada axial na tela, pode ser um tipo int, curto, longo ou até um tipo personalizado (typedefs permitirá que você a altere facilmente))
o mal-entendido dos sistemas é o que destruiu o húngaro como uma prática recomendada
fonte
Digamos que temos um método como este (em C #):
Agora, no código, chamamos assim:
O int não nos diz muito. O simples fato de algo ser um int não nos diz o que há nele. Agora vamos supor, em vez disso, chamamos assim:
Agora podemos ver qual é o objetivo da variável. Importa se sabemos que é um int?
O objetivo original do húngaro, porém, era fazer com que você fizesse algo assim:
Tudo bem, desde que você saiba o que c significa. Mas você teria que ter uma tabela padrão de prefixos, e todos precisariam conhecê-los, e qualquer pessoa nova precisaria aprendê-los para entender seu código. Considerando que
customerCount
oucountOfCustomers
é bastante óbvio à primeira vista.O húngaro tinha algum objetivo no VB antes de
Option Strict On
existir, porque no VB6 e anterior (e no VB .NET comOption Strict Off
) o VB coagiria tipos, portanto, você pode fazer isso:Isso é ruim, mas o compilador não diria isso. Então, se você usasse húngaro, pelo menos teria algum indicador do que estava acontecendo:
No .NET, com digitação estática, isso não é necessário. E o húngaro era frequentemente usado como substituto de uma boa nomeação. Esqueça o húngaro e escolha bons nomes.
fonte
Encontrei muitos argumentos bons contra, mas um que não vi: ergonomia.
Antigamente, quando tudo que você tinha era string, int, bool e float, os caracteres sibf seriam suficientes. Mas com string + short, os problemas começam. Use o nome inteiro para o prefixo ou str_name para a string? (Embora os nomes quase sempre sejam strings - não são?) O que há com uma classe de rua? Os nomes ficam cada vez mais longos, e mesmo se você usar o CamelCase, é difícil dizer onde termina o prefixo do tipo e onde começa o nome da variável.
Tudo bem - você pode usar sublinhados, se já não os usar para outra coisa, ou usar o CamelCase se você usou sublinhados por tanto tempo:
É monstruoso e, se você fizer isso consequentemente, terá
Você terminará usando prefixos inúteis para casos triviais, como variáveis de loop ou
count
. Quando você usou recentemente um curto ou um longo para um contador? Se você fizer exceções, muitas vezes perderá tempo, pensando em precisar de um prefixo ou não.Se você possui muitas variáveis, elas normalmente são agrupadas em um navegador de objetos que faz parte do seu IDE. Agora, se 40% começam com i_ para int e 40% com s_ para string, e eles são classificados em ordem alfabética, é difícil encontrar a parte significativa do nome.
fonte
O único lugar em que ainda uso regularmente sufixos húngaros ou análogos é em contextos em que os mesmos dados semânticos estão presentes de duas formas diferentes, como a conversão de dados. Isso pode ocorrer nos casos em que existem várias unidades de medida ou em várias formas (por exemplo, String "123" e número inteiro 123).
Acho as razões aqui apresentadas para não usá-lo convincente por não impor o húngaro a outros, mas apenas levemente sugestivo, para decidir sobre sua própria prática.
O código fonte de um programa é uma interface de usuário por si só - exibindo algoritmos e metadados para o mantenedor - e a redundância nas interfaces de usuário é uma virtude, não um pecado . Veja, por exemplo, as imagens em " O design das coisas cotidianas " e veja as portas rotuladas "Push" que parecem com você puxá-las e as torneiras de cerveja que os operadores invadiram os importantes controles do reator nuclear porque de alguma forma "pairando sobre eles no IDE "não era bom o suficiente.
O "apenas pairar em um IDE" não é um motivo para não usar o húngaro - apenas um motivo pelo qual algumas pessoas podem não achar útil. Sua milhagem pode ser diferente.
A idéia de que o húngaro impõe uma carga significativa de manutenção quando os tipos de variáveis mudam é tola - com que frequência você muda os tipos de variáveis? Além disso, renomear variáveis é fácil:
Se o húngaro realmente ajudar você a inserir rapidamente um pedaço de código e a mantê-lo de forma confiável, use-o. Se não, não. Se outras pessoas lhe disserem que você está errado em relação à sua própria experiência, sugiro que provavelmente elas estejam erradas.
fonte