Un parámetro o una variable es un área de memoria. En algunos casos, la variable contiene los datos empresariales de interés, como por ejemplo, un determinado nombre o ID de empleado.
En otros casos, la variable es una variable de referencia que contiene una dirección de
memoria utilizada para acceder a los datos empresariales en tiempo de ejecución.
Una variable de referencia en EGL está basada en uno de los componentes siguientes, cada uno de
los cuales se llama también
tipo de referencia:
- ConsoleField
- Interface
- Menu
- MenuItem
- Prompt
- Window
- Report
- ReportData
- Service
Excepto en el caso de los componentes Service e Interface, no es necesario definir ninguno de
los componentes mencionados anteriormente ya que están predefinidos por EGL.
Las implicaciones son las siguientes:
- Inicialización
- Cuando declara una variable de referencia, EGL normalmente inicializa la variable en el valor
NIL, lo que indica que la variable no está dirigida a datos empresariales. En los casos siguientes, el valor
NIL no es el valor inicial:
- La variable está basada en un componente que incluye un campo inicializado en tiempo de definición, o bien
- La declaración de variable incluye un bloque set-value, o bien
- Puede utilizar la palabra clave new para asignar un área de memoria en tiempo de
ejecución, como es posible para todos los tipos de referencia que no sean ConsoleField, Service o
Interface. A continuación se ofrece un ejemplo:
myPrompt Prompt = new Prompt {message = "Type your ID");
Para conocer más detalles acerca de la palabra clave new, consulte el apartado
Utilización de new en informes de EGL y ConsoleUI.
Cuando declara una matriz de variables de referencia (por ejemplo, MenuItem[3]), las normas
anteriores también se aplican a cada elemento de la matriz.
- En sentencias de asignación
- Después de asignar una variable de referencia a otra variable de referencia, el origen y el
destino contienen cada uno un valor utilizado para acceder a la misma área de memoria. Puede
asignar una variable de referencia solamente a otra variable de referencia basada en el mismo
componente y en el caso de una interfaz o un componente de servicio, un componente definido en un
paquete no es el mismo que un componente definido en otro paquete, incluso aunque los nombres de
componente sean idénticos.
Nota: Cuando asigna una variable que no es de referencia a otra variable
que no es de referencia, la situación es distinta:
- El origen y el destino contienen cada uno una copia de los mismos datos empresariales. Si una
variable origen que no es de referencia de una sentencia assignment contiene, por ejemplo, un
determinado ID de empleado, la sentencia hace que la variable destino también contenga dicho ID.
- Las variables pueden ser de distintos tipos, tal como se describe en el apartado
Compatibilidad de asignación.
- En comparaciones
- Los operadores que prueban la igualdad (==) y la desigualdad (!=) son válidos para comparar
variables de referencia. La comparación se basa en el área de memoria al que se refieren las
variables. Si hay dos variables que hacen referencia a distintas áreas de memoria, las dos
variables no son iguales, incluso aunque los datos empresariales sean idénticas.
- En invocaciones de función
- Puede pasar una variable de referencia solo a un parámetro del mismo tipo que el argumento y,
en el caso de un componente de servicio o una interfaz, un componente definido en un paquete no es
igual que un componente definido en otro paquete, incluso aunque los nombres de componente sean
idénticos. Sin embargo, puede pasar una variable de referencia a una función de servicio solo si el
parámetro es del mismo tipo que el argumento y solo si la invocación es local, específicamente solo
si local es el valor de la propiedad compleja @EGLBinding, campo commType.
La función
siempre recibe una copia de la variable que se pasa:
- Al asignar un valor distinto a los datos a los que hace referencia el parámetro (por ejemplo,
cambiar el color de un campo de consola), se cambian los datos disponibles en la función invocante
- Sin embargo, la utilización del parámetro del lado izquierdo de una sentencia de asignación en
la función invocada no tiene ningún efecto sobre la función invocante. Después de la asignación, el
parámetro hace referencia a la misma área de memoria que el área al que hace referencia la variable
del lado derecho de la sentencia de asignación, pero el argumento de la función invocante no se ve
afectado por esa asignación.
Los modificadores de parámetro IN, OUT e INOUT no son válidos para los parámetros de un
tipo de referencia.
Cualquier tipo de referencia es válido como tipo de retorno, lo que
significa que se devuelve una copia de una dirección a la función invocante en tiempo de ejecución.
Incluso aunque el tipo de referencia se declare como variable local en la función invocada, los
datos empresariales (y un área de memoria para albergar esos datos) se retienen en la función
invocante.
- En las llamadas a programas
- No puede pasar una variable de referencia a otro programa.
- En PageHandlers
- No puede pasar una variable de referencia a la función onPageLoad en un PageHandler ni puede
situar una variable de referencia en (o recuperar una variable de referencia de) la sesión o el
objeto de petición.