9.4 El paquete

Un paquete puede contener un conjunto de clases que forman parte de la misma categoría de clases.

Guardemos nuestra categoría Morphic-Learning como un paquete utilizando nuestro navegador de paquetes instalados.

...Menú World → Open...Installed Packages...

ch10-Package-with-requirement

Figura 9.7: Browser de paquetes instalados

Fíjate en que antes hemos llamado a Feature require: 'SVG'. Al mirar los nombres de los paquetes, podemos observar varias cosas interesantes:

Esto es importante. Cuando se requiere una función empaquetada, es posible que se especifique que también se necesitan otros paquetes para que funcione correctamente y, de hecho, que se especifique que dichos paquetes deben tener un nivel de versión específico.

Esta es la clave para poder componer de forma segura paquetes que tienen requisitos.

Vale, hagamos clic en el botón New y escribamos Morphic-Learning en el cuadro de diálogo. Esto da como resultado un nuevo paquete con el mismo nombre que nuestra categoría Morphic-Learning. Ten en cuenta que se trata de la versión 1, revisión 0 (1.0 a la derecha) y que el paquete aún no se ha guardado.

ch10-NewPackage-Morphic-Learning

Figura 9.8: Nuevo paquete – Morphic-Learning

Supongamos que en nuestro morph de reloj queremos utilizar colores nombrados como en el paquete Color-Extra. Para poder cargar nuestro paquete Morphic-Learning, que hace uso de esto, debemos seleccionar nuestro nuevo paquete y hacer clic en el botón add Requirement (añadir requisito) situado en el centro, a la derecha.

Esto muestra una lista de paquetes cargados entre los que elegir.

ch10-Add-Requirement

Figura 9.9: Seleccionar el paquete (o la versión base de Cuis) que se necesita

Ahora, cuando guardamos (save) nuestro paquete, vemos la ruta donde se ha creado el archivo del paquete. Ahora podemos enviar este archivo por correo electrónico de forma segura, registrarlo en un sistema de control de versiones y hacer una copia en nuestra memoria USB de respaldo.

ch10-Saved-with-requirement

Figura 9.10: Paquete guardado – Morphic-Learning

Como se mencionó anteriormente, los archivos de paquetes son simplemente archivos de texto con un formato especial que Cuis-Smalltalk sabe cómo cargar. Si abre un navegador File List y ve el archivo del paquete, verá información sobre cómo se creó el paquete, qué proporciona y qué requiere y, si rellenó el cuadro de comentarios en el navegador Installed Packages, una descripción.

 CuisLogo Escribe «Morphic Toys» en el cuadro de comentarios, vuelve a guardar el paquete y (re)selecciona el paquete en una lista de archivos para ver la descripción del paquete.

Ejercicio 9.1: Describir un paquete

 CuisLogo Si aún no lo has hecho, crea y guarda un Paquete Spacewar!. No hay requisitos adicionales que especificar.

Ejercicio 9.2: Guardar el paquete Spacewar!

Hay otras cosas interesantes que podemos hacer con los paquetes. Podemos incluir varias categorías de clases en un solo paquete. Supongamos que queremos dividir nuestras clases CuisBook en dos categorías TheCuisBook-Models y TheCuisBook-Views. Un nuevo paquete creado con el nombre TheCuisBook incluye estas dos categorías de clases; esta etiqueta es un prefijo para buscar las categorías coincidentes que se incluirán en el paquete.

Normalmente, un paquete viene con varias categorías para organizar las clases en dominios que coincidan. Recomendamos hacerlo así. Cuando una aplicación o un framework crece, para mantener una organización sólida, es posible que sientas la necesidad de remodelar las categorías de clases: renombrar, dividir, fusionar, etc. Siempre que mantengas el mismo prefijo en las categorías de clases y el nombre del paquete, sus clases estarán seguras en el mismo paquete. En el Browser del sistema, puedes arrastrar y soltar cualquier clase en cualquier categoría de clases para reorganizarla.

 CuisLogo Crea un paquete TheCuisBook a partir de las dos categorías de clases TheCuisBook-Models y TheCuisBook-Views. La primera contiene una clase TheBook y la segunda una clase TheBookMorph. Guarda el paquete en el disco.

Ejercicio 9.3: Dos categorías de clases, un paquete

Imaginemos que necesitamos imprimir el número de página del índice de TheBook en números romanos minúsculos, tal y como hacemos con la versión impresa de este libro. El código es muy sencillo:

4 printStringRoman asLowercase
⇒ 'iv'

En lugar de invocar esta secuencia de mensajes cada vez que la necesitamos, añadimos un mensaje específico a la clase Integer:

Integer>>printStringToc
   ^ self printStringRoman asLowercase

Ahora, dentro de los métodos de nuestro TheBook, sólo haremos cosas como:

../..
 aPage := Page new.
 aPage number: 1 printStringToc.
 ../..

Ahora nos enfrentamos a un problema. Para satisfacer las necesidades del paquete TheBook, ampliamos la clase Integer con un método printStringToc, sin embargo, esta adición al método forma parte del sistema central de Cuis-Smalltalk y su conjunto de cambios predeterminados asociado. Véase Figura 9.11, la herramienta Change Sorter lo muestra exactamente.

ch10-ChangeSetToCore

Figura 9.11: Change Sorter, método complementario al núcleo

Por lo tanto, al guardar nuestro paquete TheBook, este método no se incluye y se pierde al salir de Cuis-Smalltalk. Para incluirlo en nuestro paquete, lo clasificamos en una categoría de métodos con el prefijo *TheCuisBook. *TheCuisBook-printing es un buen candidato. En el panel de métodos del Browser del sistema, sobre printStringToc, haz ...Menú contextual → more...change category... y escribe *TheCuisBook-printing.

Ahora el Change Sorter escribe sobre Integer>>printStringToc: Method was moved to some other package (método movido a algún otro paquete). Las herramientas de Installed Packages nos dicen ahora que hay una extensión, utiliza su botón browse para obtener una actualización de los contenidos del paquete.

ch10-BrowsePackageChange

Figura 9.12: Paquete con extensión a la clase Integer de la categoría de clases del sistema Kernel-Numbers

Fíjate en cómo cada categoría –clase o método– de una extensión lleva un prefijo *.

 note Además de añadir un requisito de precarga de paquetes, también puedes seleccionar un requisito y borrar (delete) o actualizar (update) utilizando los botones de la parte inferior derecha. A veces, un paquete cambia y su código depende de él, por lo que tiene que cambiar su código para adaptarse. Cuando esto ocurre, es importante asegurarse de que se requiere la versión más reciente y modificada. Al seleccionar un requisito y pulsar update, se actualizará el requisito para utilizar la última versión del paquete cargado.