For faster navigation, this Iframe is preloading the Wikiwand page for Duck typing.

Duck typing

Em programação de computadores com linguagens de programação orientadas a objetos, duck typing (em português literal tipagem pato) é um estilo de tipagem em que os métodos e propriedades de um objeto determinam a semântica válida, em vez de sua herança de uma classe particular ou implementação de uma interface explicita.[1] O nome do conceito refere-se ao teste do pato, atribuído à James Whitcomb Riley (ver a história abaixo), que pode ser expressa como se segue:

Quando eu vejo um pássaro que caminha como um pato, nada como um pato e grasna como um pato, eu chamo aquele pássaro de pato.[2]

Exemplos do conceito

Considere o seguinte pseudocódigo para uma linguagem com suporte duck typing:

função calcular(a, b, c) => retornar (a+b)*c
exemplo1 = calcular (1, 2, 3)
exemplo2 = calcular ([1, 2, 3], [4, 5, 6], 2)
exemplo3 = calcular ('maçãs ', 'e laranjas, ', 3)
imprimir para_string exemplo1
imprimir para_string exemplo2
imprimir para_string exemplo3

No exemplo, cada vez que a função calcular é chamada, objetos sem herança relacionada podem ser usados (números, listas e strings). Enquanto os objetos suportarem os métodos "+" e "*", a operação terá sucesso. Se traduzido para o Ruby ou Python, por exemplo, o resultado do código seria:

9
[1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]
maçãs e laranjas, maçãs e laranjas, maçãs e laranjas,

História

Alex Martelli fez um uso precoce (2000) do termo em uma mensagem para o grupo de notícias comp.lang.python:

Em outras palavras, não verifique se ele É um pato: verifique se ele GRASNA como um pato, ANDA como um pato, etc, etc, dependendo exatamente de qual subconjunto de comportamento semelhante a um pato você precisa para jogar com seus jogos de linguagem.

Implementações

Em Python

Duck typing é muito usado em Python, com o exemplo canônico sendo classes semelhantes à arquivo (por exemplo, cStringIO permite que uma string Python seja tratada como um arquivo). De acordo com o princípio de EAFP, em vez de verificar para ver se algum objeto semelhante à Duck supostamente possui um método quack() (usando if hasattr(mallard, "quack"): ...) normalmente é preferível encapsular a tentativa de quack com uma manipulação de exceção apropriada:

try:
    mallard.quack()
except (AttributeError, TypeError):
    print("mallard can't quack()")

ou, um uso mais comum do princípio é apenas deixar a exceção "borbulhar", isto é, deixar a exceção ser lançada e deixar qualquer função ou método chamado do código em questão lidar com ela (ou se nenhum lida com ele, deixar a exceção ser lançada para o usuário). Isto dá um melhor feedback em uma saída ruim e evita o mascareamento de bugs.

Referências

  1. http://c2.com/cgi/wiki?DuckTyping
  2. Heim, Michael (2007). Exploring Indiana Highways. [S.l.]: Exploring America's Highway. 68 páginas. ISBN 978-0-9744358-3-1 
{{bottomLinkPreText}} {{bottomLinkText}}
Duck typing
Listen to this article

This browser is not supported by Wikiwand :(
Wikiwand requires a browser with modern capabilities in order to provide you with the best reading experience.
Please download and use one of the following browsers:

This article was just edited, click to reload
This article has been deleted on Wikipedia (Why?)

Back to homepage

Please click Add in the dialog above
Please click Allow in the top-left corner,
then click Install Now in the dialog
Please click Open in the download dialog,
then click Install
Please click the "Downloads" icon in the Safari toolbar, open the first download in the list,
then click Install
{{::$root.activation.text}}

Install Wikiwand

Install on Chrome Install on Firefox
Don't forget to rate us

Tell your friends about Wikiwand!

Gmail Facebook Twitter Link

Enjoying Wikiwand?

Tell your friends and spread the love:
Share on Gmail Share on Facebook Share on Twitter Share on Buffer

Our magic isn't perfect

You can help our automatic cover photo selection by reporting an unsuitable photo.

This photo is visually disturbing This photo is not a good choice

Thank you for helping!


Your input will affect cover photo selection, along with input from other users.