- Como posso ter cada classe tendo um LDAP_map diferente, sem ter que
necessariamente definir em LDAPEntry#initialize e/ou accessors nas
classes "filhas"?
- self.send("#{mapped}=", algumacoisa) ficou muito feio, como eu
poderia fazer isso de maneira mais decente?
Bom, primeira coisa, eu entendo a sua busca por um mapeamento OO,
querendo que a classe funcione dessa maneira. Mas na sua busca por
solução, você já achou uma ou duas alternativas, como usando o
initialize do objeto.
Se você quer copiar alguma coisa do Rails, então é bastante
metaprogramação. E metaprogramação é "feia" e mais difícil de acompanhar
mesmo. Eu mesmo evito usar muita metaprogramação, mas eu uso sim,
só que dos males o menor, portanto eu evito complicar...
Pense em alternativas ao uso de @@ (variáveis de classe), porque deve simplificar
mais em Ruby. Se você não puder evitar, então com metaprogramação
se resolve, usando um Hash para separar os conteúdos de cada classe.
module MyFirstProgram
class A
end
class B < A
end
end
p MyFirstProgram::A.to_s
p MyFirstProgram::B.to_s
====== Resultado:
"MyFirstProgram::A"
"MyFirstProgram::B"
Agora um exemplo completo que fiz:
module MyFirstProgram
class LDAPEntry
@@LDAP_map = { }
def LDAPEntry.ldap_map
@@LDAP_map[self] || {}
end
def map_fields_from_entry(ldap_entry)
for field, mapped in self.class.ldap_map
self.send("#{mapped}=", ldap_entry[field])
end
end
end
class AnyObject < LDAPEntry
@@LDAP_map[self] = {"userPassword" => "password" }
attr_accessor :password
end
class OtherObject < LDAPEntry
@@LDAP_map[self] = {"userName" => "username" }
attr_accessor :username
end
end
sample_entry = { 'userName' => 'James', 'userPassword' => 'Brown' }
p MyFirstProgram::LDAPEntry.ldap_map
p MyFirstProgram::AnyObject.ldap_map
p MyFirstProgram::OtherObject.ldap_map
ao = MyFirstProgram::AnyObject.new
ao.map_fields_from_entry(sample_entry)
p ao.password
oo = MyFirstProgram::OtherObject.new
oo.map_fields_from_entry(sample_entry)
p oo.username
Esse código que usei tem bem pouca metaprogramação, então para mim
ele ainda é bom. Mas tem código do Rails que vai bem além disso. :-)
Sds,
Joao
_______________________________________________ Ruby-l mailing list [email protected] http://www.listas.unicamp.br/mailman/listinfo/ruby-l
