Trabajando en AjObjects: objectos dinámicos/documentos en memoria

Al comienzo de este sigo, cuando apareció .NET, comencé a practicar programando proyectos personales. Había tres principales: AjStorm (Simple Tool for Object Relational Mapping), AjGenesis (Code generation) y AjObjects (objectos nativos en memoria con consultas dinámicas). Sólo el segundo proyecto está hoy activo. Pero aprendí sobre Reflection en los tres proyectos, sobre cómo implementar simples consultas en AjObjects (ahora, tenemos Linq en .NET). Pueden ver algo de código prehistórico en:

https://sourceforge.net/projects/ajstorm/

A fines de los noventa, cuando aprendí PHP, encontré en ese lenguaje una implementación de objetos dinámicos (por lo menos, de propiedades dinámicas, si no métodos; propiedades que se pueden agregar a un objeto en cualquier momento, sin haberlas definido en una clase previamente). Viendo lo flexible que eran en PHP, y luego de haber experimentado con generación de código en PHP, pasé a implementar esas ideas en AjBasic, el lenguaje interno de AjGenesis. Hace dos años, más o menos, agregué objetos dinámicos a otro lenguaje interpretado, AjSharp. Tanto AjBasic como AjSharp permite escribir cosas como:

abel.Name = "Abel"
abel.Age = 600
abel.Father.Name = "Adam"
abel.Father.Age = 800


sin una previa definición de los objetos y propiedades. En AjSharp seríawithout previous definition of the object and its properties. In AjSharp you write:



abel.Name = "Abel";
abel.Age = 600;
abel.Father.Name = "Adam";
abel.Father.Age = 800;


Más información en:



AjSharp: Dynamic Classes and Objects


AjSharp: Clases y Objectos Dinámicos


AjSharp posts


AjSharp posts en español



Muchos lenguajes sobre las VM de .NET y Java ahora está reconociendo el poder de estas características dinámicas (En .NET 4 tenemos una implementación de ExpandoObjects, creo que nació con el DLR Dynamic Language Runtime, ahora la palabra clave dynamic es lo “nuevo”).



Estuve jugando con objetos en memoria desde hace un tiempo, el año pasado escribí algún experimento llamado AjTwitter, mensajes en memoria. Y estuve escribiendo una implementación más relacional, en AjBase. Esos proyectos está en el trunk de:



http://code.google.com/p/ajcodekatas



Impresionado por el movimiento NoSQL, decidí “to push the envelop” de mi tiempo libre, y hace una semana, como code kata, escribí el esqueleto base de algo inspirado por MongoDB, que es conocidad como una base de datos orientada a documentos. Mi proyecto está escrito en C#. Pueden ver el código en el proyecto mencionado AjCodeKatas, con el nombre AjObjects.



Definí un BasicObject (similar al BasicDBObject en el driver Java de MongoDB):





El BasicObject puede ser llenado usando la propiedad indexada default:



BasicObject newobj = new BasicObject();
newobj["Age"] = 800;
newobj["Name"] = "Adam";


o por un método factoría:



BasicObject newobj = BasicObject.CreateObject("Name", "Adam", "Age", 800);


Collection es el contendor de BasicObjects:





Podemos insertar y borrar bjetos. Un nuevo objeto insertado obtiene un Guid. Podemos recuperar ese objeto via su Guid. Hay un método Find(Predicate<BasicObject>) que retorna un Cursor sobre los objetos que cumplen con el predicado pasado como parámetro:





El método Update(Predicate<BasicObject>,Action<BasicObject>) aplica la acción a los objetos seleccionados de una colección.



La adopción de predicados y acciones, podría complicar la implementación de estas invocaciones cuando llegue a programar las llamadas distribuidas. Deberé trabajar en la serialización de esos predicados y acciones: ver de trabajarlos como Expression lambda, que recuerde, éstas son serializables (lo vi alguna vez en expresiones LINQ que viajaban de nodo a nodo en Microsoft Robotics).



Debo trabajar, como próximos pasos, en:



- Concurrencia: Actualmente, una colección tiene locks en cada uno de sus métodos. Los cursores obtienen una copia de la lista actual de objetos (copia la lista, no los objetos). Mientras se usa el curso, la colección original puede ser actualizado, sin cambiar el contenido del cursor.



- Persistencia: Hay un BasicObjectSerializer, a mejorar: más tipos básicos, necesito una implementación de BasicList.



- Distribución: Planeo tener varios hosts con réplicas, con consistencia eventual (tengo que estudiar la terminología).



Nos leemos!



Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

This entry was posted in 12677, 13239, 1389, 3463. Bookmark the permalink.

Leave a Reply

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

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>