Voltar

Open Source e comportamento

Open source

Essa semana eu fiz uma contribuição em uma gem open-source, a u-case, que é feita pelo Rodrigo Serradura, do grupo do Ruby Brasil (@serradura). Ele tem um grupo da gem no telegram e nesse grupo ele pede feedbacks. Procurando ajudar iniciantes ele abriu um issue e pediu para alguém fazer no grupo do telegram. Eu topei ajudar e implementei a feature que ele documentou. Aqui o PR.

Foi uma experiência muito boa, pois apesar de simples, tive mais uma ideia do processo de trabalhar com projetos de software, implementando uma feature nova. Primeiro fiz os testes, depois a implementação, tive certeza que os testes estavam passando e depois atualizei a documentação. Após isso o Serradura fez o Review do código comigo no telegram. Apesar de ele estar viajando e não puder me dizer as últimas alterações que ele quer antes de dar merge, daqui a pouco vou ter minha primeira contribuição open source mergeada!

A implementação

A implementação, foi bem simples, mas foi um exercício muito bom de Ruby, de orientação a objetos.

O que fiz, como descrito na issue, foi implementar 3 métodos na classe Micro::Case::Result, para fazer ela ficar mais parecida como uma hash, apesar de não ser uma. Você poderia me perguntar qual a necessidade de reimplementar os métodos da classe Hash em outra classe, por que não simplesmente usar a classe Hash? Na minha visão, essa é uma das belezas da programação orientada a objetos e uma prática muito boa: utilizar interfaces que já existem (como a Hash) e extender sua funcionalidade com novos comportamentos (métodos), que podem ser muito úteis.

Novos comportamentos

No caso da gem u-case, Micro::Case::Result é o resultado de um processo (Micro::Case). Um dos seus comportamentos adicionais é o seguinte: se result for uma instância de Micro::Case::Result, você pode utilizar: result.success? para saber se houve sucesso no processo. Se sim, pode ser utilizado result[:key] para acessar um dos dados do resultado, como se fosse uma hash normal. Esse foi um pequeno exemplo, pois essa classe tem vários outros comportamentos e métodos interessantes, além desse.

Outra classe famosa que faz “quack” como uma hash é a HashWithIndifferentAccess, da gem ActiveSupport. Apesar de parecer uma hash, seu comportamento extra é que não há diferença entre "key" e :key na hora de acessar uma chave da Hash. Exemplo:

require "active_support/core_ext/hash/indifferent_access"

hash = {}
hash[:key] = 5
hash["key"] = 1

hash[:key]
# => 5

hash["key"]
# => 1

hash_mod = HashWithIndifferentAccess.new
hash_mod["key"] = 8

hash_mod[:key]
# => 8

Logo, vemos que na HashWithIndifferentAccess não há “diferença no acesso” seja usando símbolo ou string para definir a chave. Curiosidade: também pode ser usado o método Hash#with_indifferent_access para transformar uma Hash normal em um objeto da classe HashWithIndifferentAccess, lembrando que essa classe só está disponível com a gem ActiveSupport, que faz parte do Rails, mas pode ser usado sem ele.

require "active_support/core_ext/hash/indifferent_access"

hash = {comida: "arroz", bebida: "suco"}.with_indifferent_access

hash.class
# => HashWithIndifferentAccess

hash[:comida]
# => "arroz"
hash["comida"]
# => "arroz"