9.5 Flujo de trabajo diario

Para nuestro juego Spacewar!, creamos un archivo de paquete dedicado Spacewar!.pck.st. Esta es la forma de proceder al escribir un paquete externo: definir un paquete dedicado y, de vez en cuando, guardar el trabajo con el botón save de la herramienta Installed Packages (véase Véase Figura 2.3).

Cuis-Smalltalk utiliza GitHub para alojar, versionar y comparar su desarrollo principal, así como para gestionar un conjunto de paquetes externos (es decir, código que se mantiene de forma independiente y fuera de Cuis-Smalltalk, pero que está estrechamente relacionado con él).

Los archivos del paquete son archivos de texto simples, codificados para el alfabeto latino (ISO 8859-15) y gestionados sin problemas por GitHub. Cuis-Smalltalk utiliza la convención de salto de línea LF (código ASCII 10), tal y como prefiere GitHub. Esto permite a Git/GitHub comparar versiones y fusionar ramas.

Se utilizan repositorios GitHub independientes para los proyectos, es decir, paquetes o conjuntos de paquetes estrechamente relacionados que siempre se cargan y mantienen juntos como un todo.

Tu flujo de trabajo diario con Cuis-Smalltalk para desarrollar un paquete externo será similar al siguiente:

  1. Comienza con una imagen Cuis estándar y nueva. No guardes nunca la imagen.
  2. Configura tu sistema de control de versiones preferido para gestionar tus paquetes externos. Se recomienda utilizar un repositorio GitHub cuyo nombre comience por «Cuis-Smalltalk-», para que sea fácil de encontrar. Pero, aparte de esta consideración, puedes utilizar cualquier otro sistema de control de versiones.
  3. Instala los paquetes necesarios desde los repositorios Git de Cuis-Smalltalk.
  4. Desarrolla. Modifica y/o crea paquetes.
  5. Guarda tus propios paquetes (en tus repositorios preferidos).
  6. add / commit / push según corresponda a tu sistema de control de versiones
  7. Cambios de archivo que no forman parte de ningún paquete. Estos se capturan automáticamente en conjuntos de cambios numerados, separados de los cambios en los paquetes.
  8. Sal de la imagen. Normalmente sin guardar.

 note No guardar la imagen es simplemente un consejo de buenas prácticas para cuando tu objetivo principal sea crear código nuevo. Ya hemos hablado de las advertencias sobre guardar la imagen en relación con la gestión del código (Véase La imagen). Pero, de vez en cuando, te encontrarás en la posición de un explorador cuando abras varios navegadores de código y lugares de trabajo para averiguar algo. En este caso, el estado del sistema, las ventanas abiertas y los fragmentos de código contienen el valor que te interesa, y guardar la imagen es la forma correcta de preservar el estado del sistema.28

9.5.1 Automatiza tu imagen

Como se describe en el flujo de trabajo diario, es una buena costumbre no guardar toda la imagen, sino solo el paquete modificado del código fuente editado. Sin embargo, cada vez que iniciamos una sesión de programación, resulta tedioso configurar la imagen para que se adapte a nuestras necesidades y gustos personales.

Las cosas que uno puede querer personalizar en la imagen son:

Queremos registrar estas preferencias de imagen en un script setUpEnvironment.st que se ejecutará al inicio. En GNU/Linux, se le pide a Cuis-Smalltalk que ejecute un script con el -s, por ejemplo squeakVM Cuis5.0.image -s setUpEnvironement.st, donde setUpEnvironement.st. es un archivo que contiene código Smalltalk. Un ejemplo real podría ser:

../cogspur/squeak Cuis5.0-4426 -s ../scripts/setUpEnvironment.st

Describimos en detalle un ejemplo de script de configuración que organiza el entorno, tal y como se muestra en la Figura 9.13. Es interesante el código Smalltalk que se adentra en áreas heterogéneas de Cuis-Smalltalk, como las herramientas de desarrollo, el sistema Morph, las preferencias y el manejo de colecciones.

ch10-ImageSetUp

Figura 9.13: Entorno de una imagen iniciada con el script de configuración

Empecemos por cerrar las ventanas abiertas. El código se coloca en un bloque al que se le envía el mensaje #fork para esperar a que el entorno se inicialice correctamente.

| world morph area extent | 
world := UISupervisor ui.
[
    | area extent morph | "used later"
    UISupervisor whenUIinSafeState: [
        children := world submorphs reject: [:aMorph | aMorph is: #TaskbarMorph].
        children do: [:child | child delete].
    ]
] fork

Todo el entorno de interfaz de usuario de Cuis-Smalltalk es un tipo de Morph, una instancia de WorldMorph. Sus submorphs son ventanas, menús, la barra de tareas o cualquier tipo de morph con el que el usuario pueda interactuar. Para acceder a esta instancia de WorldMorph, se solicita al UISupervisor con el mensaje #ui. Una vez seleccionados todos los morphs del mundo excepto la barra de tareas –en realidad, #reject:–, los #delete del mundo.

A continuación, cambiamos las preferencias. Coloca el siguiente código después de la línea anterior que elimina los hijos.

"Change to Dark theme"
Feature require: #'Theme-Themes'.
DarkTheme beCurrent.
"Adjust font size"
Preferences at: #defaultFontSize put: 12.
"Adjust taskbar size"
morph := UISupervisor ui taskbar.
morph scale: 1 / 2.
Display fullScreenMode: true.
self runningWorld doOneCycleNow.

Necesitamos el paquete Theme-Themes; como no está instalado en la imagen predeterminada, se buscará en el disco para su instalación. En cuanto al acceso a la barra de tareas, recuerde que hemos eliminado todos los morphs excepto la barra de tareas del mundo, por lo que la barra de tareas es realmente la primera de la colección de submorphs del mundo. Por último, actualizamos la escala de la barra de tareas y solicitamos a Cuis-Smalltalk que se muestre a pantalla completa. Como hemos cambiado varias partes visuales, solicitamos un ciclo de actualización del entorno (es decir, el mundo en ejecución en la terminología de Cuis-Smalltalk).

Antes de instalar las herramientas, le preguntamos a un RealEstateAgent el área libre. Lamentablemente, este agente no tiene en cuenta el área ocupada por la barra de tareas, por lo que debemos ajustar su respuesta. A continuación, calculamos una cuarta parte de esta extensión de área libre (la mitad del ancho y la mitad del alto constituyen una cuarta parte del área libre total):

Coloca el siguiente código después del código anterior.

"Compute the available free space for windows placement"
area := RealEstateAgent maximumUsableArea
   extendBy: 0 @ morph morphHeight negated.
extent := area extent // 2.

Ahora estamos listos para instalar algunas herramientas. Los tres primeros navegadores ocupan cada uno una cuarta parte de la pantalla:

"Open a few System Browsers"
Browser open
   morphPosition: 0 @ 0;
   morphExtent: extent.
Browser open
   morphPosition: area width // 2 @ 0;
   morphExtent: extent.
"Open a System Browser on a specific class"
morph := Browser open
   morphPosition: area extent // 2;
   morphExtent: extent.
morph model setClass: Integer selector: nil.

A continuación, en el cuarto restante libre, instalamos un espacio de trabajo que ocupa dos tercios del área y una transcripción que ocupa un tercio. El espacio de trabajo se instala con algunos contenidos predeterminados. Tenemos que hacer un pequeño truco porque, al solicitar un nuevo espacio de trabajo, Cuis-Smalltalk no responde a la instancia creada, por lo que tenemos que buscarla en las ventanas del mundo.

Coloca el siguiente código después del código anterior.

"Open a Workspace with some default contents"
morph := Workspace open.
morph model actualContents: '"Some code"
1 + 2.
"Other code"
5 * 3.'.
morph
   morphPosition: 0 @ (area height // 2);
   morphExtent: extent x @ (2 / 3 * extent y).
"Open a transcript for logs"
Transcript open
   morphPosition: 0 @ (area height // 2 + (2 / 3 * extent y));
   morphExtent: extent x @ (1 / 3 * extent y).

Por supuesto, debes ajustar el argumento del mensaje #actualContents: a un código significativo para tu uso.


Notas al pie

(28)

Para obtener más información sobre la política de guardado de imágenes, lee este debate en la comunidad Cuis aquí y aquí