| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/04/2004 11:38:03
|
Daniel Quirino Oliveira
Moderador
![[Avatar]](/images/avatar/846c260d715e5b854ffad5f70a516c88.png)
Membro desde: 23/03/2003 23:57:34
Mensagens: 3299
Localização: Awawawawa (Araraquara) - SP
Offline
|
Aprenda a ter um maior controle sobre sua lógica de negócios com o pattern "Template Method", na nova coluna do GUJ sobre Design Patterns: http://www.guj.com.br/user.column.get.chain?page=1&column.id=7
|
Daniel Quirino Oliveira |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/04/2004 12:58:19
|
cancao
JavaEvangelist
![[Avatar]](/images/avatar/c8a79dae3fc15bc8f1dd7.jpg)
Membro desde: 28/06/2003 19:22:53
Mensagens: 338
Offline
|
Daniel, algumas coisas não ficaram muito claras para mim. Por exemplo, qual a vantagem em se usar esse pattern ao inves de definir uma interface?! Não sei porque, mas, quando terminei de ler fiquei pensando na complicação que seria usar a tal da "hook operation" já que a adição de uma nova operação pode ser interessante apenas para alguma(s) da(s) classe(s) concreta(s). As outras acabariam tendo que executar o metodo tambem. Alem disso, vc disse: "não sobrecarregue o "template method"; para evitar este problema, declare o método template "final". Há alguma maneira de se introduzir uma hook operation?
De qualquer maneira, talvez eu apenas não tenha etendido bem em que tipos de situações usar melhor o pattern. Vc poderia dar outro exemplo?!
Até.
|
go ahead! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/04/2004 13:08:53
|
Daniel Quirino Oliveira
Moderador
![[Avatar]](/images/avatar/846c260d715e5b854ffad5f70a516c88.png)
Membro desde: 23/03/2003 23:57:34
Mensagens: 3299
Localização: Awawawawa (Araraquara) - SP
Offline
|
cancao wrote:Daniel, algumas coisas não ficaram muito claras para mim. Por exemplo, qual a vantagem em se usar esse pattern ao inves de definir uma interface?!
Quando você define apenas uma interface, você está definindo apenas um contrato entre classes, mas não define nada em relação à forma como trabalha sua regra de negócio.
Porém, quando você usa um template method, você torna este vínculo entre as classes mais forte ainda, pois no método template da classe abstrata você está explicítamente determinando o roteiro a ser seguido por qualquer classe que especialize sua regra de negócio.
cancao wrote:
Não sei porque, mas, quando terminei de ler fiquei pensando na complicação que seria usar a tal da "hook operation" já que a adição de uma nova operação pode ser interessante apenas para alguma(s) da(s) classe(s) concreta(s). As outras acabariam tendo que executar o metodo tambem. Alem disso, vc disse: "não sobrecarregue o "template method"; para evitar este problema, declare o método template "final". Há alguma maneira de se introduzir uma hook operation?
A "hook operation" funciona como uma "carta na manga", para flexibilizar um pouco mais o método template. Seu uso não é obrigatório, mas pode ser útil em situações em que algumas operações do seu algoritmo podem ser facultativas.
Agora, poxa, exemplos são difíceis. Eu sou péssimo para dar exemplos. Se alguém aí quiser me socorrer, agradeço.
|
Daniel Quirino Oliveira |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/04/2004 13:16:16
|
cancao
JavaEvangelist
![[Avatar]](/images/avatar/c8a79dae3fc15bc8f1dd7.jpg)
Membro desde: 28/06/2003 19:22:53
Mensagens: 338
Offline
|
Daniel Quirino Oliveira wrote:A "hook operation" funciona como uma "carta na manga", para flexibilizar um pouco mais o método template. Seu uso não é obrigatório, mas pode ser útil em situações em que algumas operações do seu algoritmo podem ser facultativas.
Ahá... apenas agora eu entendi melhor o esquema do hook: ele tambem é um metodo que as classes concretas devem implementar. Assim, se tal classe não precisa de tal operação ela define a hook "vazia". É isso mesmo?!
Até.
|
go ahead! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/04/2004 13:21:21
|
Daniel Quirino Oliveira
Moderador
![[Avatar]](/images/avatar/846c260d715e5b854ffad5f70a516c88.png)
Membro desde: 23/03/2003 23:57:34
Mensagens: 3299
Localização: Awawawawa (Araraquara) - SP
Offline
|
Sim, é exatamente isso.
|
Daniel Quirino Oliveira |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/04/2004 14:52:29
|
smota
Moderador
![[Avatar]](/images/avatar/ca9c267dad0305d1a6308d2a0cf1c39c.jpg)
Membro desde: 21/02/2003 16:19:19
Mensagens: 1647
Offline
|
Daniel Quirino Oliveira wrote:Sim, é exatamente isso.
Lembrando que o método hook() normalmente não é declarado como abstrato na super classe do seu template (a classe abstrata que declara o template method) e sim implementado vazio.
Assim vc nem obriga as subclasses a declara-lo se não forem usa-lo.
|
"Perfection is reached not when there's nothing more to add but when there's no more to take out" |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 21/04/2004 06:05:53
|
dukejeffrie
Virtual Machine Man
![[Avatar]](/images/avatar/c74d97b01eae257e44aa9d5bade97baf.png)
Membro desde: 21/08/2002 03:53:28
Mensagens: 661
Offline
|
Pô, agora fiquei sedento por uma comparação entre isso e Strategy.
O exemplo de acesso ao banco é interessante, mas vejo uns problemas:
1. como se lida com falhas? Se meu query() não faz nada, posso executar o process()?
2. Vou acabar tendo uma hierarquia meio besta: provavelmente eu vou ter uma classe que implementa connect() e disconnect(), da qual eu derivo as outras.
3. Me soa meio AOP de pobre.
Desculpa meter o pau logo de cara, mas eu quero é entender melhor, se é um padrão, é pq traz vantagens. Acho que faltou discutir as forças envolvidas na adoção desse pattern, e as vantagens de seguir esse caminho...
aquelão!
|
Brevity is the soul of wit |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 21/04/2004 13:47:23
|
Rafael Steil
Administrador
![[Avatar]](/images/avatar/8e296a067a37563370ded05f5a3bf3ec.jpg)
Membro desde: 31/08/2002 02:35:53
Mensagens: 5984
Localização: São Paulo
Offline
|
No caso de falha, o template method poderia fazer essa verificacao.. vc teria um "contrato mais forte" de uso.. algo como retornar um codigo de status, ou adicionar um exception listener..
Rafael
|
"working code attracts people who want to code. Design documents attract people who want to talk about coding - Charles Miller"
http://rafaelsteil.com
http://twitter.com/rafaelsteil
http://www.jforum.net
http://www.flickr.com/photos/rafaelsteil |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/04/2004 23:48:56
|
ricardolecheta
GUJ Master
![[Avatar]](/images/avatar/b59c67bf196a4758191e42f76670ceba.jpg)
Membro desde: 17/05/2003 13:42:10
Mensagens: 1486
Localização: Curitiba
Offline
|
Daniel Quirino Oliveira wrote:
Eu sou péssimo para dar exemplos. Se alguém aí quiser me socorrer, agradeço.
Eu fiz isto esta semana e nem sabia que isto era um pattern
Eu tive que transformar uma planilha gigante do excel para um sistema Java.
meu código (o esqueleto dele pq minha classe abstrata tinha um pouco mais de lógica)
Assim minhas subclasses apenas implementavam os métodos que levariam a aplicar as fórmulas...
|
Ricardo R. Lecheta
Livro - Google Android (português)
http://www.livroandroid.com.br/
http://livroandroid.blogspot.com/
http://www.livetouch.com.br/ |
|
|
 |
|
|