Gibt es einen bestimmten Namen für das Paradoxon „Quadrat erbt von Rechteck“?


18

Ein gewisser Fehler von OOP wird mit einer Klasse Square angezeigt, die von Rectangle erbt, wobei Square logischerweise eine Spezialisierung von Rectangle ist und daher davon erben sollte, aber alles fällt auseinander, wenn Sie versuchen, die Länge oder Breite eines Quadrats zu ändern.

Gibt es einen speziellen Begriff, um zu beschreiben, was in diesem Fall falsch läuft?


2
Könnten Sie bitte erklären, was genau "schief geht"? Ich verstehe nicht , was Sie meinen
gnat

1
Angenommen, ein Rechteck verfügt über eine virtuelle Methode, mit der die Größe durch Übergabe von Länge und Breite festgelegt werden kann. Wenn Sie für ein Quadrat eine andere Länge und Breite festlegen, wird möglicherweise ein Rechteck zurückgegeben. Wenn Sie für ein Rechteck dieselbe Länge und Breite festlegen, wird möglicherweise ein Quadrat zurückgegeben. Jeder Code, der das Quadrat explizit kennen muss, kann versuchen, es in ein Quadrat umzuwandeln. Ich sehe nicht, wie es einen Fehler gibt ...

8
Dies ist kein Paradoxon. Dies ist ein Fall von fehlerhafter Modellierung der Problemdomäne. Die Vererbungshierarchie wird NICHT notwendigerweise mit der Hierarchie der Sache in der Problemdomäne übereinstimmen. Es ist schön, wenn es so ist, aber der Trick in einem guten Modell besteht darin, zu verstehen, wo man Dinge anders machen muss als in der realen Welt.
Michael Kohne

1
FWIW: Insbesondere besteht das Problem darin, dass die Lese- und Schreibschnittstellen nicht übereinstimmen. Dh Sie können einen Kreis als Spezialisierung einer Ellipse lesen, aber nur eine Ellipse als Spezialisierung eines Kreises schreiben.
Macke

1
@GrandmasterB Ich gehe von "jeder Person, Sache oder Situation aus, die einen scheinbar widersprüchlichen Charakter aufweist." Der Widerspruch ist, dass, wenn das Quadrat verschiedene Eigenschaften hat, wir sagen müssen, dass "ein Quadrat keine Art von Rechteck ist", wenn wir davon ausgehen, dass das Quadrat ein Untertyp des Rechtecks ​​ist. Wahrscheinlich hätte keine echte Anwendung die Typen Rechteck und Quadrat. Es ist nur eine Abstraktion, um eine bestimmte Art von Problem zu veranschaulichen, das in klassenbasierten Paradigmen auftreten kann.
Victor

Antworten:


27

Wikipedia nennt es lediglich das Kreisellipsenproblem

Das Kreisellipsenproblem in der Softwareentwicklung (manchmal bekannt als Quadrat-Rechteck-Problem bekannt ) veranschaulicht eine Reihe von Fallstricken, die bei der Verwendung des Subtyp-Polymorphismus bei der Objektmodellierung auftreten können. Die Probleme treten am häufigsten bei der Verwendung der objektorientierten Programmierung auf.

Dies ist das L im Akronym SOLID, das als Liskov-Substitutionsprinzip bekannt ist . Dieses Problem stellt sich als Verstoß gegen diesen Grundsatz.

Das Problem betrifft, welche Untertypisierungs- oder Vererbungsbeziehung zwischen Klassen bestehen sollte, die Kreise und Ellipsen (oder ähnlich Quadrate und Rechtecke) darstellen. Das Problem veranschaulicht allgemeiner die Schwierigkeiten, die auftreten können, wenn eine Basisklasse Methoden enthält, die ein Objekt auf eine Weise mutieren, die eine (stärkere) Invariante in einer abgeleiteten Klasse ungültig macht, wodurch das Liskov-Substitutionsprinzip verletzt wird ...


1
Und in Wikipedia wird die akademischere Erklärung als "[Verletzung] des Liskov-Substitutionsprinzips" bezeichnet. Danke :)
Victor

1
Nun, es ist nur ein Verstoß, je nachdem, wie Sie es sehen. Persönlich sind alle Kreise Ellipsen; es liegt kein Verstoß vor. Es beginnt eine Verletzung, wenn die Methoden für die Ellipse zu restriktiv werden. Dann kann in diesem bestimmten Szenario ein Kreis kein Untertyp dieses bestimmten Ellipsenkontrakts sein.
Mark Canlas

6
@ MarkCanlas Das Problem ist unbestreitbar eine Verletzung des Liskov-Substitutionsprinzips. Es ist vielleicht kein Verstoß gegen andere Prinzipien, aber das hat niemand behauptet. Wenn das Problem nicht auftritt, weil die Verträge keine Invarianten enthalten, die gebrochen werden könnten (obwohl ich mir kein nützliches Modell vorstellen kann, bei dem dies zutrifft), liegt möglicherweise keine Verletzung des LSP vor, dies bedeutet jedoch nicht, dass Wenn das Problem auftritt, liegt es nicht an einer LSP-Verletzung.

7
@ Mark Canlas: Nein, konstanter Kreis ist eine konstante Ellipse, veränderlicher Kreis ist keine veränderliche Ellipse. Bei der Geometriekonstanz wird davon ausgegangen, dass Sie eine Ellipse nicht ändern können. Sie können eine andere Ellipse nehmen
maxim1000

1
Die History-Einschränkung / -Regel des Liskov-Substitutionsprinzips besagt, dass beim Hinzufügen neuer Methoden durch einen Subtyp der Zustand des Objekts nicht so manipuliert werden darf, dass eine History (dh eine Reihe von Zuständen) erstellt wird, die nicht vorhanden ist im Supertyp erlaubt. Sie können beispielsweise einen Subtyp eines unveränderlichen Datentyps nicht veränderlich machen, da der Zustand immer derselbe ist, wenn er nur mit Methoden des Supertyps bearbeitet wird, wohingegen sich der Zustand ändert, wenn er mit den Mutatormethoden des Subtyps bearbeitet wird. Das ist eine Geschichte, die der Supertyp nicht zulässt.
Jörg W Mittag


8

Auf einer grundlegenderen Ebene als das Liskov-Substitutionsprinzip ist dies ein Kategoriefehler oder ein Kategoriefehler

Im Kontext des Modellierungsverhaltens ist ein Quadrat einfach keine Art von Rechteck.

Wenn Sie dies erkennen, verschwindet das Problem, da die ursprüngliche Annahme (ein Quadrat ist eine Art Rechteck) nicht mehr im Spiel ist.

Das Problem mit dieser Antwort ist, dass seit der Schule jeder, der Geometrie macht, weiß, dass ein Quadrat eine Art Rechteck ist. Es ist jedoch sehr wichtig zu verstehen, dass dies nur in einem sehr spezifischen Kontext zutrifft (die Klassifizierung geometrischer Formen anhand der Eigenschaften ihrer Innenwinkel). In Bezug auf das Verhalten ist ein Quadrat kein Rechteck. Ein Satz von Klassifikationen im falschen Kontext anzuzeigen, ist ein Kategoriefehler.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.