| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/06/2006 12:05:01
|
rodrigoy
GUJ Ranger
![[Avatar]](/images/avatar/cf79ae6addba60ad018347359bd144d2.jpg)
Membro desde: 18/04/2006 01:06:28
Mensagens: 758
Localização: São Paulo
Offline
|
Amigos(as),
Estou montando um texto e gostaria saber se algum de vocês sabem qual foi o primeiro autor e qual foi a obra que constou o princípio "programe para uma interface, não para uma implementação".
Isso aparece em tudo quanto é lugar, mas gostaria saber se existe uma referência bibliográfica... "o dono da idéia". Capiche?
Abraços!
|
Rodrigo Yoshima
www.ASPERCOM.com.br
Próximas Turmas:
São Paulo: Scrum 28/agosto | OOAD-UML 13/setembro
Débito Técnico Blog: blog.aspercom.com.br
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/06/2006 12:33:03
|
Luca
Moderador
![[Avatar]](/images/avatar/17e62166fc8586dfa4d1bc0e1742c08b.jpg)
Membro desde: 06/09/2002 14:30:10
Mensagens: 5810
Localização: São Paulo/SP ou Paraty/RJ
Offline
|
Olá
Sem a pretensão de esgotar o assunto...
O conceito básico é:
"Favor object composition over class inheritance."
A primeira aparição dele foi no livro do GoF há mais de 10 anos atrás.
O pattern Strategy do GoF já pode ser considerado como um exemplo do conceito "program to an interface, not an implementation"
A ênfase na composição, vi depois já adaptado para o Java no livro do Peter Coad, Java Design de 1997.
Este conceito chama a atenção para o uso inadequado da herança.
Mais recentemente grandes autores de livros de Java como Joshua Bloch erm Effective Java (capítulo 4) e depois Rod Johnson em J2EE Design and Developmentt (capítulo 4, resumo na pag. 115) enfatizaram as vantagens de programar para interfaces e não para classes.
Quando pesquisar para preparar suas aulas, dê uma olhada em:
http://www.netobjectives.com/resources/rs_bks.htm
[]s
Luca
|
Dare Obasanjo (Program Manager at Microsoft)
"The folks I know from across the industry who have to build large scale Web services on the Web today at Google, Yahoo!, Facebook, Windows Live, Amazon, etc are using RESTful Web services. The only times I encounter someone with good things to say about WS-* is if it is their job to pimp these technologies or they have already "invested" in WS-* and want to defend that investment."
CEP, JMS, JMX e coisas afins (ou não)
http://lucabastos.blogspot.com/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/06/2006 13:01:03
|
rodrigoy
GUJ Ranger
![[Avatar]](/images/avatar/cf79ae6addba60ad018347359bd144d2.jpg)
Membro desde: 18/04/2006 01:06:28
Mensagens: 758
Localização: São Paulo
Offline
|
Luca,
"programar para uma interface" é explorar o polimorfismo permitindo que o objeto em runtime mude.
"preferir composição à herança" está mais relacionado com algumas inflexibilidades da herança que podem minar a evolução do software...
São princípios diferentes...
|
Rodrigo Yoshima
www.ASPERCOM.com.br
Próximas Turmas:
São Paulo: Scrum 28/agosto | OOAD-UML 13/setembro
Débito Técnico Blog: blog.aspercom.com.br
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/06/2006 13:29:00
|
Luca
Moderador
![[Avatar]](/images/avatar/17e62166fc8586dfa4d1bc0e1742c08b.jpg)
Membro desde: 06/09/2002 14:30:10
Mensagens: 5810
Localização: São Paulo/SP ou Paraty/RJ
Offline
|
Olá
Minha resposta deve ter ficado confusa porque editei várias vezes pois fazia trocentas coisas ao mesmo tempo e foi difícil manter a linha de raciocínio.
Porém, o principal que fale é isto mesmo:
Preferir composição à herança é historicamente a primeira manifestação de programar para interfaces. E o que você pediu foi a história.
Sua definição de programar para interface é puramente teórica. Na prática quando você listar as vantagens deste conceito vai encontrar a definição do GoF escrita pensando em C++ ou Smaltalk.
[]s
Luca
|
Dare Obasanjo (Program Manager at Microsoft)
"The folks I know from across the industry who have to build large scale Web services on the Web today at Google, Yahoo!, Facebook, Windows Live, Amazon, etc are using RESTful Web services. The only times I encounter someone with good things to say about WS-* is if it is their job to pimp these technologies or they have already "invested" in WS-* and want to defend that investment."
CEP, JMS, JMX e coisas afins (ou não)
http://lucabastos.blogspot.com/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/06/2006 16:48:59
|
brunohansen
JavaEvangelist
![[Avatar]](/images/avatar/1e0feeaff84a19bf3936e693311fa66d.jpg)
Membro desde: 27/03/2006 11:11:34
Mensagens: 391
Offline
|
Luca wrote:
Preferir composição à herança é historicamente a primeira manifestação de programar para interfaces. E o que você pediu foi a história.
Acho que uma coisa não tem muito a ver com a outra trocando em miudos voce pode programar para a inteface de uma classe pai e utilizar uma classe filha em run time. Por tanto a herança não prejudica a programação para interface.
Preferir composição à herança é muito mencionado pois pessoas utilizam herança para implementar o conceito de papel que é uma forma ruim de se implementar papel.
Ao meu ver programar para interface surgiu para ajudar as pessoas programar de forma melhor com encapsulamento não só para se utilizar de polimorfismo.
O maior beneficio de se programar para interface é controlar o efeito colateral de alterações, ou seja utilizar encapsulamento!
Na verdade tem muitos benefícios até quando você utiliza abstração vc programa para interface...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/06/2006 17:29:56
|
louds
Moderador
![[Avatar]](/images/avatar/1e48c4420b7073bc11916c6c1de226bb.jpg)
Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline
|
O conceito tem raiz em coisas do inicio da década de 80, quando se falava muito em programar no smalltalk contra o contrato de uma classe, não o tipo dela.
Interfaces são uma forma limitada do mecanismo de contratos que o smalltalk tem.
|
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) 28/06/2006 14:50:00
|
okara
JavaTeenager
Membro desde: 16/05/2005 08:47:08
Mensagens: 152
Offline
|
Mas na UML é melhor representar muitos papéis de uma classe usando herança mesmo ?
Ou usar a composição.
Digo isso pois estou tentando seguir a linha da abstração da UML.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/06/2006 15:10:15
|
rodrigoy
GUJ Ranger
![[Avatar]](/images/avatar/cf79ae6addba60ad018347359bd144d2.jpg)
Membro desde: 18/04/2006 01:06:28
Mensagens: 758
Localização: São Paulo
Offline
|
okara wrote:Mas na UML é melhor representar muitos papéis de uma classe usando herança mesmo ?
Ou usar a composição.
Digo isso pois estou tentando seguir a linha da abstração da UML.
A solução que você vai dar na UML deve ser a mesma que você vai implementar no código. A abstração é a mesma. Não é uma boa idéia trabalhar muito abstratamente na UML ao ponto do código ser completamente diferente.
O que você deve ter em mente é que, se você for tratar todas as variâncias com herança, seu modelo ficará complexo e inflexível. Entre seus papéis, analise o que varia, e veja se a aplicação de um Strategy ou um Decorator ou outros patterns não deixariam seu modelo mais flexível. De qualquer forma, uma simples herança já resolve alguns casos sem comprometer o modelo.
|
Rodrigo Yoshima
www.ASPERCOM.com.br
Próximas Turmas:
São Paulo: Scrum 28/agosto | OOAD-UML 13/setembro
Débito Técnico Blog: blog.aspercom.com.br
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/06/2006 15:30:05
|
okara
JavaTeenager
Membro desde: 16/05/2005 08:47:08
Mensagens: 152
Offline
|
Eu fico confuso desse jeito.
Se eu for colocar no diagrama tudo que tem na implementação, o modelo não vai ficar poluído ?
Estou construindo um diagrama de classes, mas não quero colocar recursos de Log no modelo por exemplo.
Isso não é relevante para meu modelo de domínio.
E não é mais fácil visualizar diferentes papéis por exemplo da class pessoa com uma notação de herança ao invés de uma composição ?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/06/2006 15:55:05
|
rodrigoy
GUJ Ranger
![[Avatar]](/images/avatar/cf79ae6addba60ad018347359bd144d2.jpg)
Membro desde: 18/04/2006 01:06:28
Mensagens: 758
Localização: São Paulo
Offline
|
okara wrote:Eu fico confuso desse jeito.
Se eu for colocar no diagrama tudo que tem na implementação, o modelo não vai ficar poluído ?
Estou construindo um diagrama de classes, mas não quero colocar recursos de Log no modelo por exemplo.
Isso não é relevante para meu modelo de domínio.
Peraí, não falei para colocar tudo no modelo UML, se vc está usando um modelo de domínio, só este estaria no modelo UML, a infra fica fora...
Se você tem uma classe Pessoa no diagrama UML é esperado que você tenha uma classe Pessoa no seu código segundo o diagrama.
okara wrote:E não é mais fácil visualizar diferentes papéis por exemplo da class pessoa com uma notação de herança ao invés de uma composição ?
Para você usar a composição no lugar da herança é necessário aplicar Patterns. Se decidir usar Strategy, use-o no modelo UML e no código. Se decidir por usar herança, use-a no modelo UML e no código. O que eu quero falar é que usar herança no modelo UML e Strategy no código tornam as coisas confusas...
|
Rodrigo Yoshima
www.ASPERCOM.com.br
Próximas Turmas:
São Paulo: Scrum 28/agosto | OOAD-UML 13/setembro
Débito Técnico Blog: blog.aspercom.com.br
|
|
|
 |
|
|