Oi,
Depois de uns quantos aninhos a trabalhar em Ruby, reparei que regularmente refiro "funções" e "métodos" na mesma frase para o mesmo tipo de entidades, ás vezes para a mesma. Não está totalmente incorrecto, no entanto, dada a natureza OO-kamikaze do Ruby, pode levar a interpretações incongruentes das minhas palavras. Para os mais esquecidos, o que é uma função e o que é um método? Ora, uma função é no fundo um procedimento, uma sequência de instruções identificadas por um nome (falemos de funções anónimas numa outra altura) e reconhecidas pelo sistema. Um método é uma função. O termo vem do mundo Java, que baptizou muitos termos associados a programação orientada a objectos, e designa uma função definida no corpo de uma classe, logo uma função de qualquer instância desta. Dito de outra forma, um método tem um contexto específico, e uma função teria um contexto global.
Então onde se encontra o erro de utilizar a denominação "função" em Ruby? Bom, primeiro vamos ver a documentação: http://www.ruby-doc.org/core-1.9.3/ Podem procurar, mas não vão encontrar uma designação para "função". Mas encontram lá a classe Method, certo? Pois é, então vamos abrir a caixa de Pandora: Ruby é uma linguagem orientada a objectos pura. Que significa pura? Tudo é um objecto. Tudo. Tudo herda da classe Object. As próprias classes são objectos. Instâncias da class Class. Que por sua vez também é uma instância. O ambiente global? Também é um objecto! (irb: self.class) E é aqui que reside o segredo da inexistência de funções: se o próprio ambiente global é um objecto, então qualquer "função" definida nesse ambiente será um método do ambiente global. Sempre método. Nunca outra coisa. Pode até ser um procedimento. Mas nunca uma função. Então façam-me um favor: não façam como eu. Não misturem conceitos. Apesar de métodos serem funções intrinsecamente, existe uma diferença residual que em determinado contexto pode ser a diferença entre conceitos mal-absorvidos e bases de programação orientada a objectos fundamentadas.
Metodologizem em paz,
Chuck
Sem comentários:
Enviar um comentário