Lorsque j'ai commencé à programmer Javascript après avoir principalement traité de la programmation orientée objet dans le contexte de langages basés sur des classes, je ne savais pas trop pourquoi la programmation orientée objet basée sur un prototype serait jamais préférée à la programmation orientée objet.
- Quels sont les avantages structurels de l'utilisation de la POO basée sur un prototype, le cas échéant? (Par exemple, est-ce que nous nous attendions à ce que la mémoire soit plus rapide ou moins intensive dans certaines applications?)
- Quels sont les avantages du point de vue d'un codeur? (Par exemple, est-il plus facile de coder certaines applications ou d'étendre le code d'autres personnes en utilisant le prototypage?)
Ne considérez pas cette question comme une question sur Javascript en particulier (qui a eu de nombreux défauts au cours des années et qui n’ont aucun rapport avec le prototypage). Au lieu de cela, examinez-le dans le contexte des avantages théoriques du prototypage par rapport aux classes.
Je vous remercie.
design
object-oriented
language-agnostic
Deets McGeets
la source
la source
Réponses:
J'avais beaucoup d'expérience des deux approches lors de la rédaction d'un jeu de rôle en Java. A l'origine, j'avais écrit tout le jeu en utilisant la POO basée sur les classes, mais j'ai finalement réalisé que c'était une mauvaise approche (elle devenait impossible à maintenir à mesure que la hiérarchie des classes se développait). J'ai donc converti l'ensemble de la base de code en code basé sur un prototype. Le résultat était bien meilleur et plus facile à gérer.
Code source ici si vous êtes intéressé ( Tyrant - Java Roguelike )
Voici les principaux avantages:
Voici les principaux inconvénients:
Enfin quelques notes d'implémentation:
la source
Le principal avantage de la POO basée sur un prototype est que les objets et les "classes" peuvent être étendus au moment de l'exécution.
Dans la POO basée sur les classes, il existe plusieurs fonctionnalités intéressantes. Malheureusement, cela dépend du langage de programmation.
Object Pascal (Delphi), VB.Net & C # ont un moyen très direct d'utiliser les propriétés (à ne pas confondre avec les champs) et les méthodes d'accès aux propriétés, tandis que les propriétés en Java & C ++ sont accessibles par les méthodes. Et PHP a un mélange des deux, appelé "méthodes magiques".
Il existe quelques classes de typage dynamiques, bien que les langages OO de la classe principale aient un typage statique. Je pense que le typage statique avec Class OO est très utile car il permet une fonctionnalité appelée Object Introspection qui permet de créer ces IDE et de développer des pages Web, visuellement et rapidement.
la source
Je suis d'accord avec @umlcat. L'extension de classe est un avantage majeur. Par exemple, supposons que vous souhaitiez ajouter davantage de fonctionnalités à une classe de chaînes sur une longue période. En C ++, vous pouvez le faire en poursuivant l'héritage des générations précédentes de classes de chaînes. Le problème avec cette approche est que chaque génération devient essentiellement un type différent, ce qui peut entraîner une réécriture massive des bases de code existantes. Avec l'héritage prototype, vous «attachez» simplement une nouvelle méthode à la classe de base d'origine ..., pas de construction massive de classes héritées ni de relations d'héritage partout. J'aimerais que C ++ propose un mécanisme d'extension similaire dans leur nouveau standard. Mais leur comité semble être dirigé par des personnes qui souhaitent ajouter des fonctionnalités accrocheuses et populaires.
la source
std::string
déjà trop de membres qui doivent être des algorithmes indépendants ou au moins des non-membres non amis. Et de toute façon, de nouvelles fonctions membres peuvent être ajoutées sans modifier la disposition en mémoire si vous pouvez modifier la classe d'origine.