Question

Pourquoi est basée sur la classe OO si populaire au lieu de OO à base de prototype? Est-ce qu'ils enseignent ces derniers dans les écoles? Bien que Javascript est basé sur un prototype, la plupart des gens utilisent la plupart du temps fonctionnellement ou par des cadres qui tentent d'imiter un système de classe.

Je sais que Sun a eu quelques recherches sur Self - est-il une autre source de connaissances sur oo à base de prototype? de préférence quelque chose qui est accessible pour l'auto appris.

J'ai trouvé un livre qui contient des articles publiés: Programmation Prototype-Based: Concepts, langues et applications

Quelqu'un at-il lu?

-

Alors je lui ai donné la prime pour la réponse qui m'a donné le plus. Pourtant, je ne suis pas vraiment satisfait. J'aurais aimé entendre beaucoup plus de réponses techical. Peut-être que je ne me suis pas bien expliquer.

Était-ce utile?

La solution

L'avantage de l'héritage prototypal est qu'il permet potentiellement metaprogramming de fantaisie d'une manière simple parce que la chaîne prototype est facile à manipuler. Ceci est un avantage plutôt académique parce métaprogrammation est la mauvaise réponse 99% du temps. À titre d'exemple, vous pourriez avoir une couche de manipulation de données de style Observer valeur-clé Javascript avec une connexion DSL spéciale qui est passée de manière transparente entre un support de SQLite locale en mode hors connexion et un magasin de serveur basé sur REST en ligne via swapping prototype. Je ne suis pas sûr que c'est la meilleure façon de le faire, mais il est le meilleur que je peux venir avec cette fin. Ce n'est pas le genre de chose que vous voulez généralement faire dans le code du projet puisque ce genre de indirection est un enfer pour déboguer une fois que vous commencez à obtenir, il se passe plusieurs couches, mais ce n'est pas mal quand vous le garder dans une bibliothèque.

Un autre avantage moins utile est qu'il vous permet de concevoir votre propre système de classe. Je dis moins utile parce que plus ou moins toutes les bibliothèques javascript ont leur propre approche légèrement incompatible avec la façon dont « classes » sont mis ensemble.

Il y a beaucoup de personnes ayant répondu qui mixent le modèle d'héritage avec les langues mises en œuvre dans ce modèle. Le fait que le javascript est dynamique et faiblement typé et donc difficile à l'outil n'a rien à voir avec elle étant une langue prototypal.

Autres conseils

Si vous cherchez quelqu'un pour souligner les avantages / inconvénients de chacun pour expliquer leur popularité, je pense que vous tomber pour une erreur qui est pour une raison très courante dans la technologie - que la popularité a quelque chose à faire avec une certaine mesure absolue de la qualité.

La vérité est beaucoup plus fade - OO à base de classe est populaire parce que Java utilise OO classique, et Sun a dépensé des millions de dollars et un temps très long bâtiment de la popularité de Java - assurer que les gens savent qu'il est utilisé avec succès dans les entreprises, enseigné largement dans les universités et sur les tests AP du secondaire.

prototypal / OO classiques sont juste différentes façons d'organiser vos idées. Vous pouvez mettre en œuvre une ou l'autre dans les langues qui ne supportent pas nativement ( Python et Java viennent à l'esprit, et JavaScript sur la autre côté).

Dans OO classique, vous définissez une hiérarchie abstraite des classes pour vos objets, puis effectivement travailler avec les instances de ces classes. Dans l'héritage prototypique, vous créez une hiérarchie d'instances d'objets. Bien que j'imagine que ce pourrait être un peu hérétique dans les deux camps, je ne vois pas une raison que vous ne pouviez pas mélanger les deux ...

Je ne connais pas les raisons exactes de cela, mais voici mes raisons

Je pense que ce soutiennent est le même que dynamique vs statique, une classe est la définition statique de l'objet, qui peut être utilisé facilement savoir à quoi vous attendre d'un objet, il contribue également à l'outillage des langues d'avoir un soutien adéquat IntelliSense et de la documentation parce que vous pouvez facilement savoir quels sont les différents membres et méthodes de l'objet, une autre chose est le paradigme différent d'avoir la possibilité de déclarer les membres privés de la classe qui ne montre pas sur l'objet, cela ne peut être fait dans le paradigme du prototype.

Le paradigme prototype est agréable, mais il n'a pas la capacité de fournir des informations sur les méthodes et les membres de l'objet, ce qui rend plus difficile l'outillage, et il est aussi plus judicieux pour la programmation de typage dynamique.

Cette question m'a fait je intriguée si suis retourné et lu certains des documents originaux sur le concept. Il semble avoir commencé au milieu des années 1980 dans le monde Smalltalk, mais a fini par devenir l'un des principaux fondateurs de Self . Beaucoup plus tard Javascript adopté aussi.

L'argument mis en avant dans les journaux est qu'il est plus facile d'apprendre. Il n'y a vraiment aucun avantage technique proposé autre que l'apprentissage. Les documents expliquent comment tout cela est tout aussi expressif comme langue de classes, mais beaucoup plus facile à apprendre. Les gens pensent naturellement sur les choses de manière concrète plutôt que dans l'abstrait. Nous pensons à l'éléphant que nous avons vu au zoo, pas un « éléphant » générique. Quand nous voyons d'autres éléphants, nous les classons comme différences par rapport au premier. Un langage basé sur un prototype facilite cette réflexion. Pensez-y comme la programmation par différence.

Est-ce une raison suffisante pour l'utiliser dans une langue? Peut-être. Au cours des 25 années écoulées depuis l'idée a commencé à percoler, je dirais que les concepts abstraits comme basés sur les classes n'a pas été trop difficile pour la plupart des gens à apprendre. D'autre part peut-être il y a un besoin d'un langage de programmation cols bleus (comme Javascript) qui est plus facile et cela peut être un moyen d'y parvenir.

Si vous êtes intéressé, vous pouvez commencer par cet article sur l'auto.

Je ne veux vraiment pas écrire un autre article sur l'héritage prototypal nouveau donc je vais juste vous liez à mes précédents articles. Rappelez-vous, ils sont vraiment longue mais vaut la lecture:

  1. Avantages de l'héritage prototypal plus classique?
  2. Pourquoi prototypal Questions héritage

Je pense que la différence est dans la dynamique de puissance (prototypé) langue que vous donne. Javascript, même comme LISP, donne un pouvoir quasi illimité à un programmeur. Cette puissance est limitée que par la responsabilité du programmeur et le niveau de son confiance en soi. Donc, la discussion est aussi vieux que il est - comme le typage statique vs sans type. Si vous considérez votre pouvoir de programmation et l'auto-discipline sont assez forts - aller pour le style prototypé

.

Pour paraphraser un célèbre dicton:

Le talent fait ce qu'il peut (lire: base de classe), le génie fait ce qu'il veut (lire: basé sur un prototype).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top