La programmation orientée prototype… Encore plus de liberté

maxime bernard
ELP-2018
Published in
4 min readJan 26, 2019

La programmation orientée prototype ou Prototype-based programming, est un style de programmation orientée objet. Mais qu’est-ce que la programmation orientée objet ? Il s’agit d’un paradigme de programmation dans lequel différentes entités appelées objets échangent des informations. Je vous invite à lire l’article de Raphaelle Grenier sur le sujet.

Un brin d’histoire

Le premier langage à prototypes fut Self. Son développement commença en 1986 dans les laboratoires de Xerox PARC. Après la création du premier compilateur fonctionnel de Self en 1987, l’objectif de l’équipe devint de faire un système complet pour Self : une machine virtuelle. En 1990 la première version disponible au public apparue, l’équipe rejoint les rangs de Sun Microsystems pour continuer à développeur leur langage. De nombreuses versions sont apparues dans les années suivantes, avec une portance sur Mac OS et Linux. Le langage est toujours amélioré par des équipes de développement indépendantes. Self a inspiré de nombreux autres langages orientés prototype, notamment JavaScript, créé par Sun Microsystems en 1995 et largement répandu sur le web aujourd’hui.

En programmation orientée prototype il n’y a pas de classe explicite.

Il existe deux façon de créer de nouveaux objets : ex nihilo, à partir de rien, ou en clonant un objet existant. En programmation basée sur des classes, les objets sont créés à partir d’une fonction constructeur, qui réserve un espace mémoire pour les méthodes et propriétés de l’objet et renvoie une référence à cet espace mémoire.

Dans beaucoup de langages orientés prototype il existe un objet root (Object en JavaScript par exemple), qui est le prototype par défaut de tous les autres objets créés et qui comporte des méthodes basiques comme toString().

En clonant un objet, on créé un nouvel objet à partir d’un objet existant, son prototype. Le nouvel objet contient toutes les qualités de l’original, mais peut alors être modifié. Dans certains systèmes l’objet fils garde un lien avec son prototype et des changements dans ce dernier induisent des changements dans le fils.

Exemple de programmation orientée prototype.

En comparaison, avec la programmation à classes on créerait une classe fruit qui serait étendue par une classe banane pour créer les objets voulus. En programmation orientée prototypes, un objet fruit contiendrait toutes les propriétés d’un fruit, puis un autre objet banane serait cloné à partir de ce fruit, et modifié pour apporter les propriétés propres à la banane. Ensuite chaque objet banane serait cloné à partir de cette banane générique.

Les adeptes de la programmation objets basée sur les classes critiquent la programmation orientée prototype.

Ces critiques sont souvent focalisées sur la correction, la prévisibilité, la sûreté et l’efficacité du langage. En effet, les classes sont supposées assurer une garantie que leurs instances vont s’exécuter selon un schéma précis.

Concernant l’efficacité, le fait de déclarer des classes simplifie grandement l’optimisation de la compilation. C’est pourquoi, durant le développement de Self, beaucoup de temps a été investi dans la recherche de techniques de compilation et d’interprétation pour améliorer les performances de ce type de langage face aux langages de classes.

Le langage orienté prototype souffre aussi de son apparition récente, les développeurs ne sont pas tous familier de ce langage. Toutefois, l’explosion de l’utilisation du JavaScript sur le web tend à démocratiser l’utilisation et l’apprentissage de ce type de programmation.

Conclusion

La programmation orientée prototypes présente de nombreux avantages: un héritage dynamique, une utilisation de la mémoire différente de celle d’un objet à classe, et surtout une grande liberté dans la programmation qui permet au développeur de se focaliser d’abord sur l’exécution de quelques objets avant de classifier ces objets plus classiquement. Douglas Crockford, un développeur américain connu pour son investissement dans le développement de JavaScript, dit:

« Pas besoin de classes qui créent plein d’objets similaires… Les objets héritent d’autres objets. Qu’est-ce qui pourrait être plus orienté-objet que ça ? »

--

--