Oi,

- 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

Responder a