| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/02/2007 08:58:50
|
rodrigousp
JavaEvangelist
![[Avatar]](/images/avatar/69d1fc78dbda242c43ad6590368912d4.jpg)
Membro desde: 09/10/2003 14:23:31
Mensagens: 379
Offline
|
Não gosto de projetos com alta complexidade ciclomática. Procuro evitar.
Mas parece que em alguns casos precisamos de realizar certos malabarismos injustificáveis.
Por exemplo um switch pode ser substituído por um map e vários objetos de comando + uma chamada como no código abaixo:
command = (Command) map.get(key);
command.execute();
Mas, vocês acham razoável criar um comando para cada case???
Qual seria outra solução para diminuir a complexidade ciclomática? Vale a pena mesmo procurar reduzir esta métrica no caso de switchs?
|
Rodrigo di Lorenzo Lopes - blogger |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/02/2007 09:20:27
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
Geralmente é uma boa idéia sim.
O pattern de comando tem outras vantagens. Certamente, o número de switchs sem o pattern tende a crescer, aumentando progressivamente a complexidade geral do sistema. Afinal, com uma modificação em um dos comandos, você terá que localizar e alterar o código em todos os pontos onde existir um switch.
Isso não só é propenso a erros como também trabalhoso.
No caso de usar um objeto de comando, basta olhar para a classe.
Por exemplo, se você adicionar um método complemente novo, o próprio compilador te informará quais são as classes de comando que precisam ser modificadas para suportar esse método.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/02/2007 19:49:15
|
pcalcado
Moderador
![[Avatar]](/images/avatar/110eec23201d80e40d0c4a48954e2ff5.jpg)
Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline
|
Que tal Strategy e polimorfismo em geral?
Substituir um switch por um Command pode acabar criando um switch OO. OO, mas ainda um switch.
|
Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/02/2007 08:32:35
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
Realmente, o ideal é trocar o switch pelo padrão State/Strategy ou polimorfismo, como descrito na refatoração do Fowler:
http://www.refactoring.com/catalog/replaceConditionalWithPolymorphism.html
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/02/2007 10:15:00
|
louds
Moderador
![[Avatar]](/images/avatar/1e48c4420b7073bc11916c6c1de226bb.jpg)
Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline
|
Se preocupe com a complexidade ciclomática de métodos com muitos condicionais e loops.
Switches devem ser lidados a parte, pq quase sempre é resultado de programação procedural demais.
|
http://www.kumpera.net/blog/
http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/03/2007 04:26:30
|
rodrigousp
JavaEvangelist
![[Avatar]](/images/avatar/69d1fc78dbda242c43ad6590368912d4.jpg)
Membro desde: 09/10/2003 14:23:31
Mensagens: 379
Offline
|
Dou razão para vocês. Talvez porque eu não tenha contado a história toda.
Eu criei uma tabela fila, e coloquei uma trigger em várias tabelas dicionário. Quando uma dessas tabelas é alterada, eu insero um registro na tabela fila com o nome da tabela alterada. Um listener, carrega os itens da tabela fila e executa uma busca na tabela apropriada para cada um desses itens.
A ramificação do problema ocorre porque o comando sql é diferente para cada tabela.
|
Rodrigo di Lorenzo Lopes - blogger |
|
|
 |
|
|