"Prefira composição ao invés de herança"

[quote=YvGa][quote=Ataxexe]Tentei explicar mais ou menos os perigos da herança aqui:

https://dl.dropboxusercontent.com/u/16755042/blog/unbelievable-exception/posts/cuidado-com-a-heranca.html

É um blog que estou montando e ainda está em fase beta (põe beta nisso). Coloquei lá porque era muita coisa pra escrever (e eu ainda vou dar umas editadas depois).[/quote]

Muito bom!

Outro exemplo classico de como a herança pode enganar é o quadrado e o retangulo. Um quadrado é um retangulo, veja que ele passa no teste do é um.

Se o retangulo tem o setAltura e setComprimento, e voce herda o quadrado do retangulo, pois afinal um quadrado é um retangulo, voce começa a ter problemas. Porque se voce mudar a altura de 12 pra 10, enquanto voce nao mudar o comprimento voce não tem um quadrado. Pra resolver isso voce pode, ao alterar a altura fazer com seja alterado tambem o comprimento. Mas esse não é um comportamento esperado pelo cliente da classe. Ou você pode no classe filha criar um metodo setLado. Mas de um jeito ou de outro o princípio de Liskov pro buraco.

Se voce nao herdar o quadrado do retangulo, mas fazer com que um quadrado use um retangulo e tenha seu setLado, chamando setAltura e setComprimento do retangulo, você tem a sua implementação do quadrado independente do retangulo (como deve ser), sem criar no usuário do seu código a ilusão de que ele pode usar um como se fosse o outro.

Talvez seja eu quem não esteja enxergando tamanha simplicidade, mas o conceito de herança é muito complicado e fugir dele é sim uma ótima dica. Vamos abolir a herança? Não, mas vamos ter muito cuidado ao usá-la.[/quote]

Herdar um quadrado de um retangulo seria a coisa mais esquisita que já ouvi. Afinal quem deriva de quadrado é um retangulo. Esses erros de interpretação ao meu ver são no mínimo bizonhos com o perdão da palavra. É como querer derivar uma ave de uma galinha.

Isso é questão de bom senso. Se uma pessoa não consegue enxergar uma coisa dessas não tem jeito mesmo. Nem o “Maker” resolve.

Essa questão de herança não tem nenhum mistério ou complicação. Se voce tem em mente um modelo onde as hierarquias não são profundas(trocentos níveis), é sólida(tem o comportamento garantido por interfaces) e eficiente(não herda madeira de papel) ela será mais eficiente que a composição por deixar o código simples e enxuto.

*edit aqui - Um quadrado não é um retangulo.

[quote=juliocbq]Herdar um quadrado de um retangulo seria a coisa mais esquisita que já ouvi. Afinal quem deriva de quadrado é um retangulo. Esses erros de interpretação ao meu ver são no mínimo bizonhos com o perdão da palavra. É como querer derivar uma ave de uma galinha.

Isso é questão de bom senso. Se uma pessoa não consegue enxergar uma coisa dessas não tem jeito mesmo. Nem o “Maker” resolve.[/quote]

É esquisito, mas não significa que não é usado. Milhares de sistemas por aí são feitos com essas bizarrices e é por isso que a gente alerta pra essas coisas. Cada vez mais o mercado paga menos pra animais fazerem trabalhos que não deveriam fazer e esses monstros binários aparecem por aí.

Um exemplo é um sistema que eu dei manutenção há uns anos e que ainda é usado no Brasil inteiro: o cara criou um framework de Collections!!! Tinha classes pra todos os gostos: SimpleDynaArray, DoubleDynaArray, SimpleSortedDynaArray, DoubleSortedDynaArray. E eu já vi muitos que iniciaram dando manutenção nesse sistema. O cara está aprendendo e com exemplos terríveis. Se ninguém mostrar o erro ele acaba aprendendo errado.

Waterfall é uma merda e ainda é usado e, pior ainda, mascarado em cima de metodologias ágeis com mini waterfalls travestidos de sprints. Isso é mais bizarro ainda do que herdar um quadrado de um retângulo, mas é muito usado também.

Eu passei minha carreira inteira mantendo sistemas mal feitos e, sinceramente, me sinto um papel higiênico. Às vezes eu não acreditava no quão óbvias as cagadas eram, mas existem pessoas que não aprenderam corretamente ou passaram o tempo todo pedindo código pronto em fórum e não se deram ao trabalho de estudar nada. Pra essas pessoas, aquilo era lindo.

[quote=juliocbq]
Herdar um quadrado de um retangulo seria a coisa mais esquisita que já ouvi. Afinal quem deriva de quadrado é um retangulo. Esses erros de interpretação ao meu ver são no mínimo bizonhos com o perdão da palavra. É como querer derivar uma ave de uma galinha.

Isso é questão de bom senso. Se uma pessoa não consegue enxergar uma coisa dessas não tem jeito mesmo. Nem o “Maker” resolve.

Essa questão de herança não tem nenhum mistério ou complicação. Se voce tem em mente um modelo onde as hierarquias não são profundas(trocentos níveis), é sólida(tem o comportamento garantido por interfaces) e eficiente(não herda madeira de papel) ela será mais eficiente que a composição por deixar o código simples e enxuto.

*edit aqui - Um quadrado não é um retangulo.[/quote]

Herdar um quadrado de um retangulo é bisonho? Um quadrado não é um retangulo? Um retangulo deriva de um quadrado? Então você está me dizendo que um retangulo é antes de tudo um quadrado?

Você está redondamente (com o perdão do trocadilho) errado. Um quadrado é um retangulo, e a herança seria perfeitamente compreensível não fossem os poréns envolvidos.

O que eu estou dizendo, e como o seu post comprovou, as coisas não são tão cristalinas como vocês querem fazer pensar que são.

[quote=Ataxexe][quote=juliocbq]Herdar um quadrado de um retangulo seria a coisa mais esquisita que já ouvi. Afinal quem deriva de quadrado é um retangulo. Esses erros de interpretação ao meu ver são no mínimo bizonhos com o perdão da palavra. É como querer derivar uma ave de uma galinha.

Isso é questão de bom senso. Se uma pessoa não consegue enxergar uma coisa dessas não tem jeito mesmo. Nem o “Maker” resolve.[/quote]

É esquisito, mas não significa que não é usado. Milhares de sistemas por aí são feitos com essas bizarrices e é por isso que a gente alerta pra essas coisas. Cada vez mais o mercado paga menos pra animais fazerem trabalhos que não deveriam fazer e esses monstros binários aparecem por aí.

Um exemplo é um sistema que eu dei manutenção há uns anos e que ainda é usado no Brasil inteiro: o cara criou um framework de Collections!!! Tinha classes pra todos os gostos: SimpleDynaArray, DoubleDynaArray, SimpleSortedDynaArray, DoubleSortedDynaArray. E eu já vi muitos que iniciaram dando manutenção nesse sistema. O cara está aprendendo e com exemplos terríveis. Se ninguém mostrar o erro ele acaba aprendendo errado.

Waterfall é uma merda e ainda é usado e, pior ainda, mascarado em cima de metodologias ágeis com mini waterfalls travestidos de sprints. Isso é mais bizarro ainda do que herdar um quadrado de um retângulo, mas é muito usado também.

Eu passei minha carreira inteira mantendo sistemas mal feitos e, sinceramente, me sinto um papel higiênico. Às vezes eu não acreditava no quão óbvias as cagadas eram, mas existem pessoas que não aprenderam corretamente ou passaram o tempo todo pedindo código pronto em fórum e não se deram ao trabalho de estudar nada. Pra essas pessoas, aquilo era lindo.[/quote]

Eu venho mantendo sistemas de cftv escritos com delphi, controle de acesso escrito em java e até firmwares escritos em c para pic 18 ou 16fxx e aqui não temos problemas com essas coisas. Nosso software possui uma hierarquia que representa drivers cada marca de placa de captura. Essa hierarquia tem 3 niveis apenas(uma interface, uma classe abstrata com um metodo generico para escrever e ler da memoria da placa pci e as classes especificas com atributos especificos das placas). Ele já existe ha uns 10 anos e está na ativa até hoje. Sempre que vejo em uma padaria, estabelecimento comercial que seja pergunto se deu problema
algum dia e sempre recebo uma resposta boa. Por isso eu não concordo com essa preferência de recursos. Tem que ter boas práticas para desenvolver uma solução. Minha opinião é usar esse e aquele artifício com maestria, não excluir um em favorecimento de outro.

[quote=YvGa][quote=juliocbq]
Herdar um quadrado de um retangulo seria a coisa mais esquisita que já ouvi. Afinal quem deriva de quadrado é um retangulo. Esses erros de interpretação ao meu ver são no mínimo bizonhos com o perdão da palavra. É como querer derivar uma ave de uma galinha.

Isso é questão de bom senso. Se uma pessoa não consegue enxergar uma coisa dessas não tem jeito mesmo. Nem o “Maker” resolve.

Essa questão de herança não tem nenhum mistério ou complicação. Se voce tem em mente um modelo onde as hierarquias não são profundas(trocentos níveis), é sólida(tem o comportamento garantido por interfaces) e eficiente(não herda madeira de papel) ela será mais eficiente que a composição por deixar o código simples e enxuto.

*edit aqui - Um quadrado não é um retangulo.[/quote]

Herdar um quadrado de um retangulo é bisonho? Um quadrado não é um retangulo? Um retangulo deriva de um quadrado? Então você está me dizendo que um retangulo é antes de tudo um quadrado?

Você está redondamente (com o perdão do trocadilho) errado. Um quadrado é um retangulo, e a herança seria perfeitamente compreensível não fossem os poréns envolvidos.

O que eu estou dizendo, e como o seu post comprovou, as coisas não são tão cristalinas como vocês querem fazer pensar que são.[/quote]

O quadrado não é um retângulo nunca. Um quadrado possui os atributos de largura e altura fixos enquanto um retangulo adiciona um comportamento variável dessas propriedades. Sua modelagem aí é que está quadrada, desculpe.

[quote=juliocbq][quote=Ataxexe][quote=juliocbq]Herdar um quadrado de um retangulo seria a coisa mais esquisita que já ouvi. Afinal quem deriva de quadrado é um retangulo. Esses erros de interpretação ao meu ver são no mínimo bizonhos com o perdão da palavra. É como querer derivar uma ave de uma galinha.

Isso é questão de bom senso. Se uma pessoa não consegue enxergar uma coisa dessas não tem jeito mesmo. Nem o “Maker” resolve.[/quote]

É esquisito, mas não significa que não é usado. Milhares de sistemas por aí são feitos com essas bizarrices e é por isso que a gente alerta pra essas coisas. Cada vez mais o mercado paga menos pra animais fazerem trabalhos que não deveriam fazer e esses monstros binários aparecem por aí.

Um exemplo é um sistema que eu dei manutenção há uns anos e que ainda é usado no Brasil inteiro: o cara criou um framework de Collections!!! Tinha classes pra todos os gostos: SimpleDynaArray, DoubleDynaArray, SimpleSortedDynaArray, DoubleSortedDynaArray. E eu já vi muitos que iniciaram dando manutenção nesse sistema. O cara está aprendendo e com exemplos terríveis. Se ninguém mostrar o erro ele acaba aprendendo errado.

Waterfall é uma merda e ainda é usado e, pior ainda, mascarado em cima de metodologias ágeis com mini waterfalls travestidos de sprints. Isso é mais bizarro ainda do que herdar um quadrado de um retângulo, mas é muito usado também.

Eu passei minha carreira inteira mantendo sistemas mal feitos e, sinceramente, me sinto um papel higiênico. Às vezes eu não acreditava no quão óbvias as cagadas eram, mas existem pessoas que não aprenderam corretamente ou passaram o tempo todo pedindo código pronto em fórum e não se deram ao trabalho de estudar nada. Pra essas pessoas, aquilo era lindo.[/quote]

Eu venho mantendo sistemas de cftv escritos com delphi, controle de acesso escrito em java e até firmwares escritos em c para pic 18 ou 16fxx e aqui não temos problemas com essas coisas. Nosso software possui uma hierarquia que representa drivers cada marca de placa de captura. Essa hierarquia tem 3 niveis apenas(uma interface, uma classe abstrata com um metodo generico para escrever e ler da memoria da placa pci e as classes especificas com atributos especificos das placas). Ele já existe ha uns 10 anos e está na ativa até hoje. Sempre que vejo em uma padaria, estabelecimento comercial que seja pergunto se deu problema
algum dia e sempre recebo uma resposta boa. Por isso eu não concordo com essa preferência de recursos. Tem que ter boas práticas para desenvolver uma solução. Minha opinião é usar esse e aquele artifício com maestria, não excluir um em favorecimento de outro.


[/quote]

Bom, você ainda não conseguiu entender que eu não estou abolindo a herança, estou mostrando os problemas do mau uso dela, que é feito na maioria das vezes para reaproveitamento de código e não para estabelecer uma hierarquia consistente seguindo o princípio de substituição de Liskov.

Não duvido que você tenha problemas de orientação a objetos escrevendo firmwares em c. Depois dessa eu parei por aqui.

Aproveitando esse exemplo de quadrado herdar um retângulo, esse sim quebra o princípio de Liskov por herdar a ave da galinha.
Fizeram um pequeno artigo sobre:

[quote=juliocbq][quote=YvGa][quote=juliocbq]
Herdar um quadrado de um retangulo seria a coisa mais esquisita que já ouvi. Afinal quem deriva de quadrado é um retangulo. Esses erros de interpretação ao meu ver são no mínimo bizonhos com o perdão da palavra. É como querer derivar uma ave de uma galinha.

Isso é questão de bom senso. Se uma pessoa não consegue enxergar uma coisa dessas não tem jeito mesmo. Nem o “Maker” resolve.

Essa questão de herança não tem nenhum mistério ou complicação. Se voce tem em mente um modelo onde as hierarquias não são profundas(trocentos níveis), é sólida(tem o comportamento garantido por interfaces) e eficiente(não herda madeira de papel) ela será mais eficiente que a composição por deixar o código simples e enxuto.

*edit aqui - Um quadrado não é um retangulo.[/quote]

Herdar um quadrado de um retangulo é bisonho? Um quadrado não é um retangulo? Um retangulo deriva de um quadrado? Então você está me dizendo que um retangulo é antes de tudo um quadrado?

Você está redondamente (com o perdão do trocadilho) errado. Um quadrado é um retangulo, e a herança seria perfeitamente compreensível não fossem os poréns envolvidos.

O que eu estou dizendo, e como o seu post comprovou, as coisas não são tão cristalinas como vocês querem fazer pensar que são.[/quote]

O quadrado não é um retângulo nunca. Um quadrado possui os atributos de largura e altura fixos enquanto um retangulo adiciona um comportamento variável dessas propriedades. Sua modelagem aí é que está quadrada, desculpe. [/quote]

Todo quadrado é também um retângulo e um losango.

[quote=Ataxexe][quote=juliocbq][quote=Ataxexe][quote=juliocbq]Herdar um quadrado de um retangulo seria a coisa mais esquisita que já ouvi. Afinal quem deriva de quadrado é um retangulo. Esses erros de interpretação ao meu ver são no mínimo bizonhos com o perdão da palavra. É como querer derivar uma ave de uma galinha.

Isso é questão de bom senso. Se uma pessoa não consegue enxergar uma coisa dessas não tem jeito mesmo. Nem o “Maker” resolve.[/quote]

É esquisito, mas não significa que não é usado. Milhares de sistemas por aí são feitos com essas bizarrices e é por isso que a gente alerta pra essas coisas. Cada vez mais o mercado paga menos pra animais fazerem trabalhos que não deveriam fazer e esses monstros binários aparecem por aí.

Um exemplo é um sistema que eu dei manutenção há uns anos e que ainda é usado no Brasil inteiro: o cara criou um framework de Collections!!! Tinha classes pra todos os gostos: SimpleDynaArray, DoubleDynaArray, SimpleSortedDynaArray, DoubleSortedDynaArray. E eu já vi muitos que iniciaram dando manutenção nesse sistema. O cara está aprendendo e com exemplos terríveis. Se ninguém mostrar o erro ele acaba aprendendo errado.

Waterfall é uma merda e ainda é usado e, pior ainda, mascarado em cima de metodologias ágeis com mini waterfalls travestidos de sprints. Isso é mais bizarro ainda do que herdar um quadrado de um retângulo, mas é muito usado também.

Eu passei minha carreira inteira mantendo sistemas mal feitos e, sinceramente, me sinto um papel higiênico. Às vezes eu não acreditava no quão óbvias as cagadas eram, mas existem pessoas que não aprenderam corretamente ou passaram o tempo todo pedindo código pronto em fórum e não se deram ao trabalho de estudar nada. Pra essas pessoas, aquilo era lindo.[/quote]

Eu venho mantendo sistemas de cftv escritos com delphi, controle de acesso escrito em java e até firmwares escritos em c para pic 18 ou 16fxx e aqui não temos problemas com essas coisas. Nosso software possui uma hierarquia que representa drivers cada marca de placa de captura. Essa hierarquia tem 3 niveis apenas(uma interface, uma classe abstrata com um metodo generico para escrever e ler da memoria da placa pci e as classes especificas com atributos especificos das placas). Ele já existe ha uns 10 anos e está na ativa até hoje. Sempre que vejo em uma padaria, estabelecimento comercial que seja pergunto se deu problema
algum dia e sempre recebo uma resposta boa. Por isso eu não concordo com essa preferência de recursos. Tem que ter boas práticas para desenvolver uma solução. Minha opinião é usar esse e aquele artifício com maestria, não excluir um em favorecimento de outro.


[/quote]

Bom, você ainda não conseguiu entender que eu não estou abolindo a herança, estou mostrando os problemas do mau uso dela, que é feito na maioria das vezes para reaproveitamento de código e não para estabelecer uma hierarquia consistente seguindo o princípio de substituição de Liskov.

Não duvido que você tenha problemas de orientação a objetos escrevendo firmwares em c. Depois dessa eu parei por aqui.[/quote]

Entendi sim Ataxexe. Concordo com você em tudo o que disse. Eu só estou questionando o tópico “Prefira x a y” porque eu não exergo vantagem nesse tipo de abordagem. Sem boas práticas alguém quebra qualquer sistema a longo prazo usando ou não usando herança. Esses são os argumentos que defendo. Posso mudar de idéia se aparecer um argumento claro sobre esse tema até porque eu não sou dono da verdade. É só uma opinião minha que estou expondo aqui pra ter debate.

[quote=YvGa][quote=juliocbq][quote=YvGa][quote=juliocbq]
Herdar um quadrado de um retangulo seria a coisa mais esquisita que já ouvi. Afinal quem deriva de quadrado é um retangulo. Esses erros de interpretação ao meu ver são no mínimo bizonhos com o perdão da palavra. É como querer derivar uma ave de uma galinha.

Isso é questão de bom senso. Se uma pessoa não consegue enxergar uma coisa dessas não tem jeito mesmo. Nem o “Maker” resolve.

Essa questão de herança não tem nenhum mistério ou complicação. Se voce tem em mente um modelo onde as hierarquias não são profundas(trocentos níveis), é sólida(tem o comportamento garantido por interfaces) e eficiente(não herda madeira de papel) ela será mais eficiente que a composição por deixar o código simples e enxuto.

*edit aqui - Um quadrado não é um retangulo.[/quote]

Herdar um quadrado de um retangulo é bisonho? Um quadrado não é um retangulo? Um retangulo deriva de um quadrado? Então você está me dizendo que um retangulo é antes de tudo um quadrado?

Você está redondamente (com o perdão do trocadilho) errado. Um quadrado é um retangulo, e a herança seria perfeitamente compreensível não fossem os poréns envolvidos.

O que eu estou dizendo, e como o seu post comprovou, as coisas não são tão cristalinas como vocês querem fazer pensar que são.[/quote]

O quadrado não é um retângulo nunca. Um quadrado possui os atributos de largura e altura fixos enquanto um retangulo adiciona um comportamento variável dessas propriedades. Sua modelagem aí é que está quadrada, desculpe. [/quote]

Todo quadrado é também um retângulo e um losango.

http://pt.wikipedia.org/wiki/Quadrado[/quote]

Não é YvGa. Leia lá em cima o pequeno artigo. Assim você quebra qualquer sistema usando herança mesmo.

[quote=Wikipedia]O princípio da substituição de Liskov tem um relacionamento próximo com a metodologia do projeto por contrato e coloca restrições na forma como os contratos interagem com o conceito de herança:
precondições não podem ser reforçadas em uma sub-classe. Isto significa que não é permitida uma sub-classe com precondições mais fortes que a sua super-classe.
condições posteriores não podem ser enfraquecidas em uma sub-classe. Isto significa que não é permitida uma sub-classe que contém condições posteriores mais fracas que a super-classe.
Em adição, o princípio implica que os métodos das sub-classes não podem lançar exceções não lançadas pela super-classe, exceto quando estas exceções são subtipos das exceções lançadas pelos métodos da super-classe.[/quote]

Julio, o artigo só corrobora o que eu disse. Um quadrado é um retângulo por definição geométrica, ou seja, no domínio, mas não pode ser tratado dessa forma. Herdar o quadrado de um retangulo não é como herdar ave de galinha, pois por definição quadrado é retangulo.

Eu repito, não estou dizendo que não se deve usar herança e concordo com você que se deve estudar o conceito, o que eu discordo é que as coisas simples e que algumas dicas para os iniciantes não devam ser levadas em conta.

[quote=YvGa][quote=juliocbq]
Não é YvGa. Leia lá em cima o pequeno artigo. Assim você quebra qualquer sistema usando herança mesmo.
[/quote]

Julio, o artigo só corrobora o que eu disse. Um quadrado é um retângulo por definição geométrica, ou seja, no domínio, mas não pode ser tratado dessa forma. Herdar o quadrado de um retangulo não é como herdar ave de galinha, pois por definição quadrado é retangulo.

Eu repito, não estou dizendo que não se deve usar herança e concordo com você que se deve estudar o conceito, o que eu discordo é que as coisas simples e que algumas dicas para os iniciantes não devam ser levadas em conta.[/quote]

Entendi agora como você postou lá. Entendi que estava defendendo que o quadrado era um retângulo em um modelo. Desculpe.

Um quadrado não é um retângulo se você for aplicar Liskov no seu modelo e for trabalhar com herança. Toda regra tem sua exceção, mas eu gosto de aplicar essa referência nos meus projetos.

Me diz uma coisa:

se eu somar todas as cores básicas consigo preto ou branco?

[quote=YvGa][quote=Ataxexe]Tentei explicar mais ou menos os perigos da herança aqui:

https://dl.dropboxusercontent.com/u/16755042/blog/unbelievable-exception/posts/cuidado-com-a-heranca.html

É um blog que estou montando e ainda está em fase beta (põe beta nisso). Coloquei lá porque era muita coisa pra escrever (e eu ainda vou dar umas editadas depois).[/quote]

Muito bom!

Outro exemplo classico de como a herança pode enganar é o quadrado e o retangulo. Um quadrado é um retangulo, veja que ele passa no teste do é um.

Se o retangulo tem o setAltura e setComprimento, e voce herda o quadrado do retangulo, pois afinal um quadrado é um retangulo, voce começa a ter problemas. Porque se voce mudar a altura de 12 pra 10, enquanto voce nao mudar o comprimento voce não tem um quadrado. Pra resolver isso voce pode, ao alterar a altura fazer com seja alterado tambem o comprimento. Mas esse não é um comportamento esperado pelo cliente da classe. Ou você pode no classe filha criar um metodo setLado. Mas de um jeito ou de outro o princípio de Liskov pro buraco.

Se voce nao herdar o quadrado do retangulo, mas fazer com que um quadrado use um retangulo e tenha seu setLado, chamando setAltura e setComprimento do retangulo, você tem a sua implementação do quadrado independente do retangulo (como deve ser), sem criar no usuário do seu código a ilusão de que ele pode usar um como se fosse o outro.

Talvez seja eu quem não esteja enxergando tamanha simplicidade, mas o conceito de herança é muito complicado e fugir dele é sim uma ótima dica. Vamos abolir a herança? Não, mas vamos ter muito cuidado ao usá-la.[/quote]
Quadrado nunca será um retangulo… Quadrado é quadrado e retangulo retangulo… é como comparar um elipsóide com uma esfera, são duas figuras geométricas completamente diferentes. Por isso dois nomes diferentes… nunca ouvi ninguem se referir ao quadrado como retangulo, como por exemplo já ouvi se referirem ao celta como carro… Sacou???

[quote=Ataxexe]Tentei explicar mais ou menos os perigos da herança aqui:

https://dl.dropboxusercontent.com/u/16755042/blog/unbelievable-exception/posts/cuidado-com-a-heranca.html

É um blog que estou montando e ainda está em fase beta (põe beta nisso). Coloquei lá porque era muita coisa pra escrever (e eu ainda vou dar umas editadas depois).[/quote]

Cara li o post e não sei como vocês não entendem… Tá maneiro a parada, mas o problema é justamente esse Juquinha usou a herança pelo motivo e de forma errada… e mais, os gestores deveriam ter olhado a api do Juquinha, visto que ele estava estudando.

Então, eu continuo com minha opinião e acredito que vocês só não querem dar o braço a torcer, o problema não é a herança, o problema é a falta de estudo e entendimento…

É praticamente culpar a mulher que anda de mini-saia por ser estuprada… Não tem lógica…

[quote=diogogama][quote=YvGa][quote=Ataxexe]Tentei explicar mais ou menos os perigos da herança aqui:

https://dl.dropboxusercontent.com/u/16755042/blog/unbelievable-exception/posts/cuidado-com-a-heranca.html

É um blog que estou montando e ainda está em fase beta (põe beta nisso). Coloquei lá porque era muita coisa pra escrever (e eu ainda vou dar umas editadas depois).[/quote]

Muito bom!

Outro exemplo classico de como a herança pode enganar é o quadrado e o retangulo. Um quadrado é um retangulo, veja que ele passa no teste do é um.

Se o retangulo tem o setAltura e setComprimento, e voce herda o quadrado do retangulo, pois afinal um quadrado é um retangulo, voce começa a ter problemas. Porque se voce mudar a altura de 12 pra 10, enquanto voce nao mudar o comprimento voce não tem um quadrado. Pra resolver isso voce pode, ao alterar a altura fazer com seja alterado tambem o comprimento. Mas esse não é um comportamento esperado pelo cliente da classe. Ou você pode no classe filha criar um metodo setLado. Mas de um jeito ou de outro o princípio de Liskov pro buraco.

Se voce nao herdar o quadrado do retangulo, mas fazer com que um quadrado use um retangulo e tenha seu setLado, chamando setAltura e setComprimento do retangulo, você tem a sua implementação do quadrado independente do retangulo (como deve ser), sem criar no usuário do seu código a ilusão de que ele pode usar um como se fosse o outro.

Talvez seja eu quem não esteja enxergando tamanha simplicidade, mas o conceito de herança é muito complicado e fugir dele é sim uma ótima dica. Vamos abolir a herança? Não, mas vamos ter muito cuidado ao usá-la.[/quote]
Quadrado nunca será um retangulo… Quadrado é quadrado e retangulo retangulo… é como comparar um elipsóide com uma esfera, são duas figuras geométricas completamente diferentes. Por isso dois nomes diferentes… nunca ouvi ninguem se referir ao quadrado como retangulo, como por exemplo já ouvi se referirem ao celta como carro… Sacou???[/quote]

Do ponto de vista matemático um quadrado é um retângulo sim, mas não o contrário…

Quadrado é um retângulo, porém com todos os lados iguais. Com o mínimo necessário pra se construir um retângulo você consegue fazer um quadrado, mas não o contrário…

[quote=Ruttmann]
Do ponto de vista matemático um quadrado é um retângulo sim, mas não o contrário…

Quadrado é um retângulo, porém com todos os lados iguais. Com o mínimo necessário pra se construir um retângulo você consegue fazer um quadrado, mas não o contrário…[/quote]

Cara eu quis dizer em propriedades…

Mais uma vez volto a dizer o problema não é uso de herança… é falta de estudo…