viernes, 9 de abril de 2010

Definición de variables en GeneXus

En GeneXus, las variables se debe definir indicando el tipo de datos y en algunos casos el largo y la cantidad de decimales.

Con esto, estamos ayudando de alguna forma al especificador/generador, que ya sabe de que tipo tiene que definir cada una.

Pero en realidad, ¿no debería ser al revés? ¿No debería el especificador solucionarnos los problemas?

En algunos casos GeneXus infiere el tipo de las variables, como por ejemplo cuando se llama igual que un atributo, o cuando termina con el nombre de un dominio.

Hay otros casos donde los infiere el especificador, pero dando un warning, y en realidad no quedan definidas en el objeto. Por ejemplo, cuando asignamos una valor a una variable que no fue definida.

Lo que propongo en realidad es mucho más genérico: que no haya que definir ninguna variable.

El especificador debería validar que se usen correctamente (que no se asigne un char a una variable que antes se asignó un número, por ejemplo) y dar errores si corresponde. Otro control que debería hacer es que no se use una variable antes de ser asignada, para evitar que hayan errores de escritura en los nombres.

También debería haber un paso antes, en el IDE. La primera vez que uso una variable en el código, ya debería quedar definida de alguna forma, para que la muestre la próxima vez que escribo un &.

Le estoy dando vueltas al tema desde hace un rato, y cada vez estoy más convencido que es una funcionalidad que deberíamos tener. ¿Tiene alguna contra que se les ocurra?

6 comentarios:

  1. Lo que vos planteas, creo que puede tener algunos inconvenientes, pues es difcil determinar si se necesita un char de largo 1 o de largo 100 y lo mismo con la precision de los numericos.
    De cualquier forma,con la X estamos mucho mejor que antes.

    Con respecto a las variables, hay varias cosas para mejorar.

    1) Poder borrar solo las variables no referenciadas en el codigo.
    2) Que al hacer un Add Variable desde el codigo, infiera por el contexto en el cual esta siendo usada dicha variable un tipo de datos, pues hoy siempre toma Numerico de 4.

    Al especificar generalmente deduce en forma correcta el tipo de datos, pero luego al agregarlo, hay que volver a decirselo.
    Estaria bueno que el mismo Warning, nos diera la opcion de darla de alta con dicho tipo.
    3) Poder borrar variables con el mouse unicamente.

    ResponderEliminar
  2. En la Evolution 2 estamos trabajando para llevar más allá la inferencia de las variables.
    En la X Ev 1 como decís ya se hacen varias inferencias por naming, en la X Ev 2 las inferencias van más allá y se infieren tipos independientemente de su nombre.
    Esto lleva a que casi nunca se tenga que definir una variable.

    Tanto en código procedural como en código de data providers.

    Saludos

    ResponderEliminar
  3. Enrique:

    En realidad char de 1 o de 100 no me importa demasiado, tanto en Java como en C# son strings.

    1, 2 y 3) Estaría bueno, pero innecesario si no hubiera que definirlas :)

    ResponderEliminar
  4. Definir las variables no es necesario.

    Es la flojera del compilador lo que nos hace que tengamos que definirla, como lo demuestra Genexus X Ev 2

    En otras épocas, cuando los recursos informáticos eran tan escasos en donde si se usaba un byte o dos hacia diferencia lo entiendo, pero en la actualidad es un concepto obsoleto.

    Genexus no está hecho para este tipo de optimización. Realmente los programas generados, si bien son solidos, dejan mucho que desear en cuanto a rendimiento. Genexus genera mejor código que un principiante pero no puede competir con un programador seniors.

    Hoy el recurso escaso es el recurso humano y esto lo entendió la gente de Artech desde el comienzo.

    Declarar las variables es una perdida de tiempo y una frustración que en lo personal me dispone negativamente. Es una incoherencia con la idea original y en definitiva solo se sustenta como una herencia o por la falta de dedicación al tema.

    Que una cadena tenga 50 o 100 caracteres a los fines prácticos da exactamente lo mismo. En el lenguaje en que genera (supongamos C#) no se puede definir la longitud, en la base de dato (supongamos MSSql) tampoco.

    Si usara la longitud declarada de una cadena para proteger al usuario de su propia torpeza o flojera (concepto dudoso si los hay) verificaría que no se hicieran asignaciones incorrecta como una cadena de 100 caracteres en un atributo de 50 que tampoco lo hace.

    El caso extremo se da cuando genera los programas en Ruby... en GX se debe asignar un tipo a la variable pero esta información no se puede usar en el programa generado.

    En definitiva, en lo personal creo que la declaración de variables corresponde con una idea de la informática un poco anticuada, muestra una mentalidad de otros tiempos que deberemos sufrir porque la inercia suele ser muy grande en estos temas.

    ResponderEliminar
  5. Estoy totalmente de acuerdo con Alejandro. Genexus en varios aspectos está algunos años atrás (por no decir décadas) si lo comparamos con lenguajes que apunten también a la productividad. No solo que haya que prefijar límites arbitrarios para algunas variables (límites que generalmente despues en el código generado no se utilizan), si no que haya que utilizar el ide (!!!) para definir una variable y que no sea parte del código fuente, aparte de tedioso es ineficiente, no permite copiar y pegar fácilmente, hay que cambiar de solapa para ver cómo están definidas las variables, etc.
    En el único caso que se justificaría definir largos es para variables que van en pantalla.
    Saludos!

    ResponderEliminar