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.http://c2.com/cgi/wiki?DuckTyping 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.
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:
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.
Categoria:Programação orientada a objetos Categoria:Teoria dos tipos