“doc” (Col. : Science Sup 17x24) — 2007/7/19 — 18:18 — page 243 — #253
i
i
i
i
i
i
i
i
5.5 Le polymorphisme
243
d’évaluer la fonction de nouveau. Dans l’exemple Sqr, c’est facile à implémenter
parce qu’il est clair que le résultat est utilisé trois fois. S’il n’est pas clair par inspection
du code que le résultat est nécessaire, alors l’évaluation paresseuse peut être utilisée
pour implémenter le passage par besoin directement (voir exercices, section 5.7).
Le passage par besoin repose exactement sur le même concept que l’évaluation
paresseuse. Le terme « passage par besoin » est plus souvent utilisé dans un langage
avec l’état, où le résultat de l’évaluation peut être le nom d’une cellule (une variable
affectable). Le passage par nom est l’évaluation paresseuse sans mémoisation. Le
résultat de l’évaluation de la fonction n’est pas conservé. La fonction sera donc appelée
chaque fois que l’on aura besoin du résultat.
Discussion
Quel est le « meilleur » de tous ces mécanismes ? Cette question a fait couler beaucoup d’encre (voir par exemple [62]). Le but de l’approche du langage noyau est de
factoriser les langages de programmation dans un petit ensemble de concepts significatifs pour le programmeur. Pour le passage de paramètres, cela justifie l’utilisation
du passage par référence comme mécanisme primitif. À la différence des autres, le
passage par référence ne dépend pas des concepts supplémentaires comme les cellules
ou les valeurs procédurales. Il a une sémantique formelle simple et il a une implémentation efficace. Par contre, cela ne veut pas dire que le passage par référence est
toujours le bon mécanisme pour les programmes. D’autres mécanismes de passage de
paramètres peuvent être codés en combinant le passage par référence avec les cellules
et les valeurs procédurales. Beaucoup de langages offrent ces mécanismes comme des
abstractions linguistiques.
5.5 LE POLYMORPHISME
Dans le langage courant, le polymorphisme est la capacité d’une entité à prendre
plusieurs formes. Dans le contexte de l’abstraction de données, on dit qu’une opération
est polymorphe si elle fonctionne correctement pour des arguments de plusieurs types.
Le polymorphisme est important dans l’organisation de programmes pour permettre
la maintenance aisée. En particulier, il permet à un programme de répartir correctement
des responsabilités entre ses composants [11]. Une responsabilité ne doit pas être
étalée sur plusieurs composants. Elle devrait plutôt être concentrée dans un seul
endroit.
Considérez l’analogie suivante : un patient consulte un médecin spécialiste. Le
patient demande au médecin de le guérir. Selon la spécialité du médecin, ses actions
peuvent être très différentes (comme faire une ordonnance ou préconiser une chirurgie).
Dans un programme informatique, l’objet patient appelle l’opération gu´ erison de
l’objet médecin. Le polymorphisme signifie que l’objet médecin peut avoir plusieurs
© Dunod – La photocopie non autorisée est un délit
i
i
i
i
i
i
i
i
5.5 Le polymorphisme
243
d’évaluer la fonction de nouveau. Dans l’exemple Sqr, c’est facile à implémenter
parce qu’il est clair que le résultat est utilisé trois fois. S’il n’est pas clair par inspection
du code que le résultat est nécessaire, alors l’évaluation paresseuse peut être utilisée
pour implémenter le passage par besoin directement (voir exercices, section 5.7).
Le passage par besoin repose exactement sur le même concept que l’évaluation
paresseuse. Le terme « passage par besoin » est plus souvent utilisé dans un langage
avec l’état, où le résultat de l’évaluation peut être le nom d’une cellule (une variable
affectable). Le passage par nom est l’évaluation paresseuse sans mémoisation. Le
résultat de l’évaluation de la fonction n’est pas conservé. La fonction sera donc appelée
chaque fois que l’on aura besoin du résultat.
Discussion
Quel est le « meilleur » de tous ces mécanismes ? Cette question a fait couler beaucoup d’encre (voir par exemple [62]). Le but de l’approche du langage noyau est de
factoriser les langages de programmation dans un petit ensemble de concepts significatifs pour le programmeur. Pour le passage de paramètres, cela justifie l’utilisation
du passage par référence comme mécanisme primitif. À la différence des autres, le
passage par référence ne dépend pas des concepts supplémentaires comme les cellules
ou les valeurs procédurales. Il a une sémantique formelle simple et il a une implémentation efficace. Par contre, cela ne veut pas dire que le passage par référence est
toujours le bon mécanisme pour les programmes. D’autres mécanismes de passage de
paramètres peuvent être codés en combinant le passage par référence avec les cellules
et les valeurs procédurales. Beaucoup de langages offrent ces mécanismes comme des
abstractions linguistiques.
5.5 LE POLYMORPHISME
Dans le langage courant, le polymorphisme est la capacité d’une entité à prendre
plusieurs formes. Dans le contexte de l’abstraction de données, on dit qu’une opération
est polymorphe si elle fonctionne correctement pour des arguments de plusieurs types.
Le polymorphisme est important dans l’organisation de programmes pour permettre
la maintenance aisée. En particulier, il permet à un programme de répartir correctement
des responsabilités entre ses composants [11]. Une responsabilité ne doit pas être
étalée sur plusieurs composants. Elle devrait plutôt être concentrée dans un seul
endroit.
Considérez l’analogie suivante : un patient consulte un médecin spécialiste. Le
patient demande au médecin de le guérir. Selon la spécialité du médecin, ses actions
peuvent être très différentes (comme faire une ordonnance ou préconiser une chirurgie).
Dans un programme informatique, l’objet patient appelle l’opération gu´ erison de
l’objet médecin. Le polymorphisme signifie que l’objet médecin peut avoir plusieurs
© Dunod – La photocopie non autorisée est un délit
