melhor método Java sintaxe? Retornar cedo ou mais tarde?

votos
5

Duplicar: Se uma função tem apenas uma instrução de retorno?

Muitas vezes você pode ter um método que verifica várias condições e retorna um status (digamos boolean por agora). É melhor para definir uma bandeira, configurá-lo durante o método, e devolvê-lo no final:

boolean validate(DomainObject o) {
  boolean valid = false;
  if (o.property == x) {
     valid = true;
  } else if (o.property2 == y) {
     valid = true;
  } ...
  return valid; 
}

ou é melhor / mais correto simplesmente retornar uma vez que você sabe o resultado do método?

boolean validate(DomainObject o) {

  if (o.property == x) {
     return true;
  } else if (o.property2 == y) {
     return true;
  } ...
  return false; 
}

Agora, obviamente, não poderia haver blocos try / catch e todos os outros tipos de condições, mas acho que o conceito é claro. Opiniões?

Publicado 19/05/2009 em 19:54
fonte usuário
Em outras línguas...                            


10 respostas

votos
9

Se é um método que você estará chamando milhares de vezes, em seguida, retorno precoce é melhor para alcançar um [ligeiramente] maior desempenho.

Se não, então eu prefiro retorno tardio, uma vez que melhora a legibilidade.

Lembre-se programadores costumam gastar mais tempo lendo do que escrever código, então qualquer coisa que você pode fazer para melhorar a legibilidade será certamente bem-vinda.

Respondeu 19/05/2009 em 19:59
fonte usuário

votos
8

Eu prefiro o retorno precoce e evitando profunda assentamento. Isto é particularmente verdadeiro logo no início do método: testar qualquer coisa que é simples, e sair (ou lançar uma exceção) se você pode fazê-lo muito cedo.

Se é bem no meio de um método, é mais de um julgamento.

Note que eu refatorar seu exemplo imediatamente de usar um único if:

boolean validate(DomainObject o) {    
  if (o.property == x || o.property2 == y) {
     return true;
  } ...
  return false; 
}

Sei que isso era apenas um exemplo de brinquedo, mas o meu ponto é que é sempre vale a pena olhar para mais maneiras de simplificar o seu código :)

Respondeu 19/05/2009 em 20:00
fonte usuário

votos
5

Tal como acontece com a maioria dos estilos de codificação, é realmente uma questão de preferência, mas as cláusulas de guarda são considerados por muitos como uma das melhores práticas.

Respondeu 19/05/2009 em 19:58
fonte usuário

votos
4

A única vez que eu diria que você definitivamente não deve voltar mais cedo é se você não pode ver facilmente cada retorno dentro de uma única tela (qualquer que seja o padrão pode ser para pessoas que trabalham na mesma base de código), você deve pelo menos ser adicionando comentários que indicam que a função pode retornar mais cedo se houver um retorno precoce.

A única vez que eu diria que você definitivamente deve retornar precoce é se o seu código parece ...

boolean valid = true;
if( condition1 ) {
   valid = false;
}
if( valid ) {
   ...
   if( condition2 ) {
      valid = false;
   }
}
if( valid ) {
   ...
   if( condition3 ) {
      valid = false;
   }
}
... (etc)

Se você se encontra em qualquer uma destas situações, no entanto ... você provavelmente deve ser refatoração a função.

Respondeu 19/05/2009 em 20:07
fonte usuário

votos
1

Se exceções não são uma parte da imagem, eu prefiro retornar imediatamente quando eu puder.

Pode ser fácil de administrar mal a variável bandeira e eu sou contra variáveis ​​bandeira em geral. Não retornando também pode fazer um mantenedor acho que mais trabalho pode ser feito (se o método é longa).

Respondeu 19/05/2009 em 19:59
fonte usuário

votos
1

Para mim, isto é uma espécie de um daqueles temas guerra religiosa com nenhuma resposta correta. O argumento contra o retorno cedo essencialmente se resume ao fato de que ter um e somente um ponto em que uma função pode sair reduz o número de possíveis caminhos através de seu código, assim, pelo menos em teoria, reduzindo as chances de erros. Meu estilo pessoal é, em situações em que faz sentido para voltar cedo fazê-lo, e em situações em que faz sentido limitar a um instrução de retorno eu faço isso.

Respondeu 19/05/2009 em 19:58
fonte usuário

votos
0

Há dois fatores que puxam uns contra os outros.

O primeiro fator é a facilidade de depuração. Se você retornar imediatamente (como mostrado no seu segundo trecho de código), que às vezes torna-se difícil para depurar uma grande função, uma vez que é difícil encontrar estas declarações de retorno, especialmente se eles foram colocados lá por engano.

O segundo fator é a facilidade de implementação. Se você está verificando a correção básica de argumentos no início da função e há um longo pedaço de código antes da função acabamentos, você pode ter que colocar esse código inteiro em um loop condição. Se não o fizer, em algum momento, o argumento pode se acostumar para alguns cálculo longo, perdendo tempo, porque ele acabaria por ser rejeitada qualquer maneira.

Então, a resposta poderia ser assim:

If the function is small, 
        save the return status in a variable and return at the end. 
else 
        return immediately.
Respondeu 19/05/2009 em 20:06
fonte usuário

votos
0

Para este caso, eu prefiro:

boolean validate (DomainObject o) {
    if (o.property == x ||
        o.property2 == y ||
        ...) {
          return true;
    } else {
          return false;
}

Em geral, eu gosto de usar retorno precoce para lidar com condições de erro e voltar no fim de retornar resultados computados.

Respondeu 19/05/2009 em 20:04
fonte usuário

votos
0

Honestamente, eu acho que depende da situação. Pessoalmente eu uso tanto, e eu decidir com base em qual deles irá tornar o código mais claro e fácil de ler.

Se você tiver muito aninhados if (ou qualquer outra estrutura de controle) e pode ficar confusa, então eu gostaria de voltar no interior das declarações

Não se preocupe muito com o que é 'melhor prática', neste caso, uma vez que é mais importante que o código é claro e fácil de entender. Use o que se sente bem para a situação.

Respondeu 19/05/2009 em 20:00
fonte usuário

votos
0

Pessoalmente, eu gosto o segundo melhor método. É simples e mais claro para mim, mas eu sei que há pessoas que devem ter apenas um retorno em uma função.

Respondeu 19/05/2009 em 19:58
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more