Um tempo atrás eu falei sobre o princípio de Liskov (LSP), e perguntei se uma classe quadrado deveria herdar de uma classe retângulo. Se você não leu o post ou não conhece o princípio de Liskov, sugiro dar uma lida antes de continuar neste post.

Eu entendia o significado do princípio, mas não havia absorvido claramente como ele funcionava. O princípio de Liskov já foi declarado de diversas formas. Ele diz, resumidamente (e livremente):

Classes base devem poder ser substituíveis por suas classes derivadas

Ou ainda:

O cliente de uma classe deve ser capaz de usar suas derivadas sem se preocupar com isso

Formalmente, segundo Barbara Liskov, autora do princípio, ele diz o seguinte:

"If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T."

Ou, em português:

"Se para cada objeto o1 de tipo S existe um objeto o2 do tipo T sendo que para todos os programas P definidos em termos de T, o comportamento de P não é alterado quando o1 é substituído por o2 então S é um subtipo de T."

A declaração formal, apesar de menos simples, é muito mais clara.

A beleza que encontrei enquanto estudava o princípio é sua relação com design by contract. Quando desenvolvemos com um contrato em mente, falamos sempre de pré-condições e pós-condições. E é aí que o princípio de Liskov fica realmente claro. O LSP é muito mais claro se definirmos ele em termos de contrato. Fica assim:

Uma classe derivada deve sempre ter em cada um de seus métodos pré-condições mais flexíveis, e pós condições mais restritas, em relação à sua classe base.

Voltando ao problema do quadrado e do retângulo. Porque um quadrado não pode herdar de um retângulo? Porque as pós condições da alteração de um lado de um retângulo são mais restritas que as pós condições do mesmo procedimento quando realizado com um quadrado. Um retângulo define que, ao mudar um lado, o outro permanece inalterado, enquanto que no quadrado essa condição é relaxada. O contrário também é verdade, o retângulo não pode herdar de quadrado, porque as pré-condições do quadrado são mais restritas que a do retângulo: os lados tem que ser sempre iguais.

A grande questão nessa discussão toda é que a relação "é um", que costuma definar a herança, é apenas parcialmente útil. Herança, em orientação a objetos, diz respeito à comportamento, e não a conceitos do mundo real, como a geometria. No mundo real, um quadrado é um retângulo. Em OO não é, porque o comportamento esperado de um retângulo (mudar os lados independentemente) é diferente do esperado de um retângulo (os lados são sempre iguais).

Tenha isso em mente: herança tem a ver com reutilização de comportamento.


Postado na(s) categoria(s) Arquitetura pelo giovanni bassi em 5 de agosto de 2009 às 10:53 | Tags: ,

Comentários


Brazil Marcelo M. Maciel
agosto 7. 2009 14:03
Marcelo M. Maciel
Pequena correção na última linha Laughing

Em OO não é, porque o comportamento esperado de um retângulo (mudar os lados independentemente) é diferente do esperado de um QUADRADO (os lados são sempre iguais).

no site


Brazil Gabriel Araujo
agosto 7. 2009 14:27
Gabriel Araujo
Se para cada CACHORRO do tipo CANIS_LUPUS_FAMILIARIS existe um GATO do tipo MAMIFERO sendo que para todos as SITUAÇÕES QUALQUER defindos em termos de MAMIFEROS, o comportamento da SITUACAO QUALQUER não é alterado quando o CACHORRO é substituído por um GATO, então CANIS_LUPUS_FAMILIARIS é um subtipo de MAMIFERO.

eu entendi melhor quando eu li esse texto: http://letras.terra.com.br/dj-antoine/1190812/

*humor

no site


agosto 10. 2009 00:02
Giovanni Bassi
Pois é Gabriel, essa é uma aplicação concreta da declaração formal.
Eu acabei achando a descrição baseada em contratos mais útil...

http://unplugged.giggio.net/http://unplugged.giggio.net/

Comentar


(Vai mostrar seu Gravatar)

  Country flag

biuquote
  • Comentário
  • Pré-visualização
Loading



Quem é Giovanni Bassi

Giovanni Bassi Sou uma pessoa apaixonada por tecnologia e especificamente por .Net. Sou consultor independente especialista em .Net, focado em arquitetura e melhores práticas. Tenho dezenas de artigos publicados na .Net Magazine, revista da qual sou editor técnico. Ministro palestras e cursos de vez em quando, e quando dá tempo eu respiro um pouco. Mais detalhes nesta página.

Busca

Selos

Eu vou ao TechEd Brasil 2010, e você?

MVP

MCPD

MCSD

.Net Magazine

Abaixo ao if!

Calendário

«  setembro 2010  »
seteququsedo
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910
Ver detalhamento de posts no calendário

Blogs interessantes

    OPMLDownload OPML file

    Postagens recentes

    Comentários recentes

    Disclaimer / Aviso
    As opiniões colocadas neste blog são minhas e pessoais e não expressam necessariamente as opiniões de meus empregadores, pareceiros e amigos. Da mesma forma, os comentários feitos por leitores do blog não expressam a minha opinião.

    © Copyright 2010 .Net Unplugged
    Log in