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...
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:
SVG tiene la versión 1,
revisión 19.
YAXO, Color-Extras y
LinearAlgebra que nunca hemos solicitado.
SVG.
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.
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.
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.
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.
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
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.
Crea un paquete
TheCuisBooka partir de las dos categorías de clasesTheCuisBook-ModelsyTheCuisBook-Views. La primera contiene una claseTheBooky la segunda una claseTheBookMorph. 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.
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.
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 *.
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 pulsarupdate, se actualizará el requisito para utilizar la última versión del paquete cargado.