sugerencias para el lenguaje genexus by marcos crispino en #gug montevideo
DESCRIPTION
La charla propuesta por Marcos Crispino fue una instancia para reflexionar y aportar sugerencias en torno a GeneXus.TRANSCRIPT
![Page 2: Sugerencias para el lenguaje GeneXus by Marcos Crispino en #GUG Montevideo](https://reader038.vdocuments.mx/reader038/viewer/2022102416/5571f77949795991698b7405/html5/thumbnails/2.jpg)
Descargo de responsabilidad (disclaimer)• Son sugerencias, no hay garantía Artech las vaya a tener
en cuenta. • Ideas tomadas (en su mayoría) de otros lenguajes de
programación.• Publicadas originalmente en
http://blog.marcoscrispino.com/search/label/sugerencias
![Page 3: Sugerencias para el lenguaje GeneXus by Marcos Crispino en #GUG Montevideo](https://reader038.vdocuments.mx/reader038/viewer/2022102416/5571f77949795991698b7405/html5/thumbnails/3.jpg)
Bloques de reglas en transacciones
Es común tener conjuntos de reglas relacionadas.
Ejemplo: &valor = udp(MyProc) if SomeAttribute = 1 on AfterValidate;error('&valor cannot be empty') if &valor.IsEmpty() and SomeAttribute = 1 on AfterValidate;
![Page 4: Sugerencias para el lenguaje GeneXus by Marcos Crispino en #GUG Montevideo](https://reader038.vdocuments.mx/reader038/viewer/2022102416/5571f77949795991698b7405/html5/thumbnails/4.jpg)
Bloques de reglas en transacciones
Sugerencia: { &valor = udp(MyProc);error('&valor cannot be empty') if &valor.IsEmpty();}if SomeAttribute = 1 on AfterValidate;
![Page 5: Sugerencias para el lenguaje GeneXus by Marcos Crispino en #GUG Montevideo](https://reader038.vdocuments.mx/reader038/viewer/2022102416/5571f77949795991698b7405/html5/thumbnails/5.jpg)
Valor "empty" para atributos con value rangeDominio ESTADO con valores {'ING', 'ABI', 'CER'}
Atributo AttEstado basado en dominio ESTADO
AttEstado.SetEmpty() vale '' (el string vacío)
Debería valer alguno de los valores válidos para el dominio.
![Page 6: Sugerencias para el lenguaje GeneXus by Marcos Crispino en #GUG Montevideo](https://reader038.vdocuments.mx/reader038/viewer/2022102416/5571f77949795991698b7405/html5/thumbnails/6.jpg)
Mensajes y formato de strings
Para dar formato a un string: Format('El pedido número %1 fue confirmado', PedidoId.ToString()) Hoy, para mostrar un mensaje con formato:
msg( Format('El pedido número %1 fue confirmado', PedidoId.ToString()) ) Sugerencia: combinar las funciones msg() y error() con la función Format().msg('El pedido número %1 fue confirmado', PedidoId.ToString())
![Page 7: Sugerencias para el lenguaje GeneXus by Marcos Crispino en #GUG Montevideo](https://reader038.vdocuments.mx/reader038/viewer/2022102416/5571f77949795991698b7405/html5/thumbnails/7.jpg)
Comando "do case"
Las condiciones son independientes. El siguiente ejemplo es válido:
do case case &variable = 1 // código para el valor 1 de &variable case &otra_variable = 2 // código para el valor 2 de &otra_variable otherwise // hago algo para los demás valoresendcase
![Page 8: Sugerencias para el lenguaje GeneXus by Marcos Crispino en #GUG Montevideo](https://reader038.vdocuments.mx/reader038/viewer/2022102416/5571f77949795991698b7405/html5/thumbnails/8.jpg)
Comando "do case"
Sugerencia: implementar un comando "elseif"
if &variable = 1 // código para el valor 1 de &variableelseif &otra_variable = 2 // código para el valor 2 de &otra_variableelse // hago algo para los demás valoresendif
![Page 9: Sugerencias para el lenguaje GeneXus by Marcos Crispino en #GUG Montevideo](https://reader038.vdocuments.mx/reader038/viewer/2022102416/5571f77949795991698b7405/html5/thumbnails/9.jpg)
Comando "do case"
Sugerencia: cambiar el comando "do case" para que se comporte con el "switch" de C# y Java
do case (&variable) case 1 // código para el valor 1 de &variable case 2 // código para el valor 2 de &variable otherwise // hago algo para los demás valoresendcase
![Page 10: Sugerencias para el lenguaje GeneXus by Marcos Crispino en #GUG Montevideo](https://reader038.vdocuments.mx/reader038/viewer/2022102416/5571f77949795991698b7405/html5/thumbnails/10.jpg)
When duplicate para índices unique
Se tiene una tabla con campos [A, B, C, D] con los siguientes índices:• primary key [A]• índices unique [B] y [C, D]
Se tiene un for each que actualiza la tabla:for each where A = &A B = &B C = &C D = &Dendfor¿Qué pasa si falla por índice duplicado? Hoy da un warning "spc0070: No When duplicate code found to handle possible duplicate condition when updating [Atributo]"
![Page 11: Sugerencias para el lenguaje GeneXus by Marcos Crispino en #GUG Montevideo](https://reader038.vdocuments.mx/reader038/viewer/2022102416/5571f77949795991698b7405/html5/thumbnails/11.jpg)
When duplicate para índices unique
Sugerencia:
for each where A = &A B = &B C = &C D = &Dwhen duplicate B // código para manejar el valor duplicado en Bwhen duplicate C, D // código para manejar duplicados en C, Dendfor
![Page 12: Sugerencias para el lenguaje GeneXus by Marcos Crispino en #GUG Montevideo](https://reader038.vdocuments.mx/reader038/viewer/2022102416/5571f77949795991698b7405/html5/thumbnails/12.jpg)
Parámetros opcionales
Cuando se agrega un nuevo parámetro a un objeto, hay que cambiar todos los llamadores.
Sugerencia: parámetros opcionales
Ejemplo:
parm(in:&par1, in:&par2 = 0);
Invocación:
call(MiObjeto, &valor1, &valor2)call(MiObjeto, &valor1) //equivalente a //call(MiObjeto, &valor1, 0)
![Page 13: Sugerencias para el lenguaje GeneXus by Marcos Crispino en #GUG Montevideo](https://reader038.vdocuments.mx/reader038/viewer/2022102416/5571f77949795991698b7405/html5/thumbnails/13.jpg)
Parámetros nominados
Los parámetros en GeneXus son posicionales.
parm(in:&par1, in:&par2, in:&par3);
call(MiObjeto, &val1, &val2, &val3)
Entonces:• &par1 = &val1• &par2 = &val2• &par3 = &val3
![Page 14: Sugerencias para el lenguaje GeneXus by Marcos Crispino en #GUG Montevideo](https://reader038.vdocuments.mx/reader038/viewer/2022102416/5571f77949795991698b7405/html5/thumbnails/14.jpg)
Parámetros nominados
Sugerencia: poder asignar un nombre a cada uno de los parámetros para poder invocarlos en cualquier orden. parm(in:&par1, in:&par2=1, in:&par3=0);
call(MiObjeto, &val1, @par3 = &val3) Entonces:• &par1 = &val1• &par2 = 1 (valor por defecto en la regla parm)• &par3 = &val3
![Page 15: Sugerencias para el lenguaje GeneXus by Marcos Crispino en #GUG Montevideo](https://reader038.vdocuments.mx/reader038/viewer/2022102416/5571f77949795991698b7405/html5/thumbnails/15.jpg)
Objetos que devuelven más de un valor
Para objetos que devuelven un solo valor: &valor = MiObjeto.udp(...) o MiObjeto.call(..., &valor)
Se lee mejor el udp, porque deja claro que la intensión es cargar el valor en la variable.
¿Y para objetos que devuelven varios valores?
![Page 16: Sugerencias para el lenguaje GeneXus by Marcos Crispino en #GUG Montevideo](https://reader038.vdocuments.mx/reader038/viewer/2022102416/5571f77949795991698b7405/html5/thumbnails/16.jpg)
Objetos que devuelven más de un valor
Para objetos que devuelven más de un valor, la única alternativa es un call: MiObjeto.call(..., &valor1, &valor2) Sugerencia:
&valor1, &valor2 = MiObjeto.udp(...)
con regla parm:
parm(in:..., out:&valor1, out:&valor2);
![Page 17: Sugerencias para el lenguaje GeneXus by Marcos Crispino en #GUG Montevideo](https://reader038.vdocuments.mx/reader038/viewer/2022102416/5571f77949795991698b7405/html5/thumbnails/17.jpg)
Subrutinas con parámetros
Stubs, agregados en GeneXus X Ev1 U2.Ver: http://wiki.gxtechnical.com/commwiki/servlet/hwikibypageid?13516
Solo disponibles para web services.
Ejemplo: Stub FirstMethod(&parm1, &parm2) &parm1 = 1 &parm2 = 'HOLA' EndStub
Sugerencia: implementar los stubs para todos los objetos
![Page 18: Sugerencias para el lenguaje GeneXus by Marcos Crispino en #GUG Montevideo](https://reader038.vdocuments.mx/reader038/viewer/2022102416/5571f77949795991698b7405/html5/thumbnails/18.jpg)
Pasaje de controles por parámetro
Ejemplo:
Sugerencia: poder hacerlo en una subrutina con parámetros.
![Page 19: Sugerencias para el lenguaje GeneXus by Marcos Crispino en #GUG Montevideo](https://reader038.vdocuments.mx/reader038/viewer/2022102416/5571f77949795991698b7405/html5/thumbnails/19.jpg)
Herencia entre objetos
Hoy existen los styles que definen herencia al momento de crear el objeto. Se copia el código al objeto nuevo y hay que mantenerlo en los dos lugares.
Ejemplo: pattern WorkWith => todos los objetos tienen el código de paginado. Sugerencia: poder definir herencia y que se herede el comportamiento.
![Page 20: Sugerencias para el lenguaje GeneXus by Marcos Crispino en #GUG Montevideo](https://reader038.vdocuments.mx/reader038/viewer/2022102416/5571f77949795991698b7405/html5/thumbnails/20.jpg)
Definición dinámica de variables
En GeneXus hay que definir todas las variables que se van a usar.
En las últimas versiones ha mejorado la inferencia de tipos para las variables no definidas. Hay lenguajes para los cuales no ese necesario saber el tipo de la variable (de los que genera GeneXus: Ruby)
Sugerencia: que no sea necesario declarar las variables, que siempre se infiera el tipo.
![Page 21: Sugerencias para el lenguaje GeneXus by Marcos Crispino en #GUG Montevideo](https://reader038.vdocuments.mx/reader038/viewer/2022102416/5571f77949795991698b7405/html5/thumbnails/21.jpg)
SDTs: buscar un elemento en la colecciónEjemplo:
&esta = Boolean.Falsefor &item in &coleccion if &item.Campo1 = &Var1 and &item.Campo2 = &Var2 &esta = Boolean.True exit endifendfor
![Page 22: Sugerencias para el lenguaje GeneXus by Marcos Crispino en #GUG Montevideo](https://reader038.vdocuments.mx/reader038/viewer/2022102416/5571f77949795991698b7405/html5/thumbnails/22.jpg)
SDTs: buscar un elemento en la colecciónSugerencia:
&esta = &coleccion.Exists(d => d.Campo1 = &Var1 and d.Campo2 = &Var2)
Se lee como "existe un elemento d en la colección que cumple que d.Campo1 = &Var1 y d.Campo2 = &Var2" Otras funciones:• First: devuelve el primer elemento que cumple la condición• Where: devuelve otra colección con los elementos que
cumplen con la condición• Select: permite hacer una proyección, devuelve otra
colección pero de otro tipo
![Page 23: Sugerencias para el lenguaje GeneXus by Marcos Crispino en #GUG Montevideo](https://reader038.vdocuments.mx/reader038/viewer/2022102416/5571f77949795991698b7405/html5/thumbnails/23.jpg)
SDTs: buscar un elemento en la colecciónOtra posibilidad:
&esta = Boolean.Falsefor &item in &coleccion where &item.Campo1 = &Var1 where &item.Campo2 = &Var2
&esta = Boolean.True exitendfor
![Page 24: Sugerencias para el lenguaje GeneXus by Marcos Crispino en #GUG Montevideo](https://reader038.vdocuments.mx/reader038/viewer/2022102416/5571f77949795991698b7405/html5/thumbnails/24.jpg)
SDTs: algoritmos
Problema: no hay posibilidad de reutilizar algoritmos entre distintos SDTs
Sugerencia: Poder tener algoritmos genéricos.
Se necesita:• SDTCollection, genérico, que se pueda usar en lugar de
cualquier SDT que sea colección• SDTItem, genérico, que se pueda usar en lugar de cualquier
SDT de un nivel, por ej. items de SDTCollection• Acceder dinámicamente a los elementos del SDT