jueves, 28 de marzo de 2013

getVarName y para que quisiera saber el nombre de la variable?

Ojo lo que van a leer, no es real! No me tomen tan en serio. Se me ocurrió una idea bastante loca, pero va la tiro; a ver que opinión recibo. Porque algún lenguaje o uno nuevo crea o tiene un método que nos indique el nombre de la variable que usamos?

Onda:

String nombre = getVarName(pepe)
print(nombre) // Aca imprime pepe

Es una idea revolucionaria, pero para que la puedo llegar a usar?

Supongamos los mapas, que necesito una key para referenciar un valor bueno podría hacer algo así:

String variable1 = "hola mundo"
miMapa.put(getVarName(variable1), variable1)

Entonces cuando quiero saber el valor puedo hacer:

print(miMapa.get(getVarName(variable1))) // Acá imprimiría "hola mundo"

Esto a pesar que suene loco es bastante fácil de implementar con las macros del lenguaje. Se acuerdan de las macros? Las macros son instrucciones que le damos al compilador. Si nos fijamos en la wiki nos dira:

"Con el fin de evitar al programador la tediosa repetición de partes idénticas de un programa, los ensambladores y compiladores cuentan con macroprocesadores que permiten definir una abreviatura para representar una parte de un programa y utilizar esa abreviatura cuantas veces sea necesario. Para utilizar una macro, primero hay que declararla. En la declaración se establece el nombre que se le dará a la macro y el conjunto de instrucciones que representará."

Por ejemplo le podemos decir "che mira antes de compilar pasa por todo el código y donde veas getVarName(nombreDeUnaVariable) vos pone el string "nombreDeUnaVariable". Y listo!

Ahora llega el momento en que flasheo, que tal si se puede implementar orientado a objeto?? En este hipotético caso no se me ocurre una implementación. Pero supongamos que se pueda, puede ser un método de Object todos heredar de Object y listo. Lo bueno es que lo puedo sobrescribir. Por ejemplo quiero llenar otro mapa con objetos de la clase persona (supongamos) entonces puedo hacer esto.

class Persona
      Integer id

      String getVarName()
               String varName = super.getVarName()
               return varName + " " + id
end

En fin con esto puedo hacer algo así:

List personas = getPersonasFromDB();
for (Persona persona in personas)
      mapaDePersonas.put(persona.getVarName(), persona)

En realidad podemos modificar el mapa para que haga mapaDePersonas.put(persona) y ya nos tome el nombre de la variable...

for (String p in mapaDePersonas.keys())
     print(p) // aca imprime persona 1, persona 2, etc...

Y lo mejor de todo es que podria hacer:

 class Persona
      String getVarName()
               String varName = super.getVarName()
               return varName.changeCar("_", " ").upperFirstLetter() + " es mi nombre!"
end

piñon_fijo = Persona.new()

print(piñon_fijo) // y aca imprime "Piñon fijo es mi nombre!"

Que les parece la idea?? Saben si a alguien se le ocurrió antes? se les ocurre otro uso? Les gusto el ejemplo de Piñon Fijo??