Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Um quadrado não é um retângulo!

Pelo menos em programação, dependendo do que você vai fazer, um quadrado não é um retângulo.

Acho que esse assunto é bem interessante e poderia estar no curso (de uma forma bem melhor provavelmente), até lá...

A ideia que usam para explicar é: dois advogados que representam um casal em divorcio não estão se divorciando eles mesmos.

Um quadrado é, na vida real, um retângulo. Mas quando tentamos isso na programação, coisas estranhas começam a acontecer. É tipo o que tava acontecendo lá no LSP (Liskov Substitution Principle) onde o Terceirizado não era um Empregado.

Se a Classe Retangulo tiver um campo "área" ou "perímetro" e quando você mexe em um dos lados, ele já altera esses valores, ao derivar um Quadrado da classe Retangulo, você pode ter comportamentos inesperados já que a classe retângulo tem dois valores distintos para "altura" e "largura" enquanto quadrado provavelmente teria apenas um que mexeria nos dois valores.

De qualquer forma, a ideia é que só porque na vida real é de um jeito, a representação disso em um programa pode ser diferente.


Enquanto procurava as palavras certas usadas no coisa dos advogados, vi o que acredito ser um post pelo próprio Uncle Bob aqui.

This is the classic example of the LSP (Liskov Substitution Principle) which says that subclasses must be substitutable for their base classes. You make the point that mutable squares cannot be substituted for mutable rectangles. However, you suggest that the problem can be solved by making the classes immutable. In truth a problem remains. The immutable Square, by virtue of it’s inheritance from the immutable Rectangle has two member variables. Yet it needs only one. The Rectangle class gives those two variables different names (e.g. width, height). Those names are inherited into the immutable Square and are misnomers at best.

The truth is that Squares and Rectangles, even immutable Squares and Rectangles, ought not be associated by inheritance.

This flies in the face of a rather large body of casual OO thought. People want to use inheritance wherever they can apply ISA. A Square ISA Rectangle, therefore we want to derive Square from Rectangle. But no. The class Square is not a square, it is a program that represents a square. The class Rectangle is not a rectangle, it is a program that represents a rectangle. And just as the two lawyers in a divorce case are not divorcing each other, the representatives of two geometric shapes do not share the relationships of those shapes. The fact that a square is a rectangle does not mean that their representatives share the ISA relationship.

A pox on the ISA relationship. It’s been misleading and damaging for decades. Inheritance is not ISA. Inheritance is the redeclaration of functions and variables in a sub-scope. No more. No less.

Ele explica bem melhor...

1 resposta
solução!

Oi Bruno,

Valeu pela dica!

Não quis usar o exemplo do quadrado/retangulo, pois é sempre esse mesmo exemplo que se utilizar para explicar o Liskov :D

Bons estudos!