..


Liens sponsorisés

Polymorphisme et dactylographie de canard en Ruby

Article écrit par Alessio Saltarini
Page 1 sur 2

Le polymorphisme est une technique de programmation qui permet l'utilisation de certaines parties du code source, tout en restant inchangés, à générer des comportements d'exécution.

Créer code polymorphe a une signification particulière dans la programmation orientée objet: il s'agit de créer une taxonomie de toutes les classes qui implémentent une interface.

Donc, si, par exemple, mon interface définit une méthode "getAire", chaque classe qui implémentent cette interface aura une méthode "getAire": cela nous permet d'écrire des méthodes polymorphes, les méthodes qui peuvent changer leur exécution de l'algorithme Selon le type d'objet qui est passé comme argument.

Polymorphisme dans les langages de POO traditionnelle

En Java - mais le même est vrai pour C + + et une autre langue, Orienté Objet (OO) a terminé, on aura alors la main le cas de Ruby - par exemple:






 Interface IFormaGeometrica







 {



   



 nulle getArea ();







 }









 Triangle public class IFormaGeometrica







 {



 



 @ Override



 



 public int getArea ()



 



 {



  



 retour (* this.base this.altezza) / 2;



 



 }







 }



Dans ce cas, nous définissons l'interface de IFormaGeometrica qui stipule que tout objet qui "est" un getAire FormaGeometrica aura une méthode - comme la classe Triangle, qui est un FormaGeometrica, a sa propre implémentation de getAire, ce qui nous permet d'écrire un programme capable de calculer la surface de n'importe quelle forme géométrique, que ce soit est désormais présent dans le code et qui sera mis en œuvre dans l'avenir, sans modifier le code source d'origine.

En fait, si j'écris un calculateur de classe:






 publique Calculatrice classe finale







 {





 



 public static void main (String [] args)



 



 {



  



 Formulaires de collecte <IFormaGeometrica> =



          



 <IFormaGeometrica> New ArrayList ();





  



 forme.add (nouveau triangle ());



  



 forme.add (nouveau Carré ());



  



 forme.add (nouveau Pentagone ());





  



 pour (g IFormaGeometrica: forme)



  



 {



   



 System.out.println (g.calcolaArea ());



  



 }



 



 }







 }



Cela peut prendre en entrée une collection de formes géométriques, à condition que chaque objet dans la collection doit implémenter l'interface de IFormaGeometrica, et qui a essentiellement un getAire méthode. Cet exemple en Java est purement académique: en effet, probablement dans le constructeur de chaque classe, nous allons inclure des mesures d'entrée du côté de la forme géométrique, l'inclinaison, et ainsi de suite.

L'objectif est atteint: nous avons écrit une classe qui peut imprimer à la vidéo de la zone de toute forme géométrique. Je le répète: c'est le code qui a déjà été mis en œuvre (comme dans le cas du triangle), qui est mis en œuvre à l'avenir.

Pas seulement: si la mise en œuvre du calcul de la région du Triangle contenait un bug, je peux changer la classe sans avoir à réécrire le Calculateur Triangle classe. Peut-être qu'il a été déployé sur un serveur qui a besoin de redémarrer chaque changement: dans ce cas ne pas avoir à changer le code est un avantage majeur. Mais à part ça, il est toujours avantageux de limiter les parties de code qui «changement», car chaque changement apporte avec elle des bugs potentiels. Inversement, il est une bonne pratique de programmation de toujours savoir avec certitude quelles parties du code qui restent inchangés.

Qu'est-ce qui se passe «en coulisses» est que le compilateur fait en sorte que chaque objet dans le code polymorphique de la méthode principale de la Calculatrice de la classe implémente l'interface. De cette façon, disent-ils est une expression en utilisant la méthodologie de conception par contrat, «le contrat est respecté."

Si non, si ce n'est dans les «formes» ont un objet d'une classe qui nous ne serions pas en œuvre IFormaGeometrica une erreur au moment de la compilation, ou ne parvient pas à exécuter le programme, parce que le compilateur aurait remarquer l'erreur.

Le polymorphisme en Ruby

Mais qu'advient-il en Ruby? Et 'possible en Ruby, qui n'est pas compilé mais interprété langue, l'écriture des méthodes polymorphes?

Oui, il est certainement possible, mais il ya une profonde différence "philosophique" que les langages OO et compilé, ce qui

on pourrait le décrire. OO programmation en Java et classique, pour établir qu'un objet appartient à un type particulier d'objets (qui implémente une interface donnée) doivent expressément objet à dériver d'une classe parent: fondamentalement, vous devez utiliser les techniques de l'héritage (l'héritage par une classe, une classe abstraite ou une interface).

Ce serait comme dire: Pour déterminer s'il s'agit d'un canard en face de moi, je prends son ADN et l'étude en laboratoire pour voir si elle est de canard.

En Ruby vous utilisez le "test de canard" (test de canard) inventé par James Riley (voir http://en.wikipedia.org/wiki/Duck_typing ):

si elle marche comme un canard et cancane comme un canard, alors c'est un canard.

(Qui est d'ailleurs ce qui rend chacun de nous quand il voit un canard).

Qu'est-ce que cela signifie? Cela signifie que dans Ruby, et plus généralement dans des langages de script orienté objet, ainsi que Python et Perl, pas besoin de spécifier l'interface, ni des relations d'héritage explicite entre les classes.

L'interprète tout simplement la «confiance» que le programmeur, les étapes du procédé où un objet polymorphe qui «devrait avoir» d'une certaine façon, nous avons réellement l'.

Dans la même catégorie ...
E-Learning
Ruby et Ruby on Rails (Cours) Ruby et Ruby on Rails (Cours)
Créer des applications logicielles et Web avec Ruby et RoR. A partir de 39 €.
Liens sponsorisés