backend - HemersonGH/sigesdp GitHub Wiki
< Home < Padrões de Código < Backend
Padrões Backend
Padrões Java
O desenvolvimento da camada de negócio será realizada em Java com o play framework.
O seguintes padrões serão utilizados como REGRA no desenvolvimento do projeto:
- O padrão de codificação segue o padrão java (CamelCase) e deve seguir as convenções de código da Oracle (Oracle Code Conventions)
- Todos atributos de classes deverão estar em português.
- Todas as mensagens que são retornadas ao usuário, devem estar contidas no arquivo "messages"
- Querys nativas devem ser evitadas, podendo ser utilizadas apenas caso houve uma limitação de tecnologia. Caso seja necessário a criação de query nativa, é obrigatório a utilização do StringBuilder e os padrões de código de Banco de Dados.
- Todas as variáveis de configurações devem estar contidas em uma Classe
- Todos os métodos deverão estar em inglês com exceção das palavras que fazem parte do modelo de negócio.
Cada linha deve conter apenas uma declaração:
i++; // Correto
i--; // Correto
i++; j--; // Errado
Declarações de métodos
Métodos com mais de uma linha deve ser adicionado uma linha de indentação após a assinatura do método, sempre adicionar um espaço antes de chaves e sempre agrupar em 'blocos' de código que tenham funções semelhantes:
public static void save(Model model) {
if(model == null) {
throw new IllegalArgumentException("Model nula");
}
model.save();
renderJSON(model, ModelSerializer.model);
}
public Model update(Model model) {
if(model == null) {
throw new IllegalArgumentException("Model nula");
}
this.atributo1 = model.atributo1;
this.atributo2 = model.atributo2;
this.atributo3 = model.atributo3;
return model.save();
}
Declarações if, if-else, if-else if-else
Declarações desse tipo devem sempre ser acompanhadas de chaves {}
// if Correto
if (condition) {
statements;
}
// if-else Correto
if (condition) {
statements;
} else {
statements;
}
// if-else if-else correto
if (condition) {
statements;
} else if (condition) {
statements;
} else {
statements;
}
// Errado!
if(condition)
statements;
//Errado!
if(condition)
statements;
else
statements;
Declarações return
Uma declaração de return só deve acompanhar um parêntesis caso não seja possível retornar sem, exemplos:
//Correto
return;
return value;
return myDisk.size();
return (size ? size : defaultSize);
//Errado
return (value);
return (object.method());
Exemplo Arquivo messages
erro.login=Usuário ou senha inválidos.
Exemplo nome de atributos
// Correto
private String nome;
// Correto
private PessoaFisica pessoaFisica;
// Errado
private String name;
// Errado
private String n;
// Errado
private PessoaFisica pessoa_fisica;
private PessoaFisica pf;
private PessoaFisica pFisica;
Exemplo nome de métodos
//Correto
private void findPessoa(Long id) {
return Pessoa.findById(id);
}
//Errado
private void buscarPessoa(Long id) {
return Pessoa.findById(id);
}
- Todos os métodos das controllers que renderizam JSON devem utilizar Serializers.
Exemplo
//Note que o nome da classe que conterá os serializers é o mesmo nome da controller que a utiliza com o sufixo Serializer
public class PessoasSerializer {
public static JSONSerializer findPessoa;
public static JSONSerializer findPessoa1;
public static JSONSerializer findPessoa2;
static {
boolean prettyPrint = Play.mode == Mode.DEV;
//Note que o nome do serializer é o mesmo nome do método que a utiliza
findPessoa = new JSONSerializer().include(
"nome",
"idade",
"sexo")
.exclude("*");
}
//Caso outro método da mesma controller necessite do mesmo Serializer deve-se somente extender o Serializer
findPessoa1 = findPessoa2 = new JSONSerializer().include(
"nome",
"idade")
.exclude("*");
}
}
/**
* Correto
**/
public class Pessoas extends DefaultController {
private void findPessoa(Long id) {
renderJSON(Pessoa.findById(id), PessoasSerializer.findPessoa);
}
private void findPessoa1(Long id) {
renderJSON(Pessoa.findById(id), PessoasSerializer.findPessoa1);
}
private void findPessoa2(Long id) {
renderJSON(Pessoa.findById(id), PessoasSerializer.findPessoa2);
}
}
/**
* Errado
**/
public class Pessoas extends DefaultController {
private void findPessoa(Long id) {
renderJSON(Pessoa.findById(id));
}
}
- As rotas do sistema deverão seguir o seguinte padrão de rotas Rest:
//Rota para buscar todas as pessoas contidas na base
GET /pessoas Pessoas.findAll
GET /pessoa/{id} Pessoas.find
//Rota de buscar todas as pessoas utilizando um determinado filtro
POST /pessoas Pessoas.findByFilter
//Rota de salvar pessoa
POST /pessoa Pessoas.save
//Rota de deletar pessoa
DELETE /pessoa Pessoas.delete
//Rota de atualizar pessoa
PUT /pessoa Pessoas.update
Temos uma boa referência no blog da Caelum sobre o padrão REST.