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
editarConsidere 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
editarAlex 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
editarEm Python
editarDuck 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
- ↑ http://c2.com/cgi/wiki?DuckTyping
- ↑ Heim, Michael (2007). Exploring Indiana Highways. [S.l.]: Exploring America's Highway. 68 páginas. ISBN 978-0-9744358-3-1