Le canard tape-t-il un sous-ensemble du polymorphisme

17

Du polymorphisme sur WIkipedia

En informatique, le polymorphisme est une fonctionnalité du langage de programmation qui permet de gérer les valeurs de différents types de données à l'aide d'une interface uniforme.

De la saisie de canard sur Wikipedia

En programmation informatique avec des langages de programmation orientés objet, la frappe de canard est un style de frappe dynamique dans lequel l'ensemble actuel de méthodes et de propriétés d'un objet détermine la sémantique valide, plutôt que son héritage d'une classe particulière ou la mise en œuvre d'une interface spécifique.

Mon interprétation est que sur la base du typage canard, les méthodes / propriétés des objets déterminent la sémantique valide. Cela signifie que la forme actuelle de l'objet détermine l'interface qu'il maintient.

Du polymorphisme, vous pouvez dire qu'une fonction est polymorphe si elle accepte plusieurs types de données différents tant qu'ils maintiennent une interface.

Donc, si une fonction peut esquiver le type, elle peut accepter plusieurs types de données différents et les utiliser tant que ces types de données ont les bonnes méthodes / propriétés et maintiennent ainsi l'interface.

(L'utilisation du terme interface n'est pas conçue comme une construction de code mais plutôt comme une construction descriptive et documentée)

  • Quelle est la relation correcte entre le typage de canard et le polymorphisme?
  • Si un langage peut être de type canard, cela signifie-t-il qu'il peut faire du polymorphisme?
Raynos
la source
1
Je ne sais pas ce que vous cherchez dans une réponse. Vous avez défini les deux avec précision, vous avez donc autant de réponse définitive que possible. Décider si le typage de canard «compte» comme polymorphisme est plus ou moins une question philosophique, ou peut-être une question de terminologie si vous l'entendez ainsi. Alors que recherchez-vous dans une réponse?
psr
@psr Je disais essentiellement "voici comment je l'interprète. Je me trompe? Ai-je raison? Y a-t-il des universitaires réputés qui le disent d'une manière ou d'une autre. Y a-t-il des articles sur le sujet?" Fondamentalement en détail, autre que «le typage du canard est une implémentation / sous-ensemble du polymorphisme», que dire de plus de la relation?
Raynos
pour autant que je sache, l' homographie fait que le canard tape autre chose qu'une interface uniforme => pas un polymorphisme, ou du moins pas dans le sens de la façon dont Wikipedia le définit. Par exemple door.close()ettiger.close()
moucher
4
Le typage de canard est un cas de polymorphisme ad hoc . Vous pensez trop à cela.
yannis

Réponses:

16

Je dis que le polymorphisme est un trait générique, qui peut être mis en œuvre de plusieurs façons:

  • héritage basé sur une classe.
  • objets basés sur des prototypes (avec ou sans héritage)
  • dactylographie de canard
  • conformité des interfaces (comme cela est fait par les interfaces de Go et implicitement sur les modèles C ++)

chacun d'eux permet au programmeur d'utiliser un code unique avec différents types, donc tous incarnent le concept de polymorphisme.

Javier
la source
7

Je pense que:

Le typage du canard et le polymorphisme sont tous deux des moyens d'indirection / abstraction. Le polymorphisme est un concept fondé sur les types et le typage tandis que le typage du canard est fondé sur des contrats.

Avec le polymorphisme, il est important de savoir ce qu'est la CHOSE et non comment elle se comporte (son comportement peut être la conséquence de ce qu'elle est).

En tapant du canard, il est important de savoir comment une chose se comporte. Le typage de canard est plus lié au concept des objets en tant qu'acteurs qui échangent des messages, plutôt que des objets qui ont des propriétés définies.

Wojciech Soczyński
la source
2
C'est faux. Le polymorphisme est un immense parapluie couvrant beaucoup de choses. En particulier, il couvre la dactylographie du canard. Ainsi, le typage du canard est une forme de polymorphisme.
Thomas Eding
Je ne suis pas d'accord. L'héritage traditionnel avec des méthodes comportementales a les mêmes caractéristiques. C'est juste plus sûr pour le type en étant explicite quant au comportement qu'un objet est garanti de présenter (ce qui n'exclut pas d'autres comportements!)
marstato
6

La réponse est OUI .

Duck Typing est un cas particulier de typage dynamique , et même si le typage dynamique en soi ne peut pas être directement considéré comme un polymorphisme (car c'est la propriété du langage d'effectuer une vérification de type au moment de l'exécution plutôt qu'au moment de la compilation), les techniques qui habituellement sous-tendent le typage dynamique, cette liaison tardive et cette répartition dynamique sont caractéristiques du polymorphisme .

Alexander Galkin
la source
Le problème avec l'article de Wikipédia et le nombre de personnes qui utilisent le terme de nos jours est qu'il ne définit pas ce que la frappe de canard signifiait lorsque je l'ai vu pour la première fois (à savoir, une forme de frappe), mais plutôt, pouvoir simplement invoquer des méthodes et lancer un erreur d'exécution lorsqu'elles ne sont pas définies. Ce n'est pas de la dactylographie mais plutôt le manque de dactylographie, comme l'explique Eric Lippert .
reinierpost
1

Le typage de canard n'est pas tout à fait un sous-ensemble du polymorphisme, car le polymorphisme nécessite une explication, qui est perdue dans le typage de canard. Le typage canard a donc la chance de "mettre en œuvre" une "interface" non pas parce que cela a un sens sémantique mais parce que vous avez la même signature. Si le typage du canard était un sous-ensemble du polymorphisme, il aurait toutes les propriétés du polymorphisme, y compris la déclaration explicite.

Le typage canard n'est pas non plus vraiment une implémentation du polymorphisme, il fait partie d'un système de types différent. Habituellement, vous associez la frappe de canard à un langage dynamique qui va de l'avant et transmet un message à un objet sans savoir si l'objet peut le gérer - s'il le peut, il a effectivement réussi le test de frappe de canard. Habituellement, vous pensez que le polymorphisme est implémenté au moment de la compilation en configurant vtables (et itables si les interfaces sont différentes des classes). Mais il existe BEAUCOUP de langues et de nombreuses façons de mettre en œuvre ces fonctionnalités.

Dans une certaine mesure, c'est une question philosophique. Pouvez-vous considérer le typage canard comme des interfaces qui sont automatiquement déclarées implicitement? Je ne peux penser à aucune raison qui soit fausse , exactement, mais je ne pense pas que ce soit probablement la façon la plus productive de voir les choses. Je pense que le typage de canard et les interfaces sont deux caractéristiques couramment rencontrées dans les systèmes de type du langage de programmation, les deux ont des façons de se comporter assez similaires, et les deux sont importants pour les programmeurs à comprendre.

psr
la source
6
"le polymorphisme demande de l'explicitation" où est-ce dit? l'héritage basé sur les classes n'est qu'une forme de polymorphisme, pas la seule.
Javier
Et en continuant le commentaire de @ Javier, qu'en est-il du polymorphisme ad hoc ?
yannis
@YannisRizos - Le problème avec la réponse à une question comme celle-ci est qu'il y a tellement de langues et tellement de terminologie que quelqu'un pourrait vous taquiner quoi que vous disiez. Je comprends pourquoi "polymorphisme ad hoc" a le mot "polymorphisme" dans le nom, mais je dirais que c'est autre chose que ce que l'OP signifie par "polymorphisme".
psr
@Javier - Toutes les méthodes que vous avez énumérées nécessitent une explication, sauf la saisie de canard.
psr
@psr En fait, je me fiche de ce que OP voulait dire par "polymorphisme". Je ne pense pas que quiconque devrait s'en soucier, c'est un concept scientifique avec une définition très simple, je ne pense pas que nous devrions répondre sur la base de nos propres interprétations ou de ce que nous pouvons penser que c'est l'interprétation des PO. Surtout l'interprétation des PO, car il le demande par défaut, il n'est pas sûr de son interprétation. Je ne suis pas d'accord, c'est une question philosophique, la question telle qu'énoncée était scientifique avec une réponse simple: oui, le typage de canard est une forme de polymorphisme ad hoc, un sous-ensemble de polymorphisme.
yannis
1

Il semble presque naturel de dire "Oui, si foo a un typage canard, foo a un polymorphisme". Mais je ne peux pas dire cela à 100%, dans le sens où il est peut-être possible de trouver des exemples artificiels d'un tel système qui a la typographie du canard ("peut-il charlatan && peut-il flotter sur l'eau ==> c'est un Duck ") tout en n'ayant pas de polymorphisme (" foo, quack! "Échoue), mais ils seraient vraiment artificiels et dans un monde réel, je dirais" Oui, si le typage de canard est présent, le polymorphisme doit également être présent ".

Personnellement, je vois le typage de canard comme "un polymorphisme bien fait". Ce que je veux dire par là, les choses qui existent dans un monde de typage de canard n'ont pas besoin d'avoir de types explicites et leur comportement (polymorphe = "même accès, résultat différent") est la seule chose qui compte. Dans d'autres implémentations du polymorphisme, il est contraint aux types / interfaces / héritage, il est donc "polymorphisme implémenté et contraint" et non pas un "polymorphisme en soi".

herby
la source
0

Les langages de programmation à typage statique permettent une vérification des erreurs plus tôt, une meilleure application des styles de programmation disciplinés et la génération de code objet plus efficace que les langages dans lesquels toutes les vérifications de cohérence des types sont effectuées au moment de l'exécution.

(B. Pierce et amis)

Donc, comme vous pouvez le constater, à cet égard, la frappe de canard est une frappe dynamique qui fonctionne vraiment autrement.

Il existe une méthode pour déterminer le type qui se rapporte au polymorphisme, par exemple, qui rend le code plus flexible, mais le typage canard est un autre problème dans ces cas.

Dans les détails, il y a le calcul lambda typé et le calcul lambda non typé qui aident à déterminer la propriété du calcul et d'un calcul.

Je vois également que des choses comme la frappe de canard peuvent aider si nous voulons simplement obtenir un résultat rapide, mais à d'autres occasions, je pense également que la nature dynamique le rend plus adaptable aux besoins, donc je peux calculer plus rapidement. Je suppose que c'est juste pour dire, mon cher, que si je sais déjà vraiment ce que je veux calculer, la frappe est la meilleure, mais pourquoi est-ce que je sais ce que je veux? Hehehe ...

C'est mes cinq cents et je suppose que cela peut faire un sujet de recherche intéressant.

Edd
la source