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 editar

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 editar

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 editar

Em Python editar

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