miércoles, 4 de junio de 2014

variables o atributos

¿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