You are currently browsing the category archive for the ‘Ruby’ category.

Olá pessoal,

Hoje vou falar sobre um conceito muito interessante, presente em Ruby e em algumas outras linguagens dinâmicas que consiste em ter suas classes “abertas”. É um recurso que facilita a vida do desenvolvedor/analista/arquiteto na hora de modelar e definir as classes/interfaces do sistema.

O que são classes abertas?

Primeiro vamos entender como funciona o mecanismo de classes do Java, por exemplo, que é uma linguagem que não possui essa característica. Temos a tão conhecida classe Integer. Ela foi definida por um fulano da Sun com sua lista de métodos e atributos e servia muito bem para a realidade da época em que foi criada. Mas hoje eu preciso de um jeito de descobrir se o número que esse objeto representa é par ou ímpar. Ah, podemos criar um IntegerUtils com um método estático isEven(Integer n1, Integer n2). Certo? Ah até podemos, mas cheira a procedural orientado a objeto… não parece tão agradável assim. Outra solução: podemos estender a classe, algo como MyInteger extends Integer. Mas espere, Integer (e todas as classes Wrappers) não são final? Ah então vamos usar a composição! No final das contas ficaria assim:

package main;

public class MyInteger {
private Integer number;

public MyInteger(Integer number){
this.number = number;
}

public boolean isEven(){
return number % 2 == 0;
}
}

Hum, não sei se ficou tão bom assim… toda vez que quisermos usar esse método teremos que encapsular o Integer dentro de MyInteger. Isso seria um pouco incomodo.

A solução

Sabemos que na hora da modelagem das classes é muito complicado para o profissional definir quais elementos são relevantes e devem estar presentes nos objetos. Como as necessidades mudam, talvez o que seja necessário hoje não atenda as necessidades de amanhã, mas não temos como prever o QUE irá mudar. Seria bom se pudéssemos abrir e adicionar métodos as nossas classes sempre que quisermos, mas nem sempre é possível, vide exemplo da classe Integer.

class Integer
def is_even
return self % 2 ==0
end
end

i = 50
puts i.is_even

Este código mostra como podemos estender a linguagem de uma maneira mais elegante, sem a necessidade da criação de classes utilitárias lotadas de métodos estáticos (StringUtils da apache, Collections do pacote java.util, classe Math e por aí vai) . Esse conceito, junto com a possibilidade trabalhar com blocos de código sendo objetos, pode ser muito bem aproveitada na criação de estruturas arquiteturais reutilizáveis, APIs, frameworks, etc…

Espero que tenham gostado,  até a próxima!

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.