Étant donné que de nombreux langages de programmation dynamiques ont la caractéristique de taper du canard , et ils peuvent également ouvrir et modifier des méthodes de classe ou d'instance à tout moment (comme Ruby et Python ), alors…
Question 1) Quel est le besoin d'une classe dans une langue dynamique? Pourquoi le langage est-il conçu de cette façon pour utiliser une classe comme une sorte de «modèle» au lieu de le faire de la manière prototype et d'utiliser simplement un objet?
JavaScript est également basé sur des prototypes, mais CoffeeScript (la version améliorée de JavaScript) choisit la méthode basée sur les classes. Et il en va de même pour Lua (basé sur des prototypes) et MoonScript (basé sur des classes). De plus, il y a de la classe dans ES 6. Donc…
Question 2) Cela suggère-t-il que si vous essayez d'améliorer un langage basé sur des prototypes, entre autres, vous devriez le changer en classe? Sinon, pourquoi est-il conçu de cette façon?
class
mot - clé à partir de la prochaine norme ECMAScript (ECMAScript 6). La prise en charge des classes en JavaScript est prévue depuis longtemps. Maintenant pour ce que c'est - les classes ne sont que du sucre syntaxique, un raisonnement plus facile sur le modèle pour les objets du même type. C'est comme ça en JS et c'est comme ça en Python et dans d'autres langages dynamiques.Réponses:
Le tout premier langage OO (même s'il ne s'appelait pas "OO"), Simula, n'avait pas d'héritage. L'héritage a été ajouté dans Simula-67, et il était basé sur les classes.
Vers la même époque, Alan Kay a commencé à travailler sur son idée d'un nouveau paradigme de programmation, qu'il a appelé plus tard "Object-Orientation". Il aimait vraiment l'héritage et voulait l'avoir dans sa langue, mais il détestait aussi vraiment les cours. Cependant, il ne pouvait pas trouver un moyen d'avoir l'héritage sans classes, et il a donc décidé qu'il n'aimait pas les classes plus qu'il n'aimait l'héritage et a conçu la première version de Smalltalk, Smalltalk-72 sans classes et donc sans héritage.
Quelques mois plus tard, Dan Ingalls a proposé une conception de classes, où les classes elles-mêmes étaient des objets, à savoir des instances de métaclasses. Alan Kay a trouvé cette conception un peu moins épouvantable que les anciennes, donc Smalltalk-74 a été conçu avec des classes et avec un héritage basé sur les classes.
Après Smalltalk-74, Alan Kay a estimé que Smalltalk allait dans la mauvaise direction et ne représentait pas vraiment ce qu'OO était, et il a proposé que l'équipe abandonne Smalltalk et recommence à zéro, mais il a été mis en minorité. Ainsi ont suivi Smalltalk-76, Smalltalk-80 (la première version de Smalltalk à être mise à la disposition des chercheurs), et enfin Smalltalk-80 V2.0 (la première version à être commercialisée, et la version qui est devenue la base d'ANSI Smalltalk) .
Étant donné que Simula-67 et Smalltalk-80 sont considérés comme les grands-parents de toutes les langues OO, presque toutes les langues qui ont suivi, ont copié aveuglément la conception des classes et l'héritage basé sur les classes. Quelques années plus tard, lorsque d'autres idées comme l'héritage basé sur des mixins au lieu de classes et la délégation basée sur des objets au lieu de l'héritage basé sur des classes ont fait surface, l'héritage basé sur une classe était déjà devenu trop ancré.
Chose intéressante, le langage actuel d'Alan Kay est basé sur la délégation de prototypes.
la source
De nombreux programmeurs préfèrent travailler avec des classes. C'est un concept très facile à comprendre qui est un bon modèle de processus de pensée humaine sur le monde (c'est-à-dire que nous relions instinctivement les objets réels au groupe abstrait d'éléments auxquels nous considérons qu'ils appartiennent, ce qui est une classe). . De plus, les classes facilitent le raisonnement sur les types d'objets: dans un langage basé sur les classes, l'application de principes comme la substitution de Liskov est plus simple que dans un langage où nous avons juste des objets qui peuvent avoir des méthodes différentes, ou dont le type peut même changer au moment de l'exécution , comme c'est le cas en JavaScript.
Notez que même en JavaScript, énormément de code utilise simplement la fonction prototype pour émuler des classes. C'est principalement parce que beaucoup de programmeurs préfèrent penser de cette façon.
Il existe également une autre raison pour laquelle les langages basés sur les classes sont préférés: il est plus facile de les compiler en code efficace. Les machines virtuelles JavaScript les plus efficaces créent efficacement des classes dynamiques pour représenter les types d'objets JavaScript à mesure que leurs méthodes et prototypes changent. Voir cette description de la mise en œuvre de V8 pour une justification de la raison pour laquelle cela est fait.
la source
GOTO
s et des registres signifie que simplement abandonner toutes les abstractions et écrire directement dans l'assemblage est presque certainement plus facile, et se retrouverait donc probablement avec le JIT devant passer moins de temps à compiler le code. C'est le travail d'un compilateur de prendre en charge les abstractions de niveau supérieur.J'ai entendu dire que sur de grands projets, où des équipes de personnes travaillent ensemble sur le même code, que les langages flexibles (où vous pouvez modifier les propriétés et les méthodes d'un objet pendant l'exécution) sont des libertés que les autres membres de l'équipe ne veulent pas de vous avoir.
Ils veulent savoir, lorsqu'ils traitent avec un objet, que l'objet agira exactement comme le plan le dit, et non d'une manière morphisée à laquelle un autre développeur ambitieux a décidé de le changer afin de terminer sa propre tâche.
Donc, la seule raison pour laquelle je peux concevoir que quelqu'un ne voudrait pas des flexibilités offertes par ces langages dynamiques impressionnants, c'est qu'il veut simplifier le développement d'équipe, le débogage et l'auto-documentation.
Personnellement, j'ai développé des applications dans les deux méthodologies et je fais avancer les choses beaucoup plus rapidement avec les langages dynamiques. Je n'utilise aucun de ces cadres conçus pour transformer à nouveau mon langage dynamique en un langage basé sur les classes. De telles choses sont une régression à mes goûts.
la source
Donc, ce qu'il dit ici, c'est que OO consiste à créer des boîtes noires qui répondent aux messages. D'une certaine manière, REST est le système OO ultime en ce qu'il utilise des verbes (c'est-à-dire un message) et des ressources (c'est-à-dire une boîte opaque qui contient des données).
Donc, la question de savoir pourquoi certains sont basés sur des classes et d'autres basés sur des prototypes ne tient pas compte du fait que cela n'a pas vraiment d'importance, ce sont tous deux de simples implémentations. Un système qui utilise uniquement la messagerie au lieu d'appels de méthode est tout aussi OO que les deux instances que vous mentionnez.
la source