Programar para Interfaces  XML
Índice dos Fóruns » Arquitetura de Sistemas
Autor Mensagem
rodrigoy
GUJ Ranger
[Avatar]

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
[WWW]
Luca
Moderador
[Avatar]

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/
[Email] [WWW]
rodrigoy
GUJ Ranger
[Avatar]

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
[WWW]
Luca
Moderador
[Avatar]

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/
[Email] [WWW]
brunohansen
JavaEvangelist
[Avatar]

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...
louds
Moderador
[Avatar]

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
[ICQ]
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.
rodrigoy
GUJ Ranger
[Avatar]

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
[WWW]
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 ?


rodrigoy
GUJ Ranger
[Avatar]

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
[WWW]
 
Índice dos Fóruns » Arquitetura de Sistemas
Ir para:   
Powered by JForum 2.1.8 © JForum Team