Wiki

Convenção desenvolvedor/Convenção código/Java

Convenções de nomenclatura #

Convenções de nomenclatura tornam os programas mais compreensíveis ao fazer com que a sua leitura seja facilitada. Elas também fornecem informação do funcionamento de um identificador – por exemplo, se este trata-se de uma constante, pacote ou classe – o qual pode ser muito útil para o entendimento do código.

Nomenclatura de pacotes #

A estrutura de pacotes dos projetos é muito importante pois, além de interferir no próprio código fonte, ela define grupo e nome no repositório Maven, nome do arquivo a ser construído (build), entre outras coisas. A estrutura de pacote é a assinatura dos componentes. No Framework Demoiselle o nome dos pacotes é definido a partir de uma estrutura raiz a qual segue o modelo abaixo:

br.gov.frameworkdemoiselle.<nome_componente ou funcionalidade>

Deve-se substituir <nome_componente ou funcionalidade> pelo nome do componente a ser referido ou funcionalidade quando for codigo do Core ou Extensões.

Especialmente, existe o pacote internal que deve ser usado para identificar o conjunto de classes que são de uso interno. Classes de uso interno poderão ser modificadas conforme a necessidade do projeto, sem a preocupação com quebra de versão.

Veja na tabela a seguir alguns exemplos de nomes de pacotes criados segundo a regra acima :

ProjetoComponente/FuncionalidadeNome do pacote raiz
Framework - Core/ExtensionsInternalbr.gov.frameworkdemoiselle.internal
Framework - Core/ExtensionsAnotationbr.gov.frameworkdemoiselle.annotation
Framework - Core/ExtensionsUtilbr.gov.frameworkdemoiselle.util
Framework - Core/ExtensionsTemplatebr.gov.frameworkdemoiselle.template
ComponentMailbr.gov.frameworkdemoiselle.mail
ComponentMailbr.gov.frameworkdemoiselle.mail.internal
ComponentMailbr.gov.frameworkdemoiselle.mail.util

Tendo definido o pacote raiz, é preciso definir subpacotes nele os quais abrigarão as classes, interfaces, anotações e outros artefatos relacionados.

A estrutura para os outros projetos segue o seguinte formato:

br.gov.frameworkdemoiselle.<Projeto>.<SubProjeto>
Projeto SubProjeto Nome do pacote raiz
Tools Nimble br.gov.frameworkdemoiselle.tools.nimble
Sample Estacionamento br.gov.frameworkdemoiselle.sample.estacionamento

Exemplos de nomes de artefatos #

Eis alguns exemplos de nomes qualificados de artefatos existentes nos projetos:

Demoiselle Core

br.gov.frameworkdemoiselle.internal.proxy.Slf4jLoggerProxy
br.gov.frameworkdemoiselle.annotation.ViewScoped
br.gov.frameworkdemoiselle.util.Strings
Demoiselle Extensions

br.gov.frameworkdemoiselle.internal.proxy.HttpSessionProxy
br.gov.frameworkdemoiselle.template.PageBean
Demoiselle Components

br.gov.frameworkdemoiselle.mail.util.MailUtil
Demoiselle Tools

br.gov.frameworkdemoiselle.tools.nimble.gui.GenericFrame
Demoiselle Sample

br.gov.frameworkdemoiselle.sample.estacionamento.domain.Automovel

Nomenclatura de classes #

O nome de uma classe é sempre um substantivo, e é composto por uma mistura de letras maiúsculas e minúsculas. A primeira letra de cada palavra que compõe o nome da classe deve ser maiúscula.

Tente manter o nome das classes simples e descritivo. Utilize palavras inteiras e evite acrônimos e abreviações a menos que estes sejam mais comumente usados do que a forma completa (e.g. URL ou HTML).

Eis alguns exemplos de nomes de classes válidos segundo as regras anteriores:

  • Auction, Professor, Constant, Cookie, Email, Connection;
  • ContaCorrente, PapelUsuario, ImageLoader, TransactionResource;
  • ImageFileReader, WebMessageAction, JDBCTransactionResource.

Sufixos de padrões de projeto #

As classes que implementam algum padrão de projeto (design pattern) devem utilizar em sua nomenclatura um sufixo determinado que indique o pattern em questão.

Na tabela a seguir estão listados alguns sufixos para padrões encontrados no código fonte do framework e componentes:

Sufixo Padrão de projeto Exemplo
Facade Façade EscolaFacade
Factory Factory WebDAOFactory
Locator Service Locator ContextLocator
Proxy Proxy EntityManagerProxy

Classes que representam os padrões JavaBeans ou POJO (Plain Old Java Object) simplesmente não possuem sufixo que os designem como tal. Eis alguns exemplos: Aluno, Disciplina, Usuario, Auction, Bid, Order.

Sufixos da arquitetura de referência #

Sufixo Padrão de projeto Exemplo
BC Business Controller TurmaBC
DAO Data Access Object FuncionarioDAO
MB Managed Bean AlunoMB

Outros sufixos possíveis #

Sufixo Descrição Exemplo
Config Classe utilitária para leitura de configurações, anotada com @Configuration. EstacionamentoConfig
Context Classes que implementam as interfaces que agem nos diferentes contextos. WebSecurityContext
Exception Classe do tipo exceção, as quais estendem a Exception. WebTransactionException
Handler Classe destinada a manipular determinada operação. PersistenceHandler
Listener Classe representando um Listener da API Servlet. WebSecurityServletRequestListener
Manager Classe destinada a gerenciar determinada funcionalidade. GenericInjectionManager
Mock Classe que visa a execução de verificações com o EasyMock. HibernateMock
Servlet Classe representando um Servlet da respectiva API. WebRedirectServlet
Stub Classe que visa simular a funcionalidade real de outra classe. SerializableStub
Test Classe que representa um caso de teste unitário em JUnit. InjectionContextTest
Util Classe contendo métodos utilitários destinados a um propósito comum. HibernateUtil

Nomenclatura de enumerações #

As enumerações (enums) também obedecem às regras de nomenclatura das classes, mas às vezes podem conter o sufixo "Type" ou o prefixo "Tipo" em aplicações de referência. Eis alguns exemplos de enumerações:

  • Status, Severity, Color, Sexo, Turno, Resultado;
  • InfoMessage, TransactionType, CustomType, TipoAcesso.

Internamente os itens da enumeração devem ser nomeados segundo a regra para a nomenclatura de constantes (a ser definida nas seções seguintes).

Seguem exemplos de implementações de enumerações:

public enum TransactionType {

       JTA, LOCAL;

}

public enum ConfigType {

       SYSTEM,
       XML,
       PROPERTIES;

}

Nomenclatura de anotações #

As anotações (annotations), declaradas através da cláusula @interface, serão usadas em declarações de outras classes através do operador @NomeAnotação, e por isso devem possuir nomenclatura de fácil assimilação. Seguem alguns exemplos de anotações:

  • Configuration, Description, Report, Scheduler;
  • ConfigKey, RequiredRole, EqualsField, OIDExtension;
  • DefaultPersistenceUnit, ICPBrasilExtension.

Nomenclatura de métodos #

Os métodos deverão ser nomeados com verbos, através de uma mistura de letras minúsculas e maiúsculas. Em princípio todas as letras que compõem o nome devem ser mantidas em minúsculo, com exceção da primeira letra de cada palavra composta a partir da segunda palavra. Além disso, no caso de siglas ou acrônimos (ex: UID, HQL, JPQL), suas respectivas letras devem ficar todas em maiúsculo exceto se estiverem na primeira palavra do nome.

Tipicamente os verbos serão escritos no tempo infinitivo, porém existem casos especiais em que esse padrão não é usado. Veja na tabela a seguir as diversas formas de se nomear um verbo segundo uma classificação pela sua funcionalidade.

Classificação Descrição Exemplos
Ações diretas O método executa uma única e determinada ação, sem a necessidade de maiores detalhes ou explicações. Ex: limpar, criar, iniciar, executar, finalizar. clear()
create()
end()
execute()
init()
Ações simples O método executa uma ação e em sua nomenclatura é especificado o objeto desta ação, como se fosse uma frase. Ex: incluir mensagem, construir objeto, iniciar transação, enviar e-mail. addMessage()
buildObject()
beginTransaction()
saveCookie()
sendEmail()
Ações simples Caso o objeto da ação seja um nome composto, ele será descrito adequadamente na nomenclatura. Ex: criar consulta nomeada, calcular primeiro resultado, preencher parâmetros nomeados da consulta. createNamedQuery()
calculateFirstResult()
fillQueryNamedParameters()
Ações contendo preposição e ou conjunção Caso o nome do método não fique claro em relação à frase que o descreve, é preciso incluir preposições tais como "For" (para), "With" (com) e "By" (por) ou conjunções tais como "And" (e) e "Or" (ou). Ex: criar consulta de contagem para JPQL, encontrar pelo exemplo, descarregar e limpar, salvar ou atualizar. createCountQueryForJPQL()
createWithLazyCreateProxy()
findByExample()
flushAndClear()
saveOrUpdate()
Métodos do tipo getters e setters Segundo o padrão JavaBeans, para efetivamente obter encapsulamento das propriedades de uma classe, deve-se utilizar métodos do tipo get (obter) e set (atribuir) na manipulação dos campos. getInstance()
getMaxPages()
getEntityManager()
setResponse()
setSecurityContext()
setWrappedData()
Verificação de resultados lógicos (booleanos) Quando houver a necessidade de se recuperar um resultado booleano, encoraja-se utilizar os verbos "ter" e "ser/estar" no tempo presente e na língua inglesa, sempre visando fazer uma pergunta. Por exemplo: tem recurso?, está vazio?, está aberto?, usuário está no papel?. hasDefault()
hasResource()
isEmpty()
isOpen()
isRowAvailable()
isUserInRole()
Eventos Em determinadas interfaces existe a padronização de nomenclatura utilizando-se o verbo ao final e no tempo passado, indicando a ocorrência de um evento específico. Ex: requisição iniciada, página renderizada. requestDestroyed()
requestInitialized()

Nomenclatura de variáveis #

O nome de uma variável, se formado por uma única palavra, deve ser declarado inteiramente em minúsculo. No caso de palavras compostas, apenas a primeira letra de cada palavra, a partir da segunda palavra, deve estar em maiúsculo. Em se tratando de siglas ou acrônimos (ex: CPF, HTML, URL), suas respectivas letras devem ficar todas em maiúsculo exceto se estiverem na primeira palavra.

Os nomes de variáveis e identificadores em geral no Java não podem começar com caracteres especiais e nem com números e, apesar de válido, devem-se evitar os caracteres underscore "_" e cifrão "$".

Além disso, o nome das variáveis devem ser pequenos e de fácil entendimento. A escolha do nome de uma variável deve ser mnemônica, ou seja, projetado para indicar a um observador casual a intenção de seu uso.

Todavia, variáveis cujo nome tenha apenas um caractere deve ser evitado, com exceção de variáveis temporárias utilizadas em laços de repetição, onde geralmente usamos i, j ou k.

Quando a variável tiver a função de representar uma coleção de objetos, tais como array, lista ou conjunto, deixe o seu nome no plural (ex: nomes, values).

Seguem alguns exemplos de nomes de variáveis segundo as regras acima:

  • name, page, list, instance, log, context, loader, object, clazz;
  • rowIndex, className, parameterTypes, urlExists, possuiCPF;
  • totalNumRows, actionClassName, serialVersionUID.

Nomenclatura de constantes #

O nome das constantes sempre deve ser declarado em letras maiúsculas, separadas por underscores “_” no caso de existirem múltiplas palavras.

Eis alguns exemplos de declarações de constantes segundo as regras acima:

public static final String PROFESSOR = "role_professor";

public static final String TURMA_VISUALIZAR = "turma_visualizar";

public static final String FRAMEWORK_CONFIGURATOR_FILE = "demoiselle.properties";

public static final String WEB_REDIRECT_SERVLET_URL_PATTERN = "/redirect";

private static final long MILISSEGUNDOS_EM_30_ANOS = 933120000000l;

private static final String[] NOMES_MULHERES = {"Ana", "Beatriz", "Camila"};
0 Anexos
13299 Visualizações
Média (0 Votos)
A média da avaliação é 0.0 estrelas de 5.
Comentários
Sem comentários ainda. Seja o primeiro.