O Que É Duck Typing? Julgando Objetos pelo Comportamento
Duck typing significa que a adequação de um objeto é julgada pelos métodos e propriedades que ele de fato tem, não por sua classe declarada: se anda e grasna como um pato, trate-o como um.
Comum em linguagens dinâmicas como Python e Ruby, o duck typing se importa com comportamento em vez de identidade. O código não pergunta "este objeto é do tipo Pato?" Ele apenas chama os métodos de que precisa e confia que o objeto os tenha. Isso torna o código flexível e frouxamente acoplado, mas move a rede de segurança inteiramente para a execução e para os seus testes.
A ideia por trás do duck typing
Em vez de verificar o tipo declarado de um objeto, o duck typing verifica se ele suporta as operações de que você precisa. Qualquer objeto com os métodos certos funciona, independentemente de sua classe ou herança. A interface é implícita: é o que quer que o código por acaso use.
Por que o duck typing é conveniente
- Acoplamento frouxo: o código depende de comportamento, não de tipos concretos.
- Substituição fácil, inclusive com test doubles e mocks.
- Menos boilerplate do que declarar interfaces formais.
- Polimorfismo natural sem uma hierarquia de herança.
Os riscos
Como nada verifica o contrato de antemão, passar um objeto ao qual falta um método falha apenas em tempo de execução, quando aquele método é chamado. A interface implícita também não é documentada, então é fácil quebrá-la sem perceber.
Duck typing e testes
Sem um compilador verificando que os objetos se encaixam, os testes carregam o fardo de confirmar que os métodos certos existem e se comportam corretamente. Testes minuciosos são como o código com duck typing permanece confiável, já que os erros de outra forma surgem apenas em produção.
Um exemplo rápido
Uma função que chama obj.read() funciona com um arquivo, um stream de rede ou um objeto falso em memória, qualquer coisa com um método read, sem se importar com seus tipos.
Duck typing em CI
Um erro de método ausente por uma incompatibilidade de duck typing é um bug determinístico que falha de forma idêntica em toda execução, então repetir não ajuda. A Latchkey repete automaticamente apenas falhas transitórias de infraestrutura, deixando erros genuínos de duck typing visíveis para que sejam corrigidos.
Principais conclusões
- Duck typing julga objetos pelos métodos que eles têm, não pelo seu tipo declarado.
- É flexível e frouxamente acoplado, mas adia toda a verificação para a execução e os testes.
- Erros de método ausente são bugs determinísticos, não falhas transitórias a repetir.