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…)