Referencias a componentes

Esta sección describe un conjunto de normas. Estas normas determinan cómo EGL identifica el componente al que hace referencia un nombre. Estas normas son importantes en las siguientes situaciones:

Un segundo conjunto de normas determina cómo EGL resuelve las referencias a variables. Para obtener información detallada, consulte la sección Referencias a variables y constantes.

Normas básicas de visibilidad

En el caso más simple, defina componentes uno tras otro en un único paquete, sin declarar un componente dentro de otro. La lista siguiente omite muchos detalles, pero muestra una serie de componentes que están en el mismo nivel jerárquico:

   Función:  Function01
   Función:  Function02
   Función:  Function03
   Registro:    Record01

Los componentes del mismo nivel están disponibles entre sí. Function01, por ejemplo, puede invocar una o las dos otras funciones; y Record01 puede utilizarse como una typedef para las variables de cada una de las tres funciones.

En la mayoría de casos, un componente no puede anidar otro componente. Las excepciones son las siguientes:
  • Un programa, biblioteca o pageHandler puede anidar funciones, pero incluso entonces, la inclusión debe ser directa; una función no puede anidar otra función
  • Un grupo de formularios puede anidar formularios
A continuación se ofrece un ejemplo con componentes anidados:
   Programa:  Program01
     Función:  Function01
     Función:  Function02
   Función:  Function03
   Registro:    Record01
Los componentes del nivel superior están disponibles en cualquier otro componente del paquete. Sin embargo, los componentes anidados (Function01 y Function02) sólo están disponibles en un subconjunto de componentes del paquete:
  • Están disponibles entre sí.
  • Están disponibles en el componente anidante y en las funciones que utiliza el componente anidante durante la ejecución. Si, por ejemplo, Function01 invoca Function03, Function03 puede invocar Function02 porque Function03 se utiliza en Program01.

Finalmente, si el código incluye formularios de texto o impresión, se necesita una declaración de uso para acceder al grupo de formularios que incluye dichos formularios. Una declaración de uso también es deseable cuando se accede a tablas de datos o a bibliotecas. Para obtener más información, consulte la sección Declaración de uso.

Normas adicionales de visibilidad

La mayoría de esfuerzos de desarrollo tienen componentes que se comparten en más de un paquete. Se aplican las siguientes normas:

Resolución de nombres de componentes

Para resolver la referencia a un componente, EGL realiza una búsqueda que puede incluir uno o varios pasos. Se aplica lo siguiente en cada paso:
  • La búsqueda finaliza satisfactoriamente si se encuentra un componente con un nombre exclusivo
  • La búsqueda finaliza con un error si se encuentran dos componentes con el mismo nombre.
Son posibles las siguientes situaciones:
  • La referencia al componente está calificada con un nombre de paquete; en este caso, la búsqueda siempre incluye un solo paso
  • La referencia al componente no está calificada con un nombre de paquete y no es una invocación de función
  • La referencia al componente no está calificada con un nombre de paquete y es una invocación de función
Las siguientes afirmaciones apenas son importantes, pero podrían aplicarse en una de las dos últimas situaciones:
  • La propiedad containerContextDependent en la función referenciadora puede establecerse en yes. Establezca esta propiedad para ampliar el espacio de nombres utilizado para resolver referencias, como se describe en la sección containerContextDependent.
  • Si una de las funciones está visible en el programa o PageHandler y tiene un nombre que es idéntico al nombre de una función de sistema EGL, se hace referencia a esta función y no a la función de sistema.

Resolución de nombres de componentes cuando el nombre de paquete está especificado

Como se ha indicado anteriormente, puede especificar el nombre de un paquete al hacer referencia a un componente, como en el ejemplo myPackage.myPart. Se tiene en cuenta el proyecto actual, así como los proyectos listados en la vía de acceso de construcción EGL.

Si la referencia es de un componente que está dentro del mismo paquete, se aplica lo siguiente:
  • El nombre de paquete es válido pero innecesario
  • El nombre de paquete se resuelve aunque el componente esté declarado como privado

Resolución de nombres de componentes (que no sean una invocación de función) cuando el nombre de paquete no está especificado

Si un componente hace referencia a un componente que no es una función y no especifica un nombre de paquete, los pasos en el orden de búsqueda son los siguientes:
  1. Busque los componentes anidados en el mismo contenedor que en el que está anidado el componente referenciador.
  2. Busque los componentes que se han importado explícitamente en el archivo donde reside el componente referenciador. Se tiene en cuenta el proyecto actual, así como los proyectos listados en la vía de acceso de construcción EGL.

    En este caso, cada sentencia import hace referencia explícitamente a un componente concreto de un determinado paquete. El componente especificado en esta sentencia import de tipo explícito actúa como una alteración temporal del componente con el mismo nombre en el paquete actual.

    Si tiene paquetes con nombres idénticos en dos proyectos distintos, una determinada sentencia import de tipo explícito utiliza la vía de acceso de construcción EGL para realizar una búsqueda de primera coincidencia, deteniéndose cuando se encuentra el componente necesario. (El componente debe ser exclusivo de un paquete de un determinado proyecto). La presencia de un paquete con el mismo nombre en dos proyectos distintos no es un error, pero crea una situación de confusión y no se recomienda.

    Se produce un error si tiene dos sentencias import de tipo explícito que hacen referencia al mismo componente.

  3. Busque los componentes de nivel superior que están en el mismo paquete que el componente referenciador. Se tiene en cuenta el proyecto actual, así como los proyectos listados en la vía de acceso de construcción EGL. Se produce un error cuando se buscar dos componentes que tienen el mismo nombre.
  4. Busque otros componentes importados. Se tiene en cuenta el proyecto actual, así como los proyectos listados en la vía de acceso de construcción EGL.

    En este caso, cada sentencia import hace referencia a todos los componentes de un determinado paquete y se llama sentencia import de tipo comodín.

    Si tiene paquetes con nombres idénticos en dos proyectos distintos, una determinada sentencia import de tipo comodín utiliza la vía de acceso de construcción EGL para realizar una búsqueda de primera coincidencia, deteniéndose cuando se encuentra el componente necesario. (El componente debe ser exclusivo de un paquete de un determinado proyecto).

    Si más de una sentencia import de tipo comodín recupera el componente con el mismo nombre, se produce un error.

Invocación de función cuando el nombre de paquete no está especificado

Si un componente invoca una función y no especifica un nombre de paquete, los pasos en el orden de búsqueda son los siguientes:
  1. Busque las funciones anidadas en el mismo contenedor que en el que está anidado el invocador.
  2. Busque las funciones que residen en las bibliotecas especificadas en las declaraciones de uso del contenedor.
  3. Continúe la búsqueda sólo con las funciones que se incluyen en el contenedor durante la generación. (Para incluir funciones que no son las que están anidadas en el mismo contenedor o que residen en una biblioteca, establezca la propiedad de contenedor includeReferencedFunctions en .)
    La búsqueda de las funciones incluidas se realiza de la manera siguiente:
    1. Busque los componentes que se han importado explícitamente en el archivo donde reside el contenedor. Se tiene en cuenta el proyecto actual, así como los proyectos listados en la vía de acceso de construcción EGL.

      En este caso, cada sentencia import hace referencia explícitamente a un componente concreto de un determinado paquete. El componente especificado en esta sentencia import de tipo explícito actúa como una alteración temporal del componente con el mismo nombre en el paquete actual.

      Si tiene paquetes con nombres idénticos en dos proyectos distintos, una determinada sentencia import de tipo explícito utiliza la vía de acceso de construcción EGL para realizar una búsqueda de primera coincidencia, deteniéndose cuando se encuentra la función necesaria. (La función debe ser exclusiva de un paquete de un determinado proyecto). La presencia de un paquete con el mismo nombre en dos proyectos distintos no es un error, pero crea una situación de confusión y no se recomienda.

      Se produce un error si tiene dos sentencias import de tipo explícito que hacen referencia al mismo componente.

    2. Busque las funciones de nivel superior del mismo paquete que el contenedor. Se tiene en cuenta el proyecto actual, así como los proyectos listados en la vía de acceso de construcción EGL. Se produce un error si la búsqueda encuentra dos componentes con el mismo nombre.
    3. Busque otros componentes importados. Se tiene en cuenta el proyecto actual, así como los proyectos listados en la vía de acceso de construcción EGL.

      En este caso, cada sentencia import hace referencia a todos los componentes de un determinado paquete y se llama sentencia import de tipo comodín.

      Si tiene paquetes con nombres idénticos en dos proyectos distintos, una determinada sentencia import de tipo comodín utiliza la vía de acceso de construcción EGL para realizar una búsqueda de primera coincidencia, deteniéndose cuando se encuentra el componente necesario. (El componente debe ser exclusivo de un paquete de un determinado proyecto).

      Si más de una sentencia import de tipo comodín recupera el componente con el mismo nombre, se produce un error.

Invocación de programa

Cuando se invoca un programa en una sentencia call o transfer, la lista de argumentos del invocador debe coincidir con la lista de parámetros del programa invocado. Una discrepancia de argumento y parámetro produce un error.

Comentarios
(C) Copyright IBM Corporation 2000, 2005. Reservados todos los derechos.