Java x Ruby: Diferenças ao programar

Felipe Brigatto
SkyHub Labs
Published in
2 min readMay 2, 2017

Um dos primeiros contatos na SkyHub foi com Ruby on Rails, migrar de linguagem é sempre uma experiência agradável. Claramente cada um tem seu próprio vício de escrever, então vou compartilhar os meus primeiros contatos com Ruby e como comecei a programar “melhor” no ponto de vista Rubista.

A principal diferença é não precisar inicializar objetos sempre, podemos usar a estrutura para criar. No Java há essa facilidade apenas com Array. Exemplo:

// Java
int[] vector_ = new int[5];
int[] vector_pre_defined = {1,2,3,4,5};
// Ruby
vector = []
vector_pre_defined = [1,2,3,4,5]

Estruturalmente parecem iguais, mas podemos incrementar as posições facilmente no Ruby:

vector << 1 # [1]
vector << [2,3] # [1,[2,3]]

Em Java, teríamos que criar um ArrayList para ter quase o mesmo comportamento em Ruby:

ArrayList<Integer> vector = new ArrayLista<Integer>;
vector.add(1);

Com isso temos a liberdade de quando e quanto inserir novos elementos no Array.

Para um exemplo prático, temos um JSON de pedido e nele contém `shipping_method: nil` que precisamos preencher em `values` o frete de acordo com 2 regras:

  • Se transportadora está vazio, adicione método do frete se estiver preenchido, caso contrário adicione String vazia
  • Se transportadora e método estão preenchidos, acrescente a concatenação entre eles
  • Caso contrário, adiciona String vazia

Seguindo a risca, teremos em ruby:

if not order.shipping_carrier
values << order.shipping_method || ""
elsif order.shipping_carrier && order.shipping_method
values << order.shipping_carrier + " - " + order.shipping_method
else
values << ""
end

Em Java seria:

if !order.getShippingCarrier() {
if order.getShippingMethod() value = order.shipping_method;
else value = “”;
} else if order.shipping_carrier && order.shipping_method {
value = order.shipping_carrier + " - " + order.shipping_method;
} else
value = "";
end

Seguindo uma lógica sequencial, esse código é nem um pouco fácil de ler, e nem usamos as vantagens da linguagem Ruby!

Para melhorar, temos a função compact de Array que me retorna um Array sem os valores nulos, então:

[order.shipping_method, order.shipping_carrier].compact
# [“Method”] # caso shipping_carrier não esteja preenchido
# [“Carrier”] # caso shipping_method não esteja preenchido
# [“Method”,”Carrier”] # caso ambos estejam preenchidos
# [] # caso nenhum esteja preenchido

Com isso garantimos ter sempre a informação útil, mesmo se estiver nula teremos um array vazio. que podemos converter para uma String vazia. Então com nosso novo array, podemos juntar seus valores usando o método join.

Finalizando, temos, o que satisfaz nossas condições:

values << [order.shipping_method, order.shipping_carrier].compact.join(" - ")

Este foi meu primeiro contato com refactoring, vindo de Java e usando Ruby e foi uma quebra de paradigmas, pois há maneiras de programar que aprende-se com a prática, code review e pair programming. Há mais diferenças entre essas linguagens e vale ressaltar também as diferenças de Java7 com Java8, que tendem a seguir estruturas de linguagens mais semânticas.

Referências

--

--

Felipe Brigatto
SkyHub Labs

Desenvolvedor Ruby on Rails, Elixir on Phoenix e PHP Magento @ SkyHub