Czy istnieje konkretna nazwa paradoksu „Kwadrat dziedziczy z prostokąta”?

18

Pewna awaria OOP jest pokazana z klasą Kwadrat dziedziczącą po Prostokącie, gdzie logicznie Kwadrat jest specjalizacją Prostokąta i dlatego powinien dziedziczyć po nim, ale wszystko się rozpada, gdy próbujesz zmienić długość lub szerokość Kwadratu.

Czy istnieje konkretny termin opisujący, co dzieje się w tej sprawie?

Zwycięzca
źródło
2
czy mógłbyś wyjaśnić, co dokładnie „idzie źle”? Nie rozumiem, co masz na myśli
komara
1
Zakładając, że prostokąt ma wirtualną metodę, która pozwala ustawić rozmiar poprzez podanie długości i szerokości, ustawienie innej długości i szerokości na kwadracie może zwrócić prostokąt, a ustawienie tej samej długości i szerokości na prostokącie może zwrócić kwadrat. Każdy kod, który musi wyraźnie znać kwadrat, może próbować rzutować na kwadrat. Nie rozumiem, jak doszło do awarii ...
8
To nie jest paradoks. Jest to przypadek niewłaściwego modelowania domeny problemowej. Hierarchia dziedziczenia niekoniecznie będzie zgodna z hierarchią rzeczy w dziedzinie problemowej. To miło, gdy tak się dzieje, ale sztuczka w dobrym modelu polega na zrozumieniu, gdzie trzeba robić rzeczy inaczej niż w prawdziwym świecie.
Michael Kohne
1
FWIW: Dokładniej, problem polega na tym, że interfejsy do odczytu i zapisu nie pasują do siebie. To znaczy, możesz czytać okrąg jako specjalizację elipsy, ale pisać tylko elipsę jako specjalizację koła.
Macke
1
@GrandmasterB Mówię „każda osoba, rzecz lub sytuacja wykazująca pozornie sprzeczny charakter”. Sprzeczność polega na tym, że jeśli kwadrat ma inne właściwości, musimy powiedzieć: „Kwadrat nie jest rodzajem prostokąta”, gdy w rzeczywistości oczekujemy, że kwadrat będzie podtypem prostokąta. Prawdopodobnie żadna rzeczywista aplikacja nie miałaby typu Prostokąt i Kwadrat, to tylko abstrakcja ilustrująca pewien rodzaj problemu, który może pojawić się w paradygmatach opartych na klasach.
Victor

Odpowiedzi:

27

Wikipedia po prostu nazywa to problemem Elipsy Koła

Problemem koło, elipsa rozwoju oprogramowania (czasami znanym jako błąd kwadratowy, prostokąt ) przedstawia szereg pułapek, które mogą się pojawić przy stosowaniu polimorfizmu podtypu modelowania obiektów. Problemy najczęściej występują w przypadku programowania obiektowego.

Jest to L w akronimie SOLID, który jest znany jako zasada podstawienia Liskowa . Problem ten powstaje jako naruszenie tej zasady.

Problem dotyczy tego, która relacja podsieci lub dziedziczenia powinna istnieć między klasami reprezentującymi koła i elipsy (lub podobnie kwadraty i prostokąty). Mówiąc bardziej ogólnie, problem ilustruje trudności, które mogą wystąpić, gdy klasa podstawowa zawiera metody mutujące obiekt w sposób, który może unieważnić (silniejszy) niezmiennik znaleziony w klasie pochodnej, powodując naruszenie zasady podstawienia Liskowa ...

Mark Canlas
źródło
1
I czytając go, Wikipedia wspomina bardziej naukowe wyjaśnienie jako „[naruszenie] zasady substytucji Liskowa”. Dzięki :)
Victor
1
Cóż, to tylko naruszenie w zależności od tego, jak na to patrzysz. Osobiście wszystkie koła są elipsami; nie ma naruszenia. Naruszenie metod elipsy staje się zbyt restrykcyjne. Zatem w tym konkretnym scenariuszu okrąg nie może być podtypem tego konkretnego kontraktu elipsy.
Mark Canlas
6
@MarkCanlas Problemem jest niewątpliwie naruszenie zasady substytucji Liskowa. To może nie być pogwałcenie innych zasad, ale nikt tego nie twierdził. Gdy problem nie występuje, ponieważ umowy nie zawierają niezmiennika, który zostałby zerwany (chociaż nie wyobrażam sobie przydatnego modelu, w którym jest to prawda), może nie nastąpić naruszenie LSP, ale to nie znaczy, że problem , gdy się pojawi, nie jest spowodowany naruszeniem LSP.
7
@Mark Canlas: nie, stały okrąg jest stałą elipsą, zmienne koło nie jest zmienną elipsą. Przy założeniu stałości geometrii nie można zmienić elipsy, można przyjąć inną elipsę
maxim1000
1
Ograniczenie historyczne / reguła zasady podstawienia Liskowa mówi, że gdy podtyp dodaje nowe metody, metody te nie mogą manipulować stanem obiektu w taki sposób, że tworzy on historię (tj. Serię stanów), która nie jest dozwolone w nadtypie. Np. Nie można uczynić podtypu niezmiennego mutowalnego, ponieważ gdy manipuluje się go jedynie metodami nadtypu, stan jest zawsze taki sam, natomiast gdy manipuluje się go metodami mutatora podtypu, stan się zmienia. To historia, która nie jest dozwolona przez nadtyp.
Jörg W Mittag
8

Uznałbym to za naruszenie zasady substytucji Liskowa - Squarepodklasa szczególnie narusza niezmienność niezależności długości i szerokości.

Paul Phillips
źródło
8

Na poziomie bardziej podstawowym niż Zasada Zastępstwa Liskowa jest to błąd kategorii lub błąd kategorii

W kontekście zachowania podczas modelowania kwadrat po prostu nie jest rodzajem prostokąta.

Kiedy zdasz sobie z tego sprawę, problem ustępuje, ponieważ początkowe założenie (kwadrat jest rodzajem prostokąta) jest usuwane z gry.

Problem z tą odpowiedzią polega na tym, że od szkoły wierci się w każdym, kto robi geometrię, że kwadrat jest rodzajem prostokąta. Ale bardzo ważne jest, aby zrozumieć, że jest to prawdą tylko w bardzo specyficznym kontekście (klasyfikacja kształtów geometrycznych na podstawie właściwości ich kątów wewnętrznych). Pod względem zachowania kwadrat nie jest prostokątem. Wyświetlanie jednego zestawu klasyfikacji w niewłaściwym kontekście jest błędem w kategorii.

Cormac Mulhall
źródło