Als ich anfing, Javascript zu programmieren, nachdem ich mich hauptsächlich mit OOP in klassenbasierten Sprachen befasst hatte, war ich verwirrt darüber, warum prototypbasiertes OOP jemals dem klassenbasierten OOP vorgezogen würde.
- Welche strukturellen Vorteile bietet die Verwendung von prototypbasiertem OOP, falls vorhanden? (Würden wir erwarten, dass es in bestimmten Anwendungen schneller oder weniger speicherintensiv ist?)
- Was sind die Vorteile aus der Sicht eines Programmierers? (Ist es beispielsweise einfacher, bestimmte Anwendungen zu codieren oder den Code anderer mithilfe von Prototypen zu erweitern?)
Bitte betrachten Sie diese Frage nicht als eine Frage zu Javascript (das im Laufe der Jahre viele Fehler hatte, die nichts mit dem Prototyping zu tun haben). Betrachten Sie es stattdessen im Kontext der theoretischen Vorteile von Prototyping gegenüber Klassen.
Danke.
design
object-oriented
language-agnostic
Deets McGeets
quelle
quelle
Antworten:
Ich hatte ziemlich viel Erfahrung mit beiden Ansätzen, als ich ein RPG-Spiel in Java schrieb. Ursprünglich habe ich das ganze Spiel mit klassenbasiertem OOP geschrieben, aber irgendwann wurde mir klar, dass dies der falsche Ansatz war (er wurde mit der Erweiterung der Klassenhierarchie nicht mehr aufrechtzuerhalten). Ich habe daher die gesamte Codebasis in prototypbasierten Code konvertiert. Das Ergebnis war viel besser und einfacher zu handhaben.
Quellcode hier, wenn Sie interessiert sind ( Tyrant - Java Roguelike )
Hier sind die Hauptvorteile:
Hier sind die Hauptnachteile:
Zum Schluss einige Implementierungshinweise:
quelle
Der Hauptvorteil von prototypbasiertem OOP ist, dass Objekte und "Klassen" zur Laufzeit erweitert werden können.
In Class-based OOP gibt es mehrere gute Funktionen, die leider von der Programmiersprache abhängen.
Object Pascal (Delphi), VB.Net & C #, bietet eine sehr direkte Möglichkeit, Eigenschaften (nicht zu verwechseln mit Feldern) und Zugriffsmethoden für Eigenschaften zu verwenden, während auf Java & C ++ - Eigenschaften über Methoden zugegriffen wird. Und PHP hat eine Mischung aus beidem, die man "magische Methoden" nennt.
Es gibt einige dynamische Typisierungsklassen, obwohl die OO-Hauptsprachen eine statische Typisierung aufweisen. Ich halte statisches Tippen mit Class OO für sehr nützlich, da es eine Funktion namens Object Introspection ermöglicht, mit der diese IDE erstellt und Webseiten visuell und schnell entwickelt werden können.
quelle
Ich muss @umlcat zustimmen. Klassenerweiterung ist ein großer Vorteil. Angenommen, Sie möchten einer Zeichenfolgenklasse über einen längeren Zeitraum mehr Funktionen hinzufügen. In C ++ würden Sie dies durch die fortgesetzte Vererbung früherer Generationen von Zeichenfolgenklassen tun. Das Problem bei diesem Ansatz ist, dass jede Generation im Wesentlichen zu einem eigenen Typ wird, was zu einem massiven Umschreiben vorhandener Codebasen führen kann. Mit der prototypischen Vererbung fügen Sie der ursprünglichen Basisklasse einfach eine neue Methode hinzu, ohne dass überall ererbte Klassen und Vererbungsbeziehungen massiv aufgebaut werden müssen. Ich würde gerne sehen, dass C ++ einen ähnlichen Erweiterungsmechanismus in seinem neuen Standard hat. Aber ihr Komitee scheint von Leuten geleitet zu werden, die die eingängigen und beliebten Features hinzufügen wollen.
quelle
std::string
bereits zu viele Mitglieder, die unabhängige Algorithmen oder zumindest Nicht-Freunde-Nicht-Mitglieder sein sollten. Außerdem können neue Member-Funktionen hinzugefügt werden, ohne das In-Memory-Layout zu ändern, sofern Sie die ursprüngliche Klasse ändern können.