Duck typing
En programmation informatique, le duck typing (traduction : typage canard) est un style de typage dynamique de certains langages de programmation orientés objet. En duck typing, la sémantique d'un objet, c'est-à-dire son type dans le contexte où il est utilisé, est déterminée par l'ensemble de ses méthodes et de ses attributs, et non, comme il l'est habituellement, par un type défini et nommé explicitement par le programmeur dans les systèmes à typage nominatif. C'est l'équivalent du typage structurel pour les langages à typage statique, comme OCaml[1].
Le nom du système est une référence au test du canard (attribué à James Whitcomb Riley) : « Si je vois un oiseau qui vole comme un canard, cancane comme un canard, et nage comme un canard, alors j'appelle cet oiseau un canard »[2].
Ainsi, un objet d'une classe A donnée peut être considéré pour certaines opérations comme un objet d'une autre classe B, totalement différente (il n'est justement pas nécessaire qu'il y ait héritage entre les deux classes), à condition que les méthodes et les attributs de B qui sont utilisés dans les opérations soient aussi présents dans A.
En typage canard, le programmeur se concentre sur les caractéristiques des objets qui sont réellement utilisées plutôt que sur le type de l'objet lui-même. Par exemple, dans un langage typé nominativement, il peut créer une fonction qui prend en paramètre un objet de type Canard et utiliser ses méthodes marcher et cancaner. Dans un langage canard-typé, la fonction équivalente accepterait en paramètre un objet de n'importe quel type et appellerait ses méthodes marcher et cancaner. S'il s'avère à l'exécution que l'objet ne possède pas les méthodes qui sont appelées, la fonction lève une erreur d'exécution.
Exemple
function calcule(a, b, c) => return (a+b)*c
a = calcule (1, 2, 3)
b = calcule ('pommes ', 'et oranges, ', 3)
print a
print b
Dans cet exemple, des objets sans relation d'héritage peuvent être utilisés (nombres, listes et chaines de caractères). Tant qu'ils gèrent les méthodes « + » et « * », l'opération fonctionne. Traduit dans des langages comme Ruby ou Python, la sortie serait :
9 "pommes et oranges, pommes et oranges, pommes et oranges, "
Références
- . (en) (en) « Duck typing vs Structural Subtyping », sur http://lambda-the-ultimate.org.
- (en) Exploring Indiana Highways : Trip Trivia, Exploring America's Highway, , 317 p. (ISBN 978-0-9744358-3-1, lire en ligne)