Default methods en AjSharp

Published on Author lopezLeave a comment

En estos días, agregué lo que llamo default methods en AjSharp, mi intérprete de código abierto. ¿Qué es un default method en la jerga de AjSharp? Me inspiré por el mensaje #doesnotunderstand que está en los objetos Smalltalk. AjSharp es un intérprete dinámico, así que podemos invocar cualquier método, aún uno no existente. Si el método no está definido, pero hay un default method declarado, entonces éste es invocado, recibiendo dos parámetors, el nombre del método original, y sus argumentos.

Primer ejemplo:

object Incrementor
{
  function Increment(n) 
  {
    return n+1;
  }
}
class Proxy
{
  var Object;
  
  function Proxy(obj)
  {
    this.Object = obj;
  }
  
  default function InvokeMethod(name, parameters)
  {
    return this.Object.Invoke(name,parameters);
  }
}
proxy = new Proxy(Incrementor);
result = proxy.Increment(3); // result == 4

La palabra clave default marca el default method (estoy aún reluctante a usa una palabra clave para esto, pero no tengo todavía otra idea para implementarlo). Notemos que esta implementación de proxy solamente funciona encapsulando instancias de DynamicObject, que tienen un méetodo .Invoke. Podría extenderlo para que maneje objetos CLR también.

Por ahora, otro ejemplo sencillo:

class Incrementor
{
  function Increment(n) 
  {
    return n+1;
  }
}
class LoadBalancer
{
  var objects;
  var random;
  
  function LoadBalancer()
  {
    this.random = new System.Random();
    this.objects = new List();
  }
  
  sub Add(obj)
  {
    this.objects.Add(obj);
  }
  
  default function InvokeMethod(name, parameters)
  {
    n = random.Next(objects.Count);
    
    return this.objects[n].Invoke(name,parameters);
  }
}
  
balancer = new LoadBalancer();
balancer.Add("Foo");
for (k=1; k<=10; k++)
  balancer.Add(new Incrementor());
  
result = 0;
for (k=0; k<4; k++)
  result = result + balancer.Increment(k);
  
// result == 1 + 2 + 3 + 4 == 10

Es una especie de “load balancer”, que usa al azar, podría llamarlo  “distributor”. La instancia LoadBalancer envía cada llamada a método a uno de sus objetos, al azar.

Podría escribir otro ejemplo, donde el balancer envía cada invocación a TODOS sus objetos. Tengo pensado usar estas características en agentes, en especial, en agentes distribuidos. Podría agregar default methods a objetos AjSharp (recuerde, AjSharp puede definir objetos sin clase asociada).

Como siempre, el código está disponible en:

http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjLanguage

Nos leemos!

Angel “Java” Lopez

http://www.ajlopez.com

http://twitter.com/ajlopez

Leave a Reply

Your email address will not be published. Required fields are marked *