Duck Typing

22 Apr 2011 . category: article . Comments
#conceitos de linguagem de programacao #python #duck typing

Hoje em dia encontramos um quantidade enorme de tutoriais, howtos e livros prometendo ensinar a programar em uma determinada linguagem de uma forma rápida, sem preocupar em realmente mostrar como as coisas funcionam. Eu vejo muitos programadores que se dizem experientes e que acabam não conhecendo os ‘porques’ das coisas. Programadores que têm a ousadia de falarem: “Copiei igualzinho, por quê não funciona?”.

Muitas vezes por falta de conhecimento não aproveitamos todos os recursos que uma uma tecnologia nos oferece. Há um texto que gosto muito do Peter Norvig, Teach Yourself Programming in Ten Years, que fala sobre isso. Neste blog quero escrever assuntos como esses, conceitos que normalmente são desconhecidos pela grande massa, mas que usados de forma correta ajudam muito na implementação.

O Conceito

O nome deste conceito(‘não há tradução para o termo em português’) refere-se ao teste do pato, que diz:

If it looks like a duck, swims like a duck, and quacks like a duck, then it probably is a duck.

Trazendo este teste para o mundo das linguagens de programação podemos dizer que: não precisamos esperar que um determinado objeto precise ser de uma classe especifica, mas sim esperar que esses objetos tenham comportamentos(métodos) iguais. Podemos aplicar este conceito em qualquer linguagem de programação orientada a objetos e não somente em linguagens com tipagem dinâmica, como muitos acreditam. Em Java, por exemplo, podemos implementar este conceito através do uso de interfaces. Mas de qualquer forma, é muito mais simples utiliza-la em linguagens como Python e Ruby que utilizam a tipagem dinâmica.

Exemplo

Pensemos no seguinte caso: Queremos criar uma lista com filme e livros contendo titulo, sinopse e data de lançamento. O exemplo bem simples abaixo pode exemplificar o conceito apresentado.

class Livro():
    def __init__(self,titulo,lancamento,autor):
        self.titulo = titulo
        self.lancamento = lancamento
        self.autor = autor

class Filme():
    def __init__(self,titulo,lancamento,diretor):
        self.titulo = titulo
        self.lancamento = lancamento
        self.diretor = diretor

def linha(midia):
    print "%s %s"%(midia.titulo, midia.lancamento)

filme = Filme('A vida de Brian',1979,'Terry Jones')
livro = Livro('O Rei do Inverno',1995,'Bernard Cornwell')
for midia in [filme,livro]:
    linha(midia)

Cuidados

O conceito é simples de ser entendido porém muito útil para o desenvolvimento de aplicações. Porém temos que ter alguns cuidados. Em linguagens com tipagem dinâmicas não há o processo de compilação e verificação dos tipos, por isso testes devem ser bem escritos e considerando as possíveis entradas dos métodos onde este conceito é utilizado fortemente, para evitar possíveis erros em tempo de execução.


Me

Tenho estudado esse mundo mágico da programação desde 2005. Já consegui sustentar minha família usando Ruby, Java, Python, C++ e Javascript. O resto tenho usado para diversão ou aprendizado.