Trate o ruby como a linguagem dinâmica que ele é
Criado em: 10/04/2013
O Ruby é uma linguagem de tipagem dinâmica, e para pessoas que vem de linguagens de tipagem estática tem que mudar sua mentalidade para trabalhar com uma linguagem dinâmica, veremos o que fazer e o que não fazer e como podemos lidar com o que as linguagens dinâmicas tem de ruim, afinal nem tudo são flores.
Não fazemos checagem de tipos
Pode assustar um pouco a idéia de não fazermos nenhuma checagem de tipo, quando definimos um método que aceita parâmetros, definimos apenas o nome dos parâmetros e não o seu tipo:
Veja que não definimos nenhum tipo para o parâmetro name
. Assim como não precisamos definir o tipo de nossos atributos de classe. E graças a esta não checagem de tipo que podemos usar uma das coisas mais legais da linguagem o Duck Typing, que veremos a seguir.
Não fazemos interfaces
Imagine que em nosso sistema tenhamos 2 entidades Post e AwesomePost, que é um post em destaque. Agora sempre queremos garantir que ambos tenham definidos os atributos title
e content
.
Talvez tenderíamos a usar uma interface, no entanto o ruby não tem suporte a interfaces, mas podemos simular uma fazendo algo como:
Que poderia ser utilizado:
O código acima funciona, no entanto não é um bom código ruby.
O problema não é nas classes Post
e AwesomePost
e sim na classe BasePost
que não faz absolutamente nada. BasePost
existe apenas como uma tentativa de mantermos uma interface padrão para as classes Post
e AwesomePost
ou qualquer outra classe de Post
que venhamos a criar.
No entanto é um esforço em vão pois como vimos anteriormente, não fazemos checagem de tipos na chamada de um método, sendo assim pouco importa a hierarquia de classes de um tal objeto, desde que ele saiba responder a tal método e é neste ponto que chegamos ao Duck Typing.
Abrace o Duck Typing
Utilizando o Duck Typing, primeiro podemos remover a classe BasePost
e remover a herança de Post
e AwesomePost
afinal ambas as classes implementam os mesmos métodos ficando assim:
Agora imagine que tenhamos um decorator responsável por gerar um HTML para a exibição destas classes Post
s sua implementação seria algo como:
E como já foi dito anteriormente que não fazemos checagem de tipos, seria aceito ambas as classes veja abaixo:
E assim utilizamos o poder do Duck Typing, afinal:
When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.
Fazendo isso observamos a verdadeira diminuição de código de que se houve falar ao comparar linguagens estáticas com dinâmicas, e isto não está na remoção de int
, string
etc. na declaração de variáveis e sim na não declaração de classes abstratas e interfaces que nunca escreveremos.
Sério, não tenha medo do Duck Typing
As vezes podemos encontrar código que tenta forçar uma tipagem estática, algo como assim:
Por favor não faça isso. Pois assim só estará perdendo:
- Destrói o baixo acoplamento da tipagem dinâmica
- Aumenta bastante o código, no entanto melhora um pouco apenas a garantia de que vai funcionar.
Como pode ver utilizando o ruby como a linguagem dinâmica que ela é, diminuímos bastante a complexidade de nossos códigos.
Mas como garantimos que tudo simplesmente funcione
Até agora vimos que não precisamos declarar tipo, mas e se por um acaso eu passar um tipo inválido para um método? Então temos as seguintes dicas para lidar com isso.
Utilize nome descritivos
Abaixo criamos um método tags que recebe “n”, pode ser claro para alguns que ele retorne as tags de um post limitando pela quantidade declarada em “n”.
No entanto podemos fazer melhor:
Como pode ver agora ficou mais fácil de saber que o valor é um inteiro. A dica é escreva nomes para serem lidos por humanos.
Como eu sei qual tipo(s) o parâmetro de um método espera
Além da dica de nome descritivo, que já ajuda bastante. Escreva testes automatizados, com testes saberá exatamente quais tipos de objetos são aceitos por um método ou não.
Conclusão
- Não crie mas complexidade do que precisa
- aproveite o que a linguagem dinâmica tem para oferecer
- abrace o Duck Typing
- lembre-se que as classes não precisam de herança para compartilharem a mesma interface, só precisam implementar os mesmos métodos
- não faça checagem de tipos sem sentido, lembre-se abrace o Duck Typing
- Escreva código para humanos
Este post foi baseado no Cap. 8 do livro Eloquent Ruby, espero escrever mais alguns posts baseado em conteúdo do livro, recomendo fortemente a compra do mesmo.
Comentários
Comentários powered by Disqus