Enfim, este artigo aplica a segunda técnica, onde retornamos o mais cedo possível. Esta técnica é conhecida como:
RETURN EARLY
Dar um retorno cedo ajuda a descomplicar expressões condicionais. Bem, tudo fica melhor com um exemplo não é? Considere uma classe Seguranca, usada para computar o Nivel de Acesso de um dado Usuario. Veja a seguir:
public class Seguranca {
public enum NivelAcesso {
Nenhum, Visitante, Operador, Administrador;
}
public static NivelAcesso privilegio(Usuario usuario) {
NivelAcesso nivel = null;
if (!usuario.isBloqueado()) {
if (usuario.getCargo() != null) {
if (usuario.getCargo() == Usuario.Cargo.Gerente) {
nivel = NivelAcesso.Administrador;
} else if (usuario.getCargo() == Usuario.Cargo.Funcionario) {
nivel = NivelAcesso.Operador;
}
} else {
nivel = NivelAcesso.Visitante;
}
} else {
nivel = NivelAcesso.Nenhum;
}
return nivel;
}
// ...
Esta implementação aplica um único ponto de saída, um único retorno no fim do método. Isto é bom, por um lado, pois facilita acompanhar o fluxo da lógica, e ruim por outro, pois começa a aninhar as expressões condicionais.
A seguir uma implementação alternativa, uma refatoração, onde é usado o return early:
public class Seguranca {
public enum NivelAcesso {
Nenhum, Visitante, Operador, Administrador;
}
public static NivelAcesso privilegio2(Usuario usuario) {
if (usuario.isBloqueado()) {
return NivelAcesso.Nenhum;
}
if (usuario.getCargo() == Usuario.Cargo.Gerente) {
return NivelAcesso.Administrador;
}
if (usuario.getCargo() == Usuario.Cargo.Funcionario) {
return NivelAcesso.Operador;
}
return NivelAcesso.Visitante;
}
// ...
A mecânica do return early é simples: usar as regras mais restritivas antes, por exemplo, no caso de usuário estar bloqueado já não é necessário checar cargo e demais condições. A regra geral fica no fim, ou seja, no exemplo, se não está bloqueado e não há cargo definido então é visitante.
Para finalizar, esta técnica é independente de linguagem, mesmo que os exemplos estejam escritos em Java.
Código fonte disponível aqui: https://github.com/marciojrtorres/livro-aps/tree/master/return_early

Nenhum comentário:
Postar um comentário