Da viele dynamische Programmiersprachen die Funktion " Duck Typing" haben und außerdem jederzeit Klassen- oder Instanzmethoden (wie Ruby und Python ) öffnen und ändern können ,…
Frage 1) Was ist für eine Klasse in einer dynamischen Sprache erforderlich? Warum ist die Sprache so konzipiert, dass eine Klasse als eine Art „Vorlage“ verwendet wird, anstatt wie ein Prototyp und nur mit einem Objekt?
Auch JavaScript basiert auf Prototypen, aber CoffeeScript (die erweiterte Version von JavaScript) wählt den klassenbasierten Weg. Dies gilt auch für Lua (basierend auf Prototypen) und MoonScript (basierend auf Klassen). Darüber hinaus gibt es Klasse in ES 6. Also ...
Frage 2) Schlägt es vor, dass Sie, wenn Sie unter anderem versuchen, eine prototypbasierte Sprache zu verbessern, diese in eine klassenbasierte Sprache ändern sollten? Wenn nicht, warum ist es so gestaltet?
class
Schlüsselwort ab dem nächsten ECMAScript-Standard (ECMAScript 6). Die Unterstützung von JavaScript-Klassen ist seit langem geplant. Nun, was es ist - Klassen sind nur syntaktischer Zucker, was das Nachdenken über Modelle für Objekte des gleichen Typs erleichtert. Dies ist in JS und in Python und anderen dynamischen Sprachen der Fall.Antworten:
Die allererste OO-Sprache (obwohl sie nicht "OO" genannt wurde), Simula, hatte keine Vererbung. Vererbung wurde in Simula-67 hinzugefügt und basierte auf Klassen.
Etwa zur gleichen Zeit begann Alan Kay an seiner Idee eines neuen Programmierparadigmas zu arbeiten, das er später "Objektorientierung" nannte. Er mochte Vererbung sehr und wollte sie in seiner Sprache haben, aber er mochte auch keinen Unterricht. Er konnte jedoch keine Möglichkeit finden, eine Vererbung ohne Klassen zu haben, und entschied, dass er Klassen nicht so sehr mochte, als dass er sie mochte, und entwarf die erste Version von Smalltalk, Smalltalk-72 ohne Klassen und somit ohne Vererbung.
Ein paar Monate später entwickelte Dan Ingalls eine Klassenkonstruktion, bei der die Klassen selbst Objekte waren, nämlich Instanzen von Metaklassen. Alan Kay fand dieses Design etwas weniger ansprechend als die älteren, daher wurde Smalltalk-74 mit Klassen und einer auf Klassen basierenden Vererbung entworfen.
Nach Smalltalk-74 hatte Alan Kay das Gefühl, dass Smalltalk sich in die falsche Richtung bewegte und nicht wirklich darstellte, worum es bei OO ging. Er schlug vor, dass das Team Smalltalk aufgibt und neu anfängt, aber er wurde überstimmt. So folgten Smalltalk-76, Smalltalk-80 (die erste für Forscher freigegebene Version von Smalltalk) und schließlich Smalltalk-80 V2.0 (die erste kommerziell freigegebene Version und die Version, die die Grundlage für ANSI Smalltalk wurde). .
Da Simula-67 und Smalltalk-80 die Großeltern aller OO-Sprachen sind, kopierten fast alle folgenden Sprachen blind das Design von Klassen und die Vererbung basierend auf Klassen. Ein paar Jahre später, als andere Ideen wie die Vererbung auf Basis von Mixins anstelle von Klassen und die Delegierung auf Basis von Objekten anstelle von Vererbung auf Basis von Klassen auftauchten, war die klassenbasierte Vererbung bereits zu tief verwurzelt.
Interessanterweise basiert die aktuelle Sprache von Alan Kay auf der Delegation von Prototypen.
quelle
Viele Programmierer arbeiten lieber mit Klassen. Es ist ein sehr einfach zu verstehendes Konzept, das ein gutes Modell menschlicher Denkprozesse über die Welt darstellt (dh wir beziehen reale Objekte instinktiv auf die abstrakte Gruppe von Gegenständen, zu denen wir sie als gehören betrachten, was eine Klasse ist). . Klassen vereinfachen auch das Denken über Objekttypen: In einer klassenbasierten Sprache ist das Anwenden von Prinzipien wie der Liskov-Substitution einfacher als in einer Sprache, in der es nur Objekte gibt, die möglicherweise andere Methoden haben oder deren Typ sich sogar zur Laufzeit ändert , wie es in JavaScript der Fall ist.
Beachten Sie, dass selbst in JavaScript sehr viel Code einfach die Prototypfunktion verwendet, um Klassen zu emulieren. Dies liegt hauptsächlich daran, dass viele Programmierer es vorziehen, so zu denken.
Es gibt noch einen weiteren Grund, warum klassenbasierte Sprachen bevorzugt werden: Es ist einfacher, sie zu effizientem Code zu kompilieren. Die effizientesten JavaScript-VMs erstellen effektiv dynamisch Klassen, um die Typen von JavaScript-Objekten darzustellen, wenn sich ihre Methoden und Prototypen ändern. In dieser Beschreibung der Implementierung von V8 finden Sie eine Begründung, warum dies so ist.
quelle
GOTO
s und Register erstellt, bedeutet, dass es mit ziemlicher Sicherheit einfacher ist, alle Abstraktionen aufzugeben und direkt in Assembler zu schreiben. Daher müsste die JIT wahrscheinlich weniger Zeit für das Kompilieren des Codes aufwenden. Es ist die Aufgabe eines Compilers, übergeordnete Abstraktionen zu unterstützen.Ich habe gehört, dass in großen Projekten, in denen Teams an demselben Code arbeiten, flexible Sprachen (in denen Sie die Eigenschaften und Methoden eines Objekts zur Laufzeit ändern können) Freiheiten sind, die andere Teammitglieder nicht möchten haben.
Sie möchten wissen, dass sich das Objekt so verhält, wie es der Bauplan vorgibt, und nicht auf eine Weise, die ein anderer ambitionierter Entwickler beschlossen hat, es zu ändern, um seine eigene Aufgabe zu erfüllen.
Der einzige Grund, warum ich mir vorstellen kann, dass jemand die Flexibilität dieser beeindruckenden dynamischen Sprachen nicht möchte, ist, dass er die Teamentwicklung, das Debuggen und die automatische Dokumentation vereinfachen möchte.
Persönlich habe ich Anwendungen in beiden Methoden entwickelt, und mit dynamischen Sprachen kann ich vieles schneller erledigen. Ich verwende keines dieser Frameworks, um meine dynamische Sprache wieder in eine klassenbasierte Sprache umzuwandeln. Solche Dinge sind eine Regression nach meinem Geschmack.
quelle
Also, was er hier sagt, ist, dass es bei OO darum geht, Black Boxes zu erstellen, die auf Nachrichten reagieren. In gewisser Weise ist REST das ultimative OO-System, da es Verben (dh eine Nachricht) und Ressourcen (dh ein undurchsichtiges Feld, das einige Daten enthält) verwendet.
Die Frage, warum manche auf Klassen und andere auf Prototypen basieren, geht dahin, dass es eigentlich egal ist, sie sind beide nur Implementierungen. Ein System, das nur Messaging anstelle von Methodenaufrufen verwendet, ist genauso gut wie die beiden von Ihnen erwähnten Instanzen.
quelle