Por que a Microsoft criou parâmetros, variáveis ​​locais e campos particulares com a mesma convenção de nomenclatura?

18

Eu fiz essa pergunta há algum tempo: Como você nomeia suas variáveis ​​privadas em C #?

Em uma das respostas, fui apontado para a página MSDN da Microsoft que mostra que variáveis ​​/ campos particulares devem ter o seguinte nome:

private int myInteger;

Mas um parâmetro seria:

void SomeMethod(int myInteger)

e uma variável local seria assim:

int myInteger;

Então, quando você os referencia assim

myInteger = 10;

você não tem como saber de quem está falando.

Agora estou iniciando um novo projeto e um dos meus colegas de trabalho está me perguntando por que não fazemos algo para diferenciar pelo menos alguns deles.

Eu estou pensando a mesma coisa. Por que o padrão da Microsoft não manteve essas diferenças?

Vaccano
fonte
10
O que você quer dizer com "você não tem como saber de quem está falando"? Claro que sim - escopo.
Thomas Owens
2
Essa orientação parece desatualizada, o padrão de novo compartilhador (que se tornou um guia de estilo defacto) recomenda o prefixo de campos particulares com um sublinhado, que é o que eu sempre fiz de qualquer maneira.
25
@kekekela: Não está absolutamente desatualizado; O StyleCop sinalizará explicitamente quaisquer instâncias de variáveis ​​de membro que começam com um sublinhado. Francamente, acho o sublinhado inútil e irritante, porque a caixa transmite exatamente a mesma informação. Se você precisar tornar o escopo explícito, prefixe a atribuição com this..
Aaronaught
12
@Aaronaught eu acho um monte de "isso" redundante. espalhadas pelo meu código inútil e irritante.
12
@kekekela: O único lugar que eu alguma vez encontrar-me ter de fazer isso é no construtor, e no construtor faz todo o sentido, porque você está literalmente passando os valores que inicializar os campos membros ( this.component = component). Se você se deparar com escopos ambíguos em outros lugares, de modo que tenha "um monte de 'isso' redundante". espalhadas pelo seu código ", você terá um código mal escrito.
precisa saber é o seguinte

Respostas:

14

As convenções de nomenclatura originais tinham um prefixo m_ para os alunos, que foi reduzido a um sublinhado simples. Você verá muitos códigos Microsoft C # mais antigos usando um prefixo de sublinhado. No entanto, ouvi em um Tech Ed uma vez que um sublinhado principal não é compatível com CLS. Suponho que essa seja a razão pela qual eles mudaram para o esquema mais simples de um nome serve para todos. Costumava ser (não tenho certeza agora) que os nomes sem distinção entre maiúsculas e minúsculas do VB.Net também não eram compatíveis com CLS.

Quanto vale, ainda uso o sublinhado principal para os alunos. Mesmo que você possa desambiguar usando isso (this.name em vez de name), os erros ainda são resolvidos.

Você não precisa fazer tudo o que a MS solicitar.

Dave
fonte
1
Acho que você confundiu "compatível com CLR" com "compatível com CLS". Se algo não fosse compatível com CLR, não seria compilado. O CLS é apenas um aviso de que pode não ser compatível com outros idiomas e afeta basicamente apenas membros públicos (tecnicamente, coisas visíveis fora do seu assembly).
Joel C
@ Joel - Você está correto. Esta pergunta lida com isso: stackoverflow.com/questions/1195030/…
dave
2
Eu continuo a usar o prefixo "m_" ...
CesarGon
4
+1 "para você não precisa fazer tudo o que a MS diz para você". Pense por si mesmos!
Gbjbaanb
1
Ele só não é compatível com CLS se o campo é protected, nãoprivate
Rachel
9

locale parametervariáveis ​​são nomeadas da mesma maneira porque seu escopo é o mesmo

Quanto às variáveis ​​privadas, existem opiniões diferentes sobre isso. Eu sempre usei os padrões encontrados aqui , que especificam o uso de _variáveis líderes antes de particulares, embora o autor diga que isso _é um pouco controverso e que a Microsoft recomenda contra isso.

A Wikipedia afirma que em C e C ++

Os nomes que começam com sublinhado duplo ou um sublinhado e uma letra maiúscula são reservados para implementação (compilador, biblioteca padrão) e não devem ser usados ​​(por exemplo, __reserved ou _Reserved).

talvez essa tenha sido a razão pela qual a Microsoft recomendou isso, embora seja bastante conhecido que muitos desenvolvedores da Microsoft usam um _prefixo para suas variáveis ​​privadas de qualquer maneira.

Rachel
fonte
2
Ponto interessante sobre parâmetros e variáveis ​​locais com o mesmo escopo (+1). Ninguém mais mencionou isso. O corolário é que, se você precisar de uma variável local com o mesmo nome que o parâmetro, poderá apenas usar o parâmetro Pessoalmente, embora eu ache sublinhado feio e impreciso. Considerando que thisdefinitivamente se refere ao objeto atual. Eu não entendo o ódio this. É porque é incompreendido?
Jason S
4

Não sei dizer por que eles não os mantiveram diferentes. É provável que ninguém possa, a menos que alguém que tenha participado da criação dos padrões veja essa pergunta.

Muitas pessoas criam suas próprias convenções prefixando variáveis ​​de instância com _ou m_, mas eu realmente não acho que isso importe. Você pode deduzir muito do contexto e os IDEs hoje em dia são inteligentes o suficiente para ajudá-lo. O Visual Studio com o complemento ReSharper, por exemplo, mostrará variáveis ​​locais e variáveis ​​de instância em cores diferentes.

Se realmente importa diferenciar os dois escopos, você pode usar o this.prefixo para se referir à variável de instância:

public class Test
{
    private int myInteger;

    void SomeMethod(int myInteger)
    {
        this.myInteger = 10; // sets instance variable to 10
        myInteger = 10; // does not affect the instance variable.
    }
}

Sem outros plugins, por padrão, o Visual Studio o ajudará com o Intellisense:

captura de tela

(O pop-up ainda pode ser estilizado pelo ReSharper, mas o ReSharper não adiciona nada aos recursos do Intellisense embutido, portanto, embora o estoque possa parecer um pouco diferente, ainda haverá as duas opções. )

Você também pode usar ferramentas de análise de código como FxCop e StyleCop para ajudá-lo a detectar possíveis problemas com nomes e escopo de variáveis.

Adam Lear
fonte
Para elaborar um pouco this, eu sempre prefiro this, porque definitivamente se refere à instância atual em qualquer casa em que você esteja, por isso é preciso. As convenções de sublinhado ou sublinhado m são exatamente isso - convenções que podem ou não se referir a variáveis ​​de instância e são redundantes por this. O único lugar que vejo sublinhado útil é no VB que não diferencia maiúsculas de minúsculas para distinguir nomes de objetos e classes. Mas isso é outra história.
Jason S
4

Por que o padrão da Microsoft não manteve essas diferenças?

O pessoal da Microsoft escreveu um livro chamado Framework Design Guidelines, que explicava uma série de convenções, incluindo por que algumas coisas foram revestidas com camelo e outras com pascal .

Editar (adicionando detalhes do livro):

No livro, eles mencionam a realização de estudos de usabilidade, bem como algumas das lições aprendidas com a aquisição do grupo Turbo Pascal. Além disso, enquanto nem todos os idiomas diferenciam maiúsculas de minúsculas (como VB), outros são (como C #), portanto, um deve ser consistente na nomeação. Não se pode depender de diferenças apenas para distinguir itens. Se alguém seguir as convenções usadas pelo restante da estrutura, isso levará a menos confusão por parte dos desenvolvedores.

Capítulo 3, Diretrizes de nomeação.
Seção 3.1 são convenções de capitalização.

camelCasingé para nomes de parâmetros.
PascalCasingé para namespace, tipo e nomes de membros. No caso de haver acrônimos de duas letras como parte do nome, mantenha-os em maiúsculas juntos, como IOStream.

Seção 3.5 aborda classes de nomes, estruturas e interfaces.
A Seção 3.6 abrange os membros do tipo de nomeação.
A seção 3.7 cobre os parâmetros de nomeação.

Tangurena
fonte
4
Gostaria de resumir para aqueles de nós que não possuem o livro?
Kramii Reinstate Monica
Eu concordo com o Kramii. Um resumo seria ótimo!
Vaccano 16/08/11
@ Kramil, Vaccano, parece que vou ter que verificar novamente a biblioteca. Normalmente, só o faço ao iniciar um novo trabalho e as discussões se voltam para os padrões de nomeação e codificação.
Tangurena
1
lol, então "Não se pode depender de diferenças apenas para distinguir itens", e continua a usar camelCase ou PascalCase para diferenciar itens.
Gbjbaanb
1

Porque eles são bastante distinguíveis, pois dependem do contexto em que foram escritos.

Por exemplo, você já usou um parâmetro como variável de membro? Ou uma variável local como parâmetro? Que tal uma variável de membro como local?

  • Todas as variáveis ​​de membro estão no "corpo" de uma classe. Eu realmente não compro o argumento de que você precisa prefixar o membro quando você pode usá this-lo para diferenciá-lo de uma variável local com um nome semelhante, caso contrário, não é necessário.

  • Uma variável local também é definida apenas dentro do escopo de um método ou no escopo de um bloco de código.

  • Um parâmetro é sempre definido na assinatura do método.

Se você confundir ou misturar todos esses tipos de variáveis, realmente deverá pensar mais no design do código para torná-lo mais legível ou detectável. Dê a eles nomes melhores e mais auto-descritivos do que myInteger.

Spoike
fonte
0

Não consigo responder à sua pergunta sobre os padrões da Microsoft. Se você quer um padrão para diferenciar essas coisas, o uso padrão I para os parâmetros PL / SQL é prefixar o nome do parâmetro com in_, out_, io_, para os parâmetros in-, OUT-, e in-OUT-. Variáveis ​​locais para uma função são prefixadas com a v_.

FrustratedWithFormsDesigner
fonte
0

A maioria das empresas que conheço possui padrões de codificação que especificam um sublinhado ou a letra minúscula m (para "membro", presumo)) como um prefixo para suas variáveis ​​de membro.

então

_varName

ou

mVarName

ElGringoGrande
fonte
2
Sim, mas a Microsoft descontinuou o uso do m para membros, que é o que o OP está obtendo.
Christopher Bibbs
"A maioria das empresas" não inclui a Microsoft, que é a empresa que trata dessa questão.
Aaronaught
1
Eu não sabia que o MSDN da Micrsoft é para padrões internos de codificação da Microsoft.
Jeffo
1
@ JeffO: Você está certo, não é, mas suas diretrizes internas de codificação dizem a mesma coisa .
Aaronaught 15/08
0

Assim como outras pessoas apontaram, geralmente você pode dizer qual é qual pelo escopo em que o item é usado. Você realmente não pode ter o parâmetro e a variável local no mesmo escopo e, se quiser a variável privada, use this.myInteger. Portanto, não acho que a Microsoft se preocupe muito com isso, pois você pode diferenciá-los facilmente, se quiser.

Mas, dito isso, estou um pouco surpreso que ninguém tenha dito isso ainda, mas esqueça a Microsoft e suas convenções de nomenclatura (bem, alguém já deveria ter dito isso agora, pois eu tive que correr para uma reunião e deixar isso aberto sem enviar isto). A notação húngara também foi uma convenção de nomenclatura iniciada na Microsoft (ou era a Xerox? Eu nunca me lembro quando Simonyi surgiu). Não consigo pensar em ninguém que conheço que não amaldiçoe o nome da notação húngara até hoje. Ficamos tão irritados com isso no local que trabalhei que criamos nosso próprio padrão que usamos internamente. Isso fez mais sentido para nós e acelerou um pouco o nosso trabalho (na verdade era bem parecido com o que a Microsoft sugere agora, mas tudo era um caso pascal, com exceção das variáveis ​​privadas).

Dito isto, o novo padrão usado pela Microsoft (a mistura de estojo de camelo e estojo de pascal) não é tão ruim. Mas se você e seus colegas de trabalho não gostarem, crie seu próprio conjunto de padrões (coletivamente é o melhor). É claro que isso depende se sua empresa já possui ou não um conjunto de padrões. Se o fizerem, cumpra-os. Caso contrário, invente o que funciona para você e seus colegas de trabalho. Apenas mantenha a lógica.

Como Aaronaught solicitou citação sobre Charles Simonyi e notação húngara: http://en.wikipedia.org/wiki/Charles_Simonyi

http://en.wikipedia.org/wiki/Hungarian_notation

http://msdn.microsoft.com/en-us/library/aa260976(v=VS.60).aspx

http://ootips.org/hungarian-notation.html

http://www.hitmill.com/programming/vb/Hungarian.html

http://web.mst.edu/~cpp/common/hungarian.html

Os dois últimos são apenas exemplos da notação húngara e o link ootips é apenas algumas citações sobre algumas opiniões sobre o assunto. Observe que também há notação húngara do sistema, mas que, até onde eu sei, chegou à popularidade dos programadores da Microsoft (embora diferentemente do Simonyi para a variação de aplicativos, não sei quem).

JaCraig
fonte
1
1) O húngaro não foi inventado pela Microsoft e 2) o "húngaro" ao qual você está se referindo é do tipo húngaro, e não húngaro.
Aaronaught 15/08/11
Eu nunca disse que a Microsoft veio com isso. Na verdade, eu disse que Charles Simonyi veio com ele (especificamente aplicativos em notação húngara). A Microsoft insistiu bastante, mas eu nunca disse que eles o criaram (na verdade, eu disse que não tinha certeza se ele o criou durante seus dias na Xerox ou na Microsoft). Eu estava dando como exemplo de algo que uma grande empresa (Microsoft) sugeriu como a maneira como as coisas deveriam ser feitas. Meu argumento é que o OP não deve se preocupar com as convenções de nomenclatura que uma empresa para a qual ele não trabalha diz que é o "caminho certo" (a menos que ele trabalhe para a Microsoft, caso em que ele deveria se importar).
JaCraig
[citação necessário]
Aaronaught 16/08
1
Hum, sim, não precisamos de uma citação sobre o que é notação húngara. A [citação necessária] é para todas as reivindicações duvidosas em sua resposta.
Aaronaught