Ruby
O Método “Extend” e Seus Usos
Provavelmente muita gente conhece o método “extend”, usado principalmente em classes para adicionar métodos, tais como:
module Nameable
def set_name(name)
@name = name
end
end
class MyClass
extend Nameable
set_name "Foo Bar"
end
Claro que há pessoas que fazem verdadeiras aberrações, tipo um “module” que define o callback “included” que chama um “extend”, tipo essa situação:
module Nameable
def self.included(klass)
klass.extend Nameable::ClassMethods
end
module ClassMethods
def set_name(name)
@name = name
end
end
end
class MyClass
include Nameable
set_name "Foo Bar"
end
Mas vamos ignorar esse tipo de coisa e pensar em outras formas de usar o “extend”. Digamos que temos uma classe como a seguir:
class Authenticator
def login(username, password)
if User.find_by_username_and_password(username, password)
return true
else
return false
end
end
Ok, temos uma regra para autenticar (aviso: não use isso em produção, o código prevê que os usuários tem suas senhas gravadas no banco sem criptografia nenhuma). Digamos, agora, que em um determinado cliente, esse código só não é o suficiente: o cliente quer que, antes de autenticar no banco, se autentique no sistema
Uma solução é usar monkey-patch. Nesse caso, teríamos um código em outro lugar que redefiniria a classe e adicionaria novos métodos, tipo:
(more…)