Dans les années 80-90 le langage Smalltalk a eu son heure de gloire. C’est un langage orienté objet (tout objet), avec un ramasse miette, une gestion d’exceptions. Ce langage a la particularité d’être dynamique. Cela veut dire que l’on peut modifier la structure des classes de manière programmatique. On peut par exemple ajouter des méthodes à une classe dans un bout de code complètement externe à la classe. Cela va même largement au delà, on peut aussi modifier la syntaxe du langage simplement en écrivant du code.
Entre autres à cause de ses propriétés dynamiques, le langage smalltalk a perdu de la vitesse face à Java. En effet, comment assurer la bonne exécution d’un composant si l’on peut redéfinir les méthodes, le langage et donc la manière dont va être exécuté notre composant. Les éléments de sécurité du modèle objet Java ont beaucoup participé à sa popularité.
Aujourd’hui, les langages javascript et ruby sont deux langages qui gagnent en popularité. Ces deux langages sont dynamiques, on peut redéfinir, ajouter des méthodes aux classes de manière externe. Dans le cadre de javascript, un exemple concret des problèmes que cela peut poser est la bibliotèque prototype. Cette bibliotèque est à la base de nombreux frameworks Ajax et ajoute des comportements aux objets de base de Javascript, notamment une nouvelle méthode à la classe Object dont héritent tous les objets du langage. Cela a pour conséquence qu’en ajoutant cette bibliotèque à votre page html, vous faites planter le framework de validation de formulaire de Struts.
Comme exemple de syntaxe, l’ajout de la méthode à la classe objet par prototype se fait comme cela :
Object.extend = function(destination, source) {
for (property in source) {
destination[property] = source[property];
}
return destination;
}
Un langage de programmation est défini entre autres par :
Dans la mesure ou un langage permet au programmeur de modifier ses classes de base, on peut considérer finalement qu’il y a autant de langages que d’applications modifiant les classes de base.
Ceci dit, ce dynamisme offre beaucoup de souplesse et de puissance aux langages, ce qui fait en partie leur attrait. L’idée n’est pas de dire ruby et javascript sont de mauvais langages (loin de moi cette idée) mais de pointer du doigt des problématiques que l’on a déjà rencontré dans le passé et que l’on va certainement croiser à nouveau.
Et la communauté Ruby commence à se dire la même chose...
http://avdi.org/devblog/2008/02/23/why-monkeypatching-is-destroying-ruby/