quinta-feira, 10 de dezembro de 2009

Regras e Boas Práticas para Nomenclatura no .Net


Já faz um tempo que não atualizo o blog. Graças a Deus as coisas estão se acalmando e agora eu tenho mais tempo vago.

Vou falar um pouco hoje sobre as nomenclaturas e suas regras e boas práticas no dotNet que é algo muito importante na programação que facilita o entendimento do código.

Padrão

Seguir um padrão é uma boa prática de programação, pois como eu disse, facilita e muito o entendimento do código. Mas qual padrão escolher? Então se você programava em VB6, C++, Delphi ou Java certamente existia um padrão, ou você mesmo pode ter inventado um padrão.

Bem, eu aconselho utilizar o padrão do próprio dotNet. Sim existe um padrão que faz parte das boas praticas do dotNet. Você pode observar o próprio framework onde há várias bibliotecas e tudo segue um padrão. A importância de se programar no padrão da sua linguagem é que fica “compatível” com a biblioteca dela, por isso não é legal utilizar o padrão do Java no dotNet ou vice-versa.

Estilos de Escrita

Antes de mostrar as regras, vamos conhecer os três estilos de escrita (casing styles) de identificadores no dotNet:

Caso Camelo/Camel Casing

No caso camelo a primeira letra do identificador é minúscula, caso o identificador é formado por mais palavras, as letras iniciais do restante das palavras é iniciado com letra maiúscula.
Exemplos: casoCamelo, soma, minhaVariavelNumerica .

Caso Pascal/Pascal Casing

No caso Pascal a primeira letra do identificador é maiúscula e o restante da palavra é minúsculo, assim como o caso camelo, caso o identificador seja formado por mais de uma palavra elas serão iniciadas com letra maiúscula.
Exemplos: CasoPascal, Soma, DesenhaRetanguloArredondado, ToString.

Uppercase:

Nesse caso todas as letras são maiúsculas. É utilizado apenas em siglas.
Exemplos: UI, IO

Onde Utilizar Cada Estilo

Variáveis Locais, Parâmetros e Campos Privados - Caso Camelo

O caso camelo é usado em nomes de variáveis locais, campos privados (variável no escopo da classe) e parâmetros.

Não se usa nunca uma variável publica ou protegida(protected) no escopo da classe, é utilizado property para encapsular e dar acesso publico ou protegido.

Ao nomear uma variável tente deixar o nome mais legível possível, legibilidade acima de abreviação, mesmo que fique um pouco grande o nome. Se for usar siglas tem que utilizar algo que as pessoas entendam, que seja natural.

Ao nomear uma variável ou um método evite colocar o tipo no nome mas priorize o sentido. Por exemplo ao invés de declarar "salarioDec" deixe apenas "salario" dessa maneira estará priorizando o sentido.
Outro exemplo é o método "GetLenght" que é melhor que "GetInt" ou "GetLenghtInt".
GetLenght poderia retornar basicamente qualquer coisa, poderia ser uma string "grande"/"medio"/"pequeno" ou um enum e etc. No fundo o tipo é o menos importante em um nome, você descobre ele passando o mouse em cima ou de outras maneiras, mas o sentido é realmente importante, você sabe que está retornando um tamanho.

Não utilize notação húngara onde as variáveis começam com um prefixo muitas vezes simbolizando um tipo.
Exemplo iRetorno, strNome.
Nomes de componentes é legal colocar prefixos("btnOk", "tbxNome") facilita e muito o entendimento do código, renomeie os controles que você for utilizar no código, se for um label que vai ficar parado na tela não há porque mudar o nome. A intenção é deixar o código mais fácil de entender.

Não use separadores(underlines ou hífens) para separar duas palavras em um identificador, o caso pascal e o camelo suprem essa necessidade deixando as primeiras letras das palavras em maiúscula.

Classes, Structs, Enums e Interfaces - Caso Pascal

Todos os tipos são utilizados o caso pascal.

Lembrando que quando você cria uma classe, alem de ser um tipo de dado ela simboliza um entidade do mundo real definida por atributos e comportamento. Quando for nomear uma classe que simboliza uma única entidade não coloque o nome no plural.
Exemplo: Classe Clientes contem atributos como nome e idade.
A classe Clientes simboliza um único cliente, então não deve colocar ela no plural. Apenas uma instancia de uma coleção de Cliente(List<Cliente>) poderia nomear como clientes ou uma nova classe ClienteCollection.

Não utilize prefixos nas classes, enums ou structs. Exemplo ClsPessoa, CPessoa.
Apenas interfaces devem começar com o prefixo "I", exemplo: IInterface, ICompareble. É a única exceção da regra.

Os membros do Enum são caso pascal também. Exemplo: Cores.Vermelho, Cores.Amarelo.

Em classe herdada nomeia-se usando o nome da classe base como sufixo. Exemplo: ClienteException, EsmeraldinoEventArgs.

Métodos, Property, Eventos e Namespaces - Caso Pascal

Todos eles são caso pascal e tudo que for publico ou protegido(protected).

Ao nomear um método tente mostrar a ação dele, pois normalmente métodos executam ações. Não de nomes que revelam detalhes da implementação, deixe mais abstrato possível o nome de maneira que qualquer desenvolvedor entenda.

No primeiro tópico há dicas que servem para métodos.

Nomeie a propriedade usando um adjetivos ou substantivo, normalmente elas encapsulam uma característica da classe.

Não faça propriedade com o mesmo nome de um método Get/Set. Exemplo: Propriedade Idade e métodos GetIdade e SetIdade.
Isso irá causar confusão no desenvolvedor.

Em propriedades booleanas coloque os nomes afirmativos, exemplo: IsNew ao invés de IsNotNew.
Você pode colocar prefixos como Is, Can e Has em propriedades booleanas.

Ao nomear um evento alem de demonstrar sua ação, de uma noção de tempo se é antes ou depois. Exemplo: IdadeChanging(antes) e IdadeChanged(depois).

Crie os eventos com o EventHandler de modo que a assinatura fique no padrão "sender" que é o objeto que disparou o evento e "e" que é o argumento, derivado da classe EventArgs.

Considerações Finais e Referências

Espero ter esclarecido esses pontos que eu considero de extrema importância no desenvolvimento de um software. Essas praticas ajudam a você mesmo a entender seu código e dar manutenção em um futuro não muito distante.

Verifique as referências abaixo, há mais detalhes.

MSDN Guidelines for Names -

http://msdn.microsoft.com/en-us/library/ms229002.aspx


MSDN Capitalization Conventions -
http://msdn.microsoft.com/en-us/library/ms229043.aspx

MSDN General Naming Conventions -
http://msdn.microsoft.com/en-us/library/ms229045.aspx

MSDN Names of Classes, Structs, and Interfaces -
http://msdn.microsoft.com/en-us/library/ms229040.aspx

Tiago Esmeraldino

Nenhum comentário:

Postar um comentário