martes, 13 de abril de 2010

Algoritmos sobre SDTs en GeneXus

Los SDTs en GeneXus (Structured Data Type) tienen cierto grado de felxibilidad, pero creo que como están hoy, no es suficiente.

Nota: lo que sigue es basado es el conocimiento que tengo de los SDTs en GeneXus 9.0. Creo que no se hizo ninguna mejora significativa en este sentido en las versiones posteriores...

Supongamos que tengo un algoritmo que recibe dos SDTs de cierto tipo, los compara y devuelve otros dos SDTs con las diferencias. Es un algoritmo que se pensó bien, se analizaron las condiciones de borde, se testeo, está funcionando en producción.

El problema es que ahora preciso hacer lo mismo con otro SDT con otra estructura distinta... ¡Y para hacerlo tengo que repetir la programación de mi algoritmo!

Esto claramente no es lo más eficiente...

Lo que me gustaría, sería tener una sola versión del algoritmo, que pudiera invocar con distintos tipos de SDTs. De alguna forma debería poder:
  • definir variables de tipo "SDT Collection", genéricas, que se pudieran recibir como parámetro pasando cualquier SDT que sea una colección
  • definir variables de tipo "SDT Collection Item", genéricas, que pudiera usar para recorrer colecciones de tipo "SDT Collection" genéricas o cualquier otra colección
  • pasar una función (o varias), cuya firma dependerá del algoritmo que estoy implementado, que podrá recibir items de algún SDT (acá sí, específico), que será invocada desde el algoritmo pasando items del SDT genérico
El último punto, pasar una función por parámetro, ya se puede hacer, pero no me gusta como está resuelto... Igual eso es para otra nota.

Otra cosa que sería útil para los SDTs, que es bastante parecido a lo que decía hace unos días sobre la definición de variables, es que se pudieran definir campos en tiempo de ejecución. Hoy tenemos muchos SDTs distintos, algunos que se usan en un solo objeto.

Si pudiera combinar un SDT genérico con la posibilidad de definir campos en tiempo de ejecución, hay muchos SDTs que ni siquiera tendría que definir. Dejaría definidos solo aquellos que se usan más, o que son compartidos entre varios objetos.

A lo que me refiero es que si tengo una variable &item de tipo "SDT Collection Item", que pueda hacer:
&item.MiCampo = 'Hola mundo'
y que el generador asuma que "MiCampo" es de tipo char(N).

5 comentarios:

  1. Hola Marcos, me parece interesante tu articulo referente a los SDTs, considero que hace falta enrriquecerlos con mas funcionalidad, aportando un poco a este articulo, hay una funcionalidad que se me ocurre y es al momento de recorrer los Sdts considerarlos como si fuesen transacciones, poder hacer el recorrido con for each, e inclusive si un sdt es basando en algun atributo(de una transaccion), tomar su valor como tal y poder hacer la inferencia de tabla extendida, creo que seria muy interesante si por ejemplo pudiesemos llenar un grid basado en campos de un sdt (IdPersona, Cedula) y una columna sea un campo extendido,podria ser el nombre (att:IdPersona, att:Nombre), lo interesante seria no programar y que traiga el valor por inferencia.
    Saludos.
    PPILIDES

    ResponderEliminar
  2. Totalmente de acuerdo, la mayoría de los lenguajes de programación pueden manejar abstacciones para recorrer colecciones y así reaprovechar los algoritmos.

    ¿Alguna vez tuviste la oportunidad de programar en Haskell? Tiene una inferencia de tipos, en las que el compilador determina que clases son las que se reciben por parámetro a partir de las operaciones que se ejecutan sobre los objetos.
    De modo que una función siempre puede recibir por parámetro cualquier objeto que soporte dichos operadores.

    Me fuí un poco lejos de Genexus, principalmente porque Haskell es puramente funcional. Pero es interesante ver lo que puede lograr un lenguaje en cuanto a inferencia.

    ResponderEliminar
  3. Petros: Sí, sería interesante. Igual eso lo veo como algo más difícil de implementar...

    ResponderEliminar
  4. Pablo: De Haskel pude ver algo en la facultad, pero no mucho. En el momento me pareció más bien una curiosidad... Después que leí Hackers and Painters que habla de LISP, después de ver las expresiones Lambda en C# 3.0 y algo de Python, me quedé con ganas de retomar el tema de los lenguajes funcionales. Por el momento no he tenido demasiado tiempo.

    En el caso de GeneXus, creo que tienen todo para poder inferir tipos de datos y demás. Esperemos que en algún momento implementen algo de esto.

    ResponderEliminar
  5. Je, yo también leí ese libro y me quedé con las mismas inquietudes.

    Desde hace un tiempo estuve haciendo algunas cositas en Python, es un lenguaje interesante.

    Volviendo a Genexus, algo sobre los SDT que estaría muy bueno (no fue mi idea, lo leí en algún foro) es poder usar clausulas Where y When duplicate como si fuera un For Each sobre la base de datos.

    ResponderEliminar