Je mehr ich über verschiedene Programmierparadigmen wie die funktionale Programmierung lerne, desto mehr beginne ich, die Weisheit von OOP-Konzepten wie Vererbung und Polymorphismus in Frage zu stellen. Ich habe zum ersten Mal in der Schule etwas über Vererbung und Polymorphismus gelernt, und damals schien Polymorphismus eine wunderbare Möglichkeit zu sein, generischen Code zu schreiben, der eine einfache Erweiterbarkeit ermöglichte.
Aber angesichts der dynamischen und statischen Typisierung von Enten sowie funktionaler Merkmale wie Funktionen höherer Ordnung habe ich begonnen, Vererbung und Polymorphismus als eine unnötige Einschränkung zu betrachten, die auf einem fragilen Satz von Beziehungen zwischen Objekten beruht. Die allgemeine Idee hinter Polymorphismus ist, dass Sie eine Funktion einmal schreiben und später Ihrem Programm neue Funktionen hinzufügen können, ohne die ursprüngliche Funktion zu ändern. Sie müssen lediglich eine weitere abgeleitete Klasse erstellen, die die erforderlichen Methoden implementiert.
Dies ist jedoch viel einfacher durch Eingabe von Enten zu erreichen, unabhängig davon, ob es sich um eine dynamische Sprache wie Python oder eine statische Sprache wie C ++ handelt.
Betrachten Sie als Beispiel die folgende Python-Funktion, gefolgt von ihrem statischen C ++ - Äquivalent:
def foo(obj):
obj.doSomething()
template <class Obj>
void foo(Obj& obj)
{
obj.doSomething();
}
Das OOP-Äquivalent wäre etwa der folgende Java-Code:
public void foo(DoSomethingable obj)
{
obj.doSomething();
}
Der Hauptunterschied besteht natürlich darin, dass die Java-Version die Erstellung einer Schnittstelle oder einer Vererbungshierarchie erfordert, bevor sie funktioniert. Die Java-Version ist daher aufwändiger und weniger flexibel. Außerdem finde ich, dass die meisten Vererbungshierarchien in der Praxis etwas instabil sind. Wir haben alle die erfundenen Beispiele für Formen und Tiere gesehen, aber in der realen Welt ist es schwierig, eine Arbeit zu erledigen, wenn sich die Geschäftsanforderungen ändern und neue Funktionen hinzugefügt werden, bevor Sie die "Ist-Eine" -Beziehung zwischen ihnen wirklich ausdehnen müssen Unterklassen oder modifizieren / refaktorieren Sie Ihre Hierarchie, um weitere Basisklassen oder Schnittstellen einzubeziehen, um neuen Anforderungen gerecht zu werden. Mit Duck Typing brauchen Sie sich keine Gedanken über das Modellieren zu machen - Sie müssen sich nur um das Modellieren kümmern Funktionalität Sie benötigen.
Vererbung und Polymorphismus sind jedoch so beliebt, dass ich bezweifle, dass es übertrieben wäre, sie als die vorherrschende Strategie für Erweiterbarkeit und Wiederverwendung von Code zu bezeichnen. Warum sind Vererbung und Polymorphismus so erfolgreich? Übersehe ich einige gravierende Vorteile, die Vererbung / Polymorphismus gegenüber dem Typisieren von Enten haben?
obj
ich keinedoSomething
Methode hätte? Wird eine Ausnahme ausgelöst? Passiert nichts