En ActionScript 3.0 todas las clases deben ser colocadas en paquetes. Un paquete (o package) es una manera de organizar clases en grupos, y en ActionScript 3.0 un paquete es sinónimo a un directorio del sistema de archivos. Los paquetes se ordenan relativamente al classpath, el cual es definido como una ruta relativa al proyecto (el archivo .fla en el caso de Flash). Por lo tanto, el paquete top-level es sinónimo de la raiz del proyecto. La declaración del paquete es siempre la primera sentencia que aparece en un fichero de claso; un ejemplo de su sintaxis en la que sigue:

package name {
 
}

Cuando la clase es definida como parte del paquete top-level, el nombre del paquete no necesita ser especificado. En estos casos, la declaración del paquete es la siguiente:

package {
 
}

Cuando el archivo de clase es guardado dentro de un subdirectorio, el nombre del paquete se corresponde con la ruta relativa del subdirectorio usando puntos (.) entre cada directorio. Por ejemplo, si es archivo es guardado en un subdirectorio (relativo a la raiz del proyecto) llamado example, entonces la declaración del paquete es:

package example {
 
}

Si el archivo de clase es guardado en un subdirectorio de example llamado subpackage, la declaración del paquete será:

package example.subpackage {
 
}

Los paquetes son una parte importante en el trabajo con clases porque permiten aseguarte que tus clases no entrarán en conflicto con otras clases. Por ejemplo, es posible que dos desarrolladores escribieran dos clases diferentes y las nombraran MessageManager. Las dos clases tendrían el mismo nombre pero se utilizarían para diferentes tareas. Una administraría emails mientras que la otra administraría mensajes binarios de sockets. No puedes tener dos clases con el mismo nombre en el mismo ámbito. Si lo tuvieras, el compilador no sabría cual de ellas usar. Una opción es usar siempre nombres de clases únicos.

En este ejemplo, podrías nombrar las clases EmailManager y BinarySocket, pero hay buenas razones por lo que esto no siempre es posible. Como que un proyecto podría usar potencialmente cientos de clases, esto dificultaría mucho el asegurar nombres únicos a las clases. Además, muchos proyectos utilizan librerías de código ya escritas, y no podrías modificar mucho de estas clases. Ya que muchas clases de la librería tendrían dependencias con otras clases, sería muy difícil modificar el nombre de estas clases. Ahí es donde los paquetes hace las cosas más sencillas. Piensa que no puedes tener dos clases con el mismo nombre en el mismo directorio, pero puedes tener tantas clases con el mismo nombre como quieres, si éstas se encuentran en diferentes directorios. Los paquetes te permiten colocar un MessageManager en el paquete net.messaging.email y el otro en el paquete net.messaging.binarysocket.

Aunque los nombres de paquetes anteriores serían inicialmente unas buenas opciones, es posible usar un nombre de paquete mejor para asegurar una probabilidad mayor de unicidad. Generalmente es mejor usar nombres de paquetes que se correspondan con el autor y/o un proyecto relevante. Por convención, los nombres de paquete empiezan con nombres de dominio en orden inverso. Por ejemplo, si yo (davidvalverde.com) escribo clases en ActionScript 3.0, guardaría todas las clases en el paquete com.davidvalverde (o un subpaquete de com.davidvalverde). De esta manera, me aseguro de la unicidad de los nombres de las clases (no creo que nadie más que yo use el paquete com.davidvalverde para organizar sus clases XD ).

Cuando las clases forman parte de una libería común usada para muchos proyectos dentro de la compañía/organización entonces pueden ser colocadas en subpaquetes directamente dentro del paquete principal. Por ejemplo, si las clases anteriormente mencionadas MessageManager forman parte de una libería común usada por muchas aplicaciones que yo desarrolle, entonces deberían guardarse en los paquetes com.davidvalverde.net.messaging.email y com.davidvalverde.net.messaging.binarysocket. Cuando una clase forma parte de una aplicación específica, debería guardarse dentro de un subpaquete específico de esa aplicación. Por ejemplo, tengo una aplicación llamada WidgetStore. Si la aplicación WidgetStore usa una clase llamada ApplicationManager, entonces esta debería ser guardada dentro de com.davidvalverde.widgetstore o un subpaquete de este paquete.

Por cierto, por convención los nombres de los paquetes empiezan siempre con letra minúscula.

Los archivos de clase siempre son guardados en la ruta de directorios que se corresponde con el paquete de la clase. Por ejemplo, com.davidvalverde.net.messaging.email.MessageManager debe ser guardado en com/davidvalverde/net/messaging/email/MessageManager.as. El compilador sabe buscar clases dentro de la ruta que indica el paquete. Sin embargo, el compilador tambien debe conocer donde buscar el directorio top-level que contiene los subdirectorios. En el ejemplo, el compilador necesita saber donde se encuentra el directorio com dentro del sistema. El compilador sabe donde buscar por algo llamado classpath. El classpath por defecto para cualquier proyecto Flex o Flash incluye el directorio del proyecto. Por ejemplo, el directorio com es guardado en el mismo directorio que el archivo .fla (Flash), entonces el compilador encontrará las clases. Sin embargo, podrías querer guardar los ficheros en un directorio diferente. Por ejemplo, si tienes una librería común usada por muchos proyectos, seguro que querías guardar esa librería en un lugar mejor que estar copiándola para cada proyecto. Puedes añadir y editar el classpath para que el compilador conozca donde buscar todas tus clases.

En Flash, puedes editar el classpath tanto a nivel de proyecto como globalmente. A nivel de proyecto, selecciona Archivo>Configuración de publicación, y selecciona el botón Configuración… de ActionScript en la pestaña Flash. Para el classpath global, selecciona Edición>Preferencias, y selecciona el botón Configuración… de ActionScript. Ambos abren una ventana de diálogo similar que te permite editar el classpath. Tu puedes seleccionar el botón + para añadir un nuevo directorio al classpath. Por ejemplo, si el directorio com para la librería está guardado en c:\libraries, entonces deberías añadir c:\libraries al classpath.

Un comentario en “AS3: Packages

  1. Tengo una duda terrible en cuanto a los paquetes. ¿Deben estar los paquetes de las clases en el mismo nivel que el archivo .fla?.
    Tengo clases dentro de un directorio y cuando las llamo desde un .fla que está al mismo nivel que el paquete funciona. Si coloco el archivo .fla en un directorio, en el que para encontrar la clase deba subir, aun cambiando la configuración global de la búsqueda de la clase me da error.

Pon un comentario

Tu dirección de email no será publicada.

Puedes usar estas etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>