Ich denke, es gibt einige Faktoren, die noch nicht erwähnt wurden.
Zumindest in "pure OOP" (z. B. Smalltalk), wo alles ein Objekt ist, müssen Sie Ihren Verstand in eine ziemlich unnatürliche Konfiguration verwandeln, um sich eine Zahl (nur für ein Beispiel) als intelligentes Objekt anstatt vorzustellen nur ein Wert - da in der Realität 21
(zum Beispiel) wirklich ist nur ein Wert. Dies wird besonders problematisch, wenn Sie einerseits erfahren, dass ein großer Vorteil von OOP darin besteht, die Realität genauer zu modellieren, aber Sie beginnen damit, dass Sie eine sehr ähnliche, von LSD inspirierte Sicht auf die grundlegendsten und offensichtlichsten Teile von OOP haben Wirklichkeit.
Zweitens folgt die Vererbung in OOP auch nicht sehr genau den mentalen Modellen der meisten Menschen. Für die meisten Menschen nicht Dinge , die meisten speziell die Klassifizierung nicht haben überall in der Nähe der absoluten Regeln notwendig , um eine Klassenhierarchie zu erstellen , die funktioniert. Insbesondere bedeutet das Schaffen eines class D
, das von einem anderen erbt class B
, dass Objekte class D
absolut alle Eigenschaften von teilen class B
. class D
kann neue und andere Eigenschaften hinzufügen, aber alle Eigenschaften von class B
müssen intakt bleiben.
Im Gegensatz dazu folgen Menschen, wenn sie Dinge mental klassifizieren, in der Regel einem viel lockeren Modell. Wenn eine Person beispielsweise Regeln für eine Objektklasse aufstellt, ist es ziemlich typisch, dass fast jede Regel verletzt werden kann, solange genügend andere Regeln eingehalten werden. Sogar die wenigen Regeln, die nicht wirklich gebrochen werden können, können sowieso fast immer ein wenig "gedehnt" werden.
Betrachten Sie beispielsweise "Auto" als eine Klasse. Es ist ziemlich leicht zu erkennen, dass die überwiegende Mehrheit dessen, was die meisten Leute als "Autos" bezeichnen, vier Räder hat. Die meisten Menschen haben jedoch (zumindest ein Bild von) einem Auto mit nur drei Rädern gesehen. Einige von uns im richtigen Alter erinnern sich auch an ein oder zwei Rennautos aus den frühen 80ern (oder so) mit sechs Rädern - und so weiter. Dies lässt uns im Grunde drei Möglichkeiten:
- Behaupten Sie nicht, wie viele Räder ein Auto hat - aber dies führt zu der impliziten Annahme, dass es immer 4 sein wird und Code, der wahrscheinlich für eine andere Zahl kaputt geht.
- Nehmen Sie an, dass alle Autos vier Räder haben, und klassifizieren Sie diese nur als "Nicht-Autos", obwohl wir wissen, dass sie es wirklich sind.
- Entwerfen Sie die Klasse so, dass die Anzahl der Räder für alle Fälle variiert, auch wenn die Wahrscheinlichkeit groß ist, dass diese Funktion niemals benötigt, verwendet oder ordnungsgemäß getestet wird.
Das Unterrichten über OOP konzentriert sich oft darauf, riesige Taxonomien aufzubauen - z. B. Teile einer gigantischen Hierarchie von allem bekannten Leben auf der Erde oder etwas in dieser Reihenfolge. Dies wirft zwei Probleme auf: In erster Linie führt es dazu, dass sich viele Menschen auf riesige Informationsmengen konzentrieren, die für die jeweilige Frage völlig irrelevant sind. Irgendwann sah ich eine ziemlich lange Diskussion darüber, wie man Hunderassen modelliert und ob (zum Beispiel) "Zwergpudel" von "Vollpudel" erben sollte oder umgekehrt, oder ob es einen abstrakten Grundpudel geben sollte "Klasse, mit" Pudel in voller Größe "und" Zwergpudel ", die beide davon erben. Was sie alle zu ignorieren schienen, war, dass die Anwendung sich mit dem Verfolgen von Lizenzen für Hunde befassen sollte,
Zweitens, und das ist beinahe wichtig, führt dies dazu, dass Sie sich auf die Eigenschaften der Objekte konzentrieren, anstatt sich auf die Eigenschaften zu konzentrieren, die für die jeweilige Aufgabe wichtig sind. Dies führt dazu, dass die Dinge so modelliert werden, wie sie sind, wo (meistens) wirklich das einfachste Modell erstellt werden muss, das unsere Anforderungen erfüllt, und die Abstraktion verwendet wird, um die erforderlichen Unterklassen an die von uns erstellte Abstraktion anzupassen .
Abschließend möchte ich noch einmal sagen: Wir gehen langsam den gleichen Weg, den Datenbanken im Laufe der Jahre eingeschlagen haben. Frühe Datenbanken folgten dem hierarchischen Modell. Dies ist keine reine Datenvererbung, sondern eine einmalige Vererbung. Für kurze Zeit folgten einige Datenbanken dem Netzwerkmodell - im Wesentlichen identisch mit der Mehrfachvererbung (und unter diesem Gesichtspunkt unterscheiden sich mehrere Schnittstellen nicht genug von mehreren Basisklassen, um dies zu bemerken oder sich darum zu kümmern).
Vor langer Zeit haben sich Datenbanken jedoch weitgehend dem relationalen Modell angenähert (und obwohl es sich nicht um SQL handelt, sind die aktuellen "NoSQL" -Datenbanken auf dieser Abstraktionsebene auch relational). Die Vorteile des relationalen Modells sind hinreichend bekannt, so dass ich sie hier nicht wiederholen möchte. Ich stelle nur fest, dass das nächste Analogon des relationalen Modells, das wir in der Programmierung haben, die generische Programmierung ist (und es tut mir leid, aber trotz des Namens qualifizieren sich Java-Generika zum Beispiel nicht wirklich, obwohl sie einen winzigen Schritt in die richtige Richtung darstellen richtige Richtung).