Estamos acostumados a considerar a tipagem quanto a sua rigidez e associação.
Quanto à rigidez, algumas linguagens são mais fortes, outras mais fracas. Quanto mais rígido o sistema de tipos, ou seja, mais tipos, menor flexibilidade de conversão, mais forte é a linguagem. Quanto menos rígido, mais fraca é.
Quanto a associação, o tipo pode estar associado à variável – tipagem estática – ou ao dado – tipagem dinâmica.
No entanto há outro tipo de classificação que não se encaixa bem em nenhum dos sistemas comuns, a duck typing – alguns assumem que duck typing é tipagem dinâmica, mas nem sempre se encaixa bem nessa classificação.
A lógica da duck typing é: «se nada como um pato, anda como um pato e grasna como um pato, deve ser um pato».
Dito de outra forma: se um determinado objeto é capaz de responder corretamente a um grupo específico de mensagens, ele pode ser considerado instância de uma classe hipotética que atenda a tais especificações.
Java se aproxima um pouco de duck typing com o uso de interfaces, porém de forma não tão dinâmica e eficiente quanto duck typing, pois a classe da qual o objeto foi instanciado precisa declarar explicitamente que implementa uma determinada interface.
Em duck typing basta poder responder às mensagens desejadas, não é preciso declarar a implementação da interface. A máquina virtual que executar a linguagem precisa saber – ou ser programada para – determinar em tempo de execução se um objeto atende às especificações de interface.
Geralmente se confunde duck typing com tipagem dinâmica pois é possível fazer duck typing com linguagens de tipagem dinâmica.
Tradicionalmente se usa duck typing em Smalltalk, Python – com o uso de
assert
–, Boo, Groovy e, mais recentemente, Io, apesar de Steve de Korte preferir o termo elephant typing, mas no fundo a diferença é ínfima.Para quem quiser saber mais sobre duck typing, recomendo que leia o artigo elephant typing do Mergulhando no Caos, o artigo na Wikipédia, a página no Cunningham & Cunningham, Inc., a página do Boo, o Duck Typing Project para .NET, o artigo no Pythonologia e, claro, fazer a clássica busca no Google. =)
[]'s
Cacilhas, La Batalema