Entradas

Mostrando las entradas de marzo, 2018

De cuantas formas se puede modularizar un sistema?

Imagen
Este es un problema interesante, con unas cuantas consecuencias practicas.

Tengo una KB con n objetos y la quiero modularizar. Para simplificar, defino que quiero dividirla en K modulos, con  1<= k <= n.

De cuantas formas diferentes puedo modularizarla?

Sea S(n,k) la función que cuenta la cantidad de formas de modularizar, con n objetos y k modulos.

 Dividimos el problema en 2 casos excluyentes:

Caso 1: Hago un modulo solo con el elemento n. Me quedan n-1 elementos, para agrupar en k-1 módulos, que puedo escribir de la forma S(n-1,k.-1). 

Caso 2: n esta en un modulo con otros objetos. Esto es lo mismo que poner el objeto n en los k modulos que tienen los n-1 elementos restantes.



y puede escribirse como k * S(n-1,k) 

La cantidad de forma de modularziar entonces, seria la suma de ambos casos y puede escribirse de la forma:


      S(n,k) =  S(n-1,k-1) + k* S(n-1,k)

a estos numeros se los conoce como  números de Stirling de segunda especie.

La cantidad de formas de modularizar con n=7 y…

Manejo de Errores y claridad de codigo

Imagen
Supongamos que tenemos un procedure que recibe dos parámetros y devuelve otro.

Para hacerlo facil, recibe una moneda y una fecha y devuelve la cotización.

Procedure Cotizacion
(IN:&Moneda, IN:&Fecha, OUT:&Cotizacion)

Puede usarse de la forma:

&CotizacionHoy = Cotizacion('USD',&Today)

Hasta ahi, el codigo es bien entendible. 
Supongamos ahora, que se quiere hacer algun manejo de errores y para lograrlo, se le agrega un parámetro adicional de salida
Procedure Cotizacion (IN:&Moneda, IN:&Fecha, OUT:&Cotizacion, OUT:&CodigoError)
El procedure ahora ya tiene mas de parámetro de salida, lo cual  hace mas dificil su uso
Cotizacion.call('USD',&Today,&CotizacionHoy,&CodigoError) If &CodigoError='404'     Msg('No existe la cotizacion para la moneda en ese dia') Endif.  Si comparo
&CotizacionHoy = Cotizacion('USD',&Today)
con
Cotizacion.call('USD',&Today,&CotizacionHoy,&CodigoError)

Cambio un objeto, especifico y genero y no veo los cambios al ejecutar.

Imagen
Me han plateado varias veces este problema:

No veo los cambios cuando ejecuto. Hago cambios en los objetos, especifico y genero y cuando ejecuto sigo viendo la version vieja del programa. 
GeneXus usa el concepto de "main object".  Esto era mas facil de comprender en los ambientes WIN, pero en ambientes WEB es un poco mas difícil de entender. 

Voy a hablar de ejecutable como sinónimo de assembly (en .net) o de class (en java).

Los Transacciones y Webpanels generan un ejecutable (sean main o no sean main). 

Un Procedure, Data Provider, BC genera un ejecutable si es main, y se incluye en los ejecutables de los objetos que lo llaman.

Cuando se compila un objeto no main?.  Se compila cuando se hace Run/Build del objeto main que lo invoque.

Que pasa cuando hago RUN de un main? Cuando se hace el RUN de un objeto, primero se hace un BUILD del arbol de invocaciones de dicho main, con lo que se especifica todos los objetos cambiados en el arbol de llamadas y luego se compila y se ej…

Funcionalidades que me gustaria tener en proximas versiones de GeneXus

Imagen
Esta es una lista de pequeñas funcionalidades que pienso que podrian hacer la vida un poco mas facil a los que desarrollamos con GeneXus, sobre todo en KB de tamaño mediano o grande. La mayoria son para tratar de aclerar el desarrollo y evita los grandes tiempos de espera que se producen en los build all.

1) Working Set mas flexible. 
En la Working Set que se tiene en el trabajar con objetos, seria bueno generarilzarla un poco.
Me gustaria tener en el dialogo contextual de los objetos una opcion Add to Working Set, de forma de poder agregar objetos en esa lista, desde cualquier dialogo de GeneXus. Por ejemplo, si hago un cambio a un objeto y quiero especificarlo, puedo agregarlo desde el tab al Working Set y especificarlo mas tarde. 


2) Especificar y generar los objetos que hacen referencia a otro objeto. 
En incontables oportunidades, tenemos que regenerar todos los objetos que usan un SDT o un External Object y no hay formas facil para hacerlo.  Estaria bueno poder hacerlo desde el m…

Integracion Continua - GeneXus - GUG Barsil.

Me invitaron a participar en una charla en el GUG de Brasil sobre integración continua, manejo de ambientes y versiones.
Lo mas interesante, estuvo en las preguntas y respuestas. Por si a alguien le sirve, dejo aca la presentacion.

Eliminando dependencias o Cambiando dependencias para tener un diseño modular.

Imagen
Una de las tareas mas importantes cuando se está modularizando una base de conocimiento (o cualquier sistema) es diseñar nuestros componentes de software de forma que cada uno de ellos pueda ser lo mas independiente de los demas (bajo acoplamiento).

En mi experiencia de modularizar bases de conocimiento, he visto muchas veces que se definen Dynamic Combo Box con una definción de atributos.

Esto trae como consecuencia, que el objeto que tiene ese Dynamic Combo Box, hace una referencia explicita a la tabla que contiene los atributos CountryID y CountryName.

Si este objeto no esta en el mismo modulo que la tabla Countries, dicha tabla va a tener que quedar publica.

Una forma muy sencilla de evitar esta dependencia, es basar el Dynamic Combo Box, en un Data Provider en vez de usar directamente los atributos.

De esta forma, el programa, en vez de hacer una sentencia "Select CountryID, CountryName from Countries", hara una llamada a el Data Provider.

Que ventajas y desventajas tie…