¿Qué
declarar en la regla parm:
Variable
o atributo?
• Variable: Se podrá utilizar libremente,
en la lógica del objeto invocado:
• Como condición de filtro por =, >, >=, <, <=, LIKE, etc.
• Para alguna operación aritmética.
• Como bandera.
• etc.
• Atributo: Automáticamente el mismo
actuará como filtro por igualdad en el
objeto, no siendo posible modificar el
valor recibido.
Al definir una invocación a un objeto (ya sea utilizando
CALL o UDP), si se tienen que enviar datos por parámetro al objeto invocado,
resulta evidente determinar si enviar atributos y/o variables: si un dato a
ser enviado por
parámetro, se encuentra
en el objeto
invocador, en un
atributo, habrá que enviar el
mismo; y si se encuentra en una variable, habrá que enviar la variable.
Sin embargo, al
declarar la lista
de parámetros en
el objeto invocado,
el programador GeneXus deberá decidir para
cada parámetro, si
declararlo mediante un
atributo o una
variable, independientemente de cómo haya sido enviado.
¿Cuál es la diferencia entre declarar un parámetro como
variable o como atributo en la regla parmdel objeto invocado? Si se declara una
variable, se la podrá utilizar libremente en la lógica del objeto invocado: se
la podrá utilizar como condición de filtro por igualdad, por mayor, mayor o
igual, menor, menor o igual, LIKE, etc.; se la podrá utilizar para alguna
operación aritmética, como bandera, o lo que se necesite. Si en cambio se
declara un atributo, automáticamente el mismo actuará como filtro por igualdad
en el objeto, no siendo posible modificar el valor recibido.
Cuando lleguemos a
la etapa del
curso en la
cual podamos invocar a
procedimientos pdf para listados,
pesándoles parámetros, así como a otros objetos, podremos terminar de
comprender mejor este tema
Definición de tipo de pasaje de parámetros (in, out, inout)
•Para cada parámetro que se declara en la regla parm, es posible definir si se desea que el mismo opere:
− De entrada (in)
− De salida (out)
− De entrada‐salida (inout)
•
Ejemplo: parm( out:&par1, in:&par2, &par3, inout:&par4);
• Ventajas:
• Mejor especificación de la semántica de las
interfaces.
•
Independencia del lenguaje de generación.
• Optimizar el pasaje de parámetros de las
aplicaciones de acuerdo a la arquitectura en la
que éstas se implementan (ventaja contrapuesta a
la anterior).
Como se puede percibir claramente en la sintaxis del
ejemplo, el primer parámetro definido es de salida, el segundo parámetro
es de entrada,
y el cuarto
parámetro es de
entrada-salida. Cuando no
se especifica nada, como es el
caso del tercer parámetro de la sintaxis, dependerá de lo siguiente:
·
si el objeto fue invocado con CALL, el
parámetro, será de entrada-salida.
·
si
el objeto fue
invocado con UDP,
y se trata
del último parámetro,
será de salida; y
si se trata
de otro parámetro distinto del
último, dependerá del lenguaje de generación.
Declarar implícitamente cómo se desea que cada parámetro
opere, tiene las siguientes ventajas:
1. Mejor
especificación de la
semántica de las
interfaces; es decir,
tanto para GeneXus
como para el programador cuando trabaje con un objeto,
será claro:
- si el mismo
vendrá con valor y luego de
la ejecución del
objeto invocado, se devolverá al objeto invocador el valor con
que haya quedado (inout).
- si el mismo
vendrá con valor y
luego de la
ejecución del objeto
invocado, no se devolverá al objeto invocador el valor con
que haya quedado (in)
.- si el mismo no vendrá con valor y luego de la ejecución
del objeto invocado, se devolverá al objeto invocador el valor que tenga (out).
2. Independencia del lenguaje de generación; es decir, si se
define explícitamente cómo se desea que cada parámetro opere,
al generar las
aplicaciones utilizando diferentes
lenguajes de generación
no estará cambiando el
comportamiento de los
parámetros en base
al comportamiento por
defecto del lenguaje
de generación correspondiente.
3. Optimizar el pasaje de parámetros de acuerdo a la
arquitectura en la que éstas se generen (siendo una ventaja contrapuesta a la
anterior); esto se refiere a
lo siguiente: para
la mayoría de
los lenguajes es más
eficiente pasar los parámetros por referencia (inout) que por valor (in / out);
pero en Java, por ejemplo, los parámetros solo se pueden pasar por valor, por
lo que para lograr la funcionalidad de pasarlos por referencia es necesario
hacer conversiones de parámetros, lo cual puede redundar en un overhead
importante; por otro lado, cuando se
trata de aplicaciones
distribuidas (por ejemplo
Java con RMI o HTTP),
la utilización de parámetros
de tipo out
tiene la ventaja
de que no es necesario
enviar al parámetro
en la invocación,
a diferencia de si los parámetros se definen de inout (que implica que
haya que pasar todos los parámetros);
esto tiene como
consecuencia que se
envíen más bytes
de los necesarios,
lo cual es
inconveniente especialmente en entornos tales como Internet.
No hay comentarios:
Publicar un comentario