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.