Coisas que você nunca quis fazer com Ruby
Métodos privados semelhantes a Java/C++ em Ruby
Fazia um tempo que eu não postava uma das bizarrices em Ruby, então vamos lá: esses dias, no grupo de usuários de Ruby, surgiu uma discussão muito boa sobre métodos privados e alto acoplamento. A idéia é mais ou menos assim: em Java (ou C++), ao definir um método público que chama um método privado, se você reimplementar aquele método privado, os métodos públicos herdados não são afetados. Um exemplo vale mais que mil palavras, então:
#include <stdio.h>
class Example {
public:
void imprimir() {
hello();
}
private:
void hello() {
printf("Hello, world!\n");
}
};
class Ex2: public Example {
private:
void hello() {
printf("Hello, from Ex2\n");
}
};
int main(void) {
Ex2 e;
e.imprimir(); //Essa linha imprime "Hello, world!"
}
Já no código Ruby equivalente:
class Example
def imprimir()
hello
end
private
def hello
puts "Hello, world!"
end
end
class Ex2 < Example
private
def hello
puts "Hello, from Ex2"
end
end
Ex2.new.imprimir #Imprime "Hello, from Ex2"
Ou seja, reimplementar métodos privados numa subclasse pode quebrar métodos da superclasse. Embora eu considere isso uma peculiaridade da linguagem e não como um problema de acoplamento, implementação falha, ou qualquer coisa (e até, mais pra frente, pretendo escrever um post sobre o assunto de diferenças entre linguagens de programação além da sintaxe), a discussão inteira me deu uma idéia: como implementar esse comportamento em Ruby?
(more…)