Duck Typing aplicado no Scala

Nem me lembro a última vez que eu passei aqui… Estava aqui num projeto pessoal e achei um caso bem legal para o famoso Duck Typing. 

A minha situação é a seguinte. Tenho um método que tem que atualizar a localização de um objeto no banco. A assinatura do método tinha que ser mais ou menos assim:

   def update(crawledUrl: String, latitude: Double; longitude: Double)

O problema aqui é que eu quero receber um objeto que representa a localização. Normalmente, seria necessário criar uma classe para representar esse objeto. O que levaria o código a ficar assim:

  def update(crawledUrl: String, localizacao:MinhaLocalizaco) = {
         println(localizacao.getLatitude)
         println(localizacao.getLongitude)
  }

Só que na ponta onde eu invoco o método, preciso transformar a localização que vem da biblioteca para o meu objeto do tipo MinhaLocalizacao.  Na verdade não tem nenhum problema, só que demos uma volta meio grande para recebe-lo. Nesses cenários, ter uma linguagem a mais na sua caixa de ferramenta pode deixar o código mais flexível. Aqui está uma outra opção para a implementação do mesmo método.

  def update(crawledUrl: String, location: { def getLatitude: Double; def getLongitude: Double })

Perceba que eu pouco me importo com o tipo de objeto, o que eu defino é uma interface que exige os métodos getLatitude getLongitude. Não forço ninguém a criar nada, posso receber objeto de qualquer tipo, bem mais tranquilo. Isso é o que a galera chama no Scala de Structural TypingNo mundo de linguagens de script é chamado de Duck Typing. A invocação do método, que por sinal está em uma classe Java, segue abaixo:

   //getLocation retorna um objeto da biblioteca...
   dao.update(id, location.getGeometry().getLocation())

O único detalhe que saímos perdendo aqui, é que como a chamada do método está num método escrito em Java, não vai ter a checagem do tipo sendo passado. Então não rola uma garantia de compilação, o que é um ponto bem legal dessa abordagem no Scala. Se a chamada estivesse num código Scala, só seria permitido passar algum objeto que respondesse para os métodos necessários.

Bom, era isso. Já chegaram a usar Duck Typing nas outras linguagens? O que achou dessa solução? Poste aqui para o bem e para o mal.

Advertisements