| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/12/2006 09:29:13
|
RafaelRio
Java Ninja
![[Avatar]](/images/avatar/e81218f96c55d1006352ed0a3b08d790.jpg)
Membro desde: 05/09/2006 06:52:42
Mensagens: 255
Localização: São Paulo
Offline
|
Ainda não consegui me decidir sobre se sigo essa "melhor prática": um método deve ter apenas um ponto de saída. Ou seja, apenas um return no fim do método, ou nenhum return.
Estive pesquisando na net e vi que o assunto é controverso. Inclusive, no site do PMD*, OnlyOneReturnPoint está na página Controversial (http://pmd.sourceforge.net/rules/controversial.html), junto com algumas outras regras da ferramenta.
Eu, particularmente, tentei. Gostei da idéia de uma saída apenas no final para facilitar a depuração, mas os flags que apareceram no meio do método bateram de frente com meu estilo mais enxuto.
Tem alguém que trabalha dessa forma? Gostaria de ouvir de quem trabalha com OnlyOneReturnPoint quais os benefícios que tiveram.
*PMD é uma ferramenta para varredura de código-fonte em busca de potenciais problemas.
|
Rafael Fiume.
Yes, Nós Temos Bananas
Sun Certified Programmer for the Java Platform, Standard Edition 6
Sun Certified Web Component Developer for the Java Platform, Enterprise Edition 5
Nullius in verba.
"A palavra de nenhum homem será a final."
Lema da Royal Society, associação de cientistas de Londres, em 1660. Entre os seus membros e presidentes esteve Isaac Newton. |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/12/2006 09:48:04
|
cv
Moderador
![[Avatar]](/images/avatar/210f760a89db30aa72ca258a3483cc7f.jpg)
Membro desde: 04/04/2003 00:32:12
Mensagens: 7842
Localização: São Paulo, SP
Offline
|
Nao eh pra ser uma regra aplicada sistematicamente.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/12/2006 10:40:34
|
RafaelRio
Java Ninja
![[Avatar]](/images/avatar/e81218f96c55d1006352ed0a3b08d790.jpg)
Membro desde: 05/09/2006 06:52:42
Mensagens: 255
Localização: São Paulo
Offline
|
Claro, precisamos ser críticos, queimar neurônios!
Quero justamente decidir onde é que eu uso essa regra, ao invés de simplesmente abandoná-la por completo.
|
Rafael Fiume.
Yes, Nós Temos Bananas
Sun Certified Programmer for the Java Platform, Standard Edition 6
Sun Certified Web Component Developer for the Java Platform, Enterprise Edition 5
Nullius in verba.
"A palavra de nenhum homem será a final."
Lema da Royal Society, associação de cientistas de Londres, em 1660. Entre os seus membros e presidentes esteve Isaac Newton. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/12/2006 19:02:01
|
cv
Moderador
![[Avatar]](/images/avatar/210f760a89db30aa72ca258a3483cc7f.jpg)
Membro desde: 04/04/2003 00:32:12
Mensagens: 7842
Localização: São Paulo, SP
Offline
|
Hmm... pensando aqui, se vc forcar a regra de que metodos tem que ser curtos e fazer apenas uma coisa (e faze-las bem)... vc realmente precisa se preocupar com isso?
Ideia: se o metodo inteiro nao cabe numa tela 80x25 caracteres, ele provavelmente ta fazendo coisa demais.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/12/2006 19:15:38
|
Paulo Silveira
Administrador
![[Avatar]](/images/avatar/a87ff679a2f3e71d9181a67b7542122c.jpg)
Membro desde: 07/08/2002 18:38:50
Mensagens: 4204
Localização: São Paulo
Online
|
cv wrote:
Ideia: se o metodo inteiro nao cabe numa tela 80x25 caracteres, ele provavelmente ta fazendo coisa demais.
perfeito. o pmd pega isso tambem.
|
http://blog.caelum.com.br twitter: @paulo_caelum
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/12/2006 08:52:25
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
Eu já trabalhei assim, mas achei que não há grandes benefícios com essa forma.
O primeiro dos problemas com essa abordagem está nos já citados flags. Normalmente quem adota essa prática também não curte breaks em laços, o que aumenta ainda mais o número de variáveis boolean. Essas variáveis são sujeitas a erro e várias vezes você tem que fazer ginástica para que funcionem direto que simplesmente não seriam feitas se você não usar essa técnica.
Segundo, quando você faz um código de guarda, logo no início do método, fica bem claro para o programador que caso a condição falhe o método não vai continuar. Ele não precisa analisar todo o código para chegar a essa conclusão, o que por si só é ótimo.
Finalmente, não vejo onde pode haver ganhos em terminar o método só no final. Performance? Não. Clareza? Certamente não. Purismo? Desde quando purismo por purismo é um ganho?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/12/2006 11:03:36
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Argumentos do pessoal que requer que haja apenas um ponto de saída:
- Se precisar pôr um "log" indicando a saída é necessário pô-lo apenas em um ponto
(Esse argumento não vale se você usar algum recurso de AOP).
- Se houver apenas um ponto de saída o tratamento de erros etc. fica centralizado em apenas um ponto
(Para que serve o "finally", então?)
Acho que haver apenas um ponto de saída deixa seu código desajeitado. Quando requerem que eu faça isso meu código fica infestado de "labeled blocks", normalmente usados como:
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/12/2006 11:33:16
|
RafaelRio
Java Ninja
![[Avatar]](/images/avatar/e81218f96c55d1006352ed0a3b08d790.jpg)
Membro desde: 05/09/2006 06:52:42
Mensagens: 255
Localização: São Paulo
Offline
|
CV, não estou preocupado. Só trocando idéia, experiência.
Do seu comentário, pude pensar em duas coisas:
1) O importante mesmo é ter métodos curtos, ou seja bem definidos;
ou,
2) se você tiver métodos curtos, acabará por ter apenas um ponto de saída.
Qual das duas coisas você quis dizer?
Paulo, acho até que o PMD é "bonzinho". Por padrão, ele só começa a reclamar depois que o método tiver mais de 100 linhas. E em 100 linhas é possível ter pelo menos uns 30 pontos de saída!!!
Um código aqui para exemplo, assim a conversa fica melhor:
Tratá-se de um método de uma classe TreeCellRenderer, cujo o objetivo é verificar qual a função de um nó na árvore (na verdade um menu de funções) e retornar o nome do ícone adeqüado.
Se fosse aplicar a regra de apenas um ponto de saída, ficaria assim:
Um assert cai bem melhor no fim do método do que um comentário tosco do tipo "// Não deve nunca chegar aqui".
Mesmo porque acabei descobrindo que o método retornava setad.png.
Só que o código ficou poluído...
|
Rafael Fiume.
Yes, Nós Temos Bananas
Sun Certified Programmer for the Java Platform, Standard Edition 6
Sun Certified Web Component Developer for the Java Platform, Enterprise Edition 5
Nullius in verba.
"A palavra de nenhum homem será a final."
Lema da Royal Society, associação de cientistas de Londres, em 1660. Entre os seus membros e presidentes esteve Isaac Newton. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/12/2006 11:41:48
|
RafaelRio
Java Ninja
![[Avatar]](/images/avatar/e81218f96c55d1006352ed0a3b08d790.jpg)
Membro desde: 05/09/2006 06:52:42
Mensagens: 255
Localização: São Paulo
Offline
|
ViniGodoy, thingol, vou ter que concordar com vocês.
Enquanto vocês respondiam, estava caçando um método para mexer e analisar as mudanças e o que vocês escreveram aconteceu mesmo.
Apareceu um break, uma variável, uma flag e os pontos de decisões ficaram mais complexos tanto de ler, quanto de escrever.
Mas foi graças a essa brincadeira que eu pude colocar o assert no código, e de quebra descobrir que o método retornava "setad.png"
|
Rafael Fiume.
Yes, Nós Temos Bananas
Sun Certified Programmer for the Java Platform, Standard Edition 6
Sun Certified Web Component Developer for the Java Platform, Enterprise Edition 5
Nullius in verba.
"A palavra de nenhum homem será a final."
Lema da Royal Society, associação de cientistas de Londres, em 1660. Entre os seus membros e presidentes esteve Isaac Newton. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/12/2006 11:57:17
|
fcoury
JavaChild
![[Avatar]](/images/avatar/13da2193bcd455bb894871aec1815047.jpg)
Membro desde: 17/10/2006 16:24:36
Mensagens: 142
Localização: Campinas, SP - Brazil
Offline
|
Putz, eu já discuti muito isso, e o que eu penso está no meu blog:
http://felipecoury.wordpress.com/2006/08/15/coding-best-practices-thinking-about-it/
Abraços!!!
|
Felipe Gonçalves Coury
--
Arquivos texto em java: http://jfilehelpers.com
Visite meu blog: http://blogs.felipecoury.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/12/2006 14:00:55
|
brunohansen
JavaEvangelist
![[Avatar]](/images/avatar/1e0feeaff84a19bf3936e693311fa66d.jpg)
Membro desde: 27/03/2006 11:11:34
Mensagens: 391
Offline
|
cv wrote:Hmm... pensando aqui, se vc forcar a regra de que metodos tem que ser curtos e fazer apenas uma coisa (e faze-las bem)... vc realmente precisa se preocupar com isso?
Acho que realmente não. Pois dificilmente ele terá mais que um ponto de saída.
Colocando algo mais na resposta do CV, se vc tiver métodos, "mais do que curtos", com responsábilidades bem definidas! Agora sim vc dificilmente tera mais que um ponto de saída no seu método!
Mas ainda podemos pensar:
Poxa! Mais eu posso ter um método curto e com uma responsábilidade bem definida, só que dentro deste método eu posso ter um IF ou SWITCH, neste caso faço para eliminar os vários pontos de saída ou flags para controlar a saída? Neste casos temos que invocar todos os espiritos O.O e tentar trocar esses IFs e SWITCHs por "POLIMOSFISMO". Acho eu que ai estaremos proximos da O.O!!
Aguardo as opiniões de vcs!!!
[]s
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/12/2006 19:34:33
|
AllMighty
Java Ninja
![[Avatar]](/images/avatar/c900197841211ba608f56.gif)
Membro desde: 16/08/2004 17:21:42
Mensagens: 266
Localização: São Paulo
Offline
|
Detalhe, métodos curtos não implicam necessariamente em um único ponto de saída. Eu costumo escrever métodos de 6 ou 7 linhas que tem uns dois ou três pontos de saída. Em geral algumas guard clauses no começo e um só retorno "normal".
O maior argumento que os defensores de um só ponto de saída fazem é que fica mais fácil de se entender (reason about) um método. Por isso, IMO, que métodos curtos aliviam o problema. Um método de 5 linhas com uma responsabilidade bem definida (chamando outros métodos também com responsabilidade bem definida) tende a ser tão legível que é irrelevante se tem 3 returns.
|
Rafael de F. Ferreira
Blog: http://www.rafaelferreira.net/
Links miscelâneos: http://stoa.usp.br/rafaelferreira |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/12/2006 09:08:17
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
Queria saber de onde veio a idéia de que um só ponto de saída deixa o código mais legível. Talvez, num método longuíssimo... mas ainda assim, tenho minhas dúvidas.
Quando você enxerga um ponto de saída no código, não precisa entender mais nada depois dele. Você tem absoluta certeza que se aquela condição for satisfeita, o código debaixo do ponto de saída não vai rodar.
Agora, se simplesmente uma condição é testada, você tem as seguintes consequencias:
Você tem um if, que testa a condição e todo código que não deve rodar estará endentado, gerando poluição visual. Se você tem 3 ou 4 condições de saída, terá 3 ou 4 níveis de endentação. Em segundo lugar, você é obrigado a conferir o código até o final. Pois nada garante que após o if, não haverá um ou outro comando a ser executado. Por final, tem a dor de cabeça de fechar todas as chaves dos ifs que você abriu.
Em muitas situações, o código com esse flag ainda fica mais difícil de ser refatorado.
Finalmente, há ainda o problema de longo prazo. Alguém (muitas vezes você mesmo dali a alguns meses) inadvertidamente pode colocar código fora do if. Isso quebra totalmente sua condição e pode gerar um objeto com um estado inválido. No caso dos códigos de guarda, esse problema simplesmente não ocorre, a menos que o if do código de guarda seja alterado.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/12/2006 11:29:07
|
brunohansen
JavaEvangelist
![[Avatar]](/images/avatar/1e0feeaff84a19bf3936e693311fa66d.jpg)
Membro desde: 27/03/2006 11:11:34
Mensagens: 391
Offline
|
Ontem estava revendo um projeto e devido a herança da cultura C++, "eu acho", o projeto estava cheio de construtores por cópia. Eu então cheguei a conclusão que este poderia ser um mal cheiro que me indica este obj deve ser clonavel.
Então hoje pela manha eu cheio de curiosidade vim até meu livro de refatoração "Fowler" e olha o que eu encontro: "Justamente sobre pontos únicos de retornos"
Fowler wrote:
Qdo vc tem uma série de expressões condicionais, frequentemente encontra flags de controles sendo usados para determinar quando parar.
Tais flags trazem mais problemas do que soluções. Elas vêm das regras da programação estruturada que requerem que rotinas com um ponto único de saída e de entrada. Eu concordo com o ponto de entrada único (em verdade, as modernas linguagens de programação forçam que assim seja), mas a regra do únicop ponto de saída leva a expressões condicionais enroladas, repletas desses flags deselegantes no código. É por esse motivo que as ligaguens de promação têm as declarações break e continue para sair de uma expressão condicional complexa. Muitas vezes é supreendente o que vc pode fazer quando se livra de um flag de controle. O propósito real da expressão condicional se torna muito mais claro.
Refatoração. Aperfeiçoando o Projeto de Código Existente
Autor: Martin Fowler
Refatoração: Remover flag de controle
Não tenho certeza se posso citar Folwer aqui no Forum, nem se eu posso citar parte do seu livro! De qualquer forma estou fazendo, pois acho que essas citações são otimas contribuições!
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/12/2006 11:51:42
|
AllMighty
Java Ninja
![[Avatar]](/images/avatar/c900197841211ba608f56.gif)
Membro desde: 16/08/2004 17:21:42
Mensagens: 266
Localização: São Paulo
Offline
|
ViniGodoy wrote:Queria saber de onde veio a idéia de que um só ponto de saída deixa o código mais legível. Talvez, num método longuíssimo... mas ainda assim, tenho minhas dúvidas.
Acho que originalmente a preocupação do pessoal da programação estruturada não era com a legibilidade, mas em provar formalmente a correção de programas. E é mais fácil fazer isso se você pode assumir que o controle flui do começo da rotina até o fim dela.
|
|
|
 |
|
|