2.6.1.- Comenzando el diseño

cdLas tres exigencias, actualizar, buscar y mostrar los datos, requieren un sencillo menú. Todos los datos que ha de almacenar son textuales, y si su colección de CD no es muy amplia, no necesitará una base de datos compleja, así que será suficientes con varios archivos de texto sencillos. Al almacenar la información en archivos de texto la aplicación será sencilla, y si sus necesidades cambian, casi siempre le resultará más fácil manipular un archivo de texto que cualquier otro archivo. Finalmente, puede usar incluso un editor para introducir o eliminar  los datos manualmente, en vez de escribir un programa que lo haga.

Tomaremos una importante decisión sobre el modo de almacenar los datos: ¿será suficiente con un único archivo? En caso afirmativo ¿que formato debería tener? A excepción de los datos sobre las pistas de audio, la mayoría de información que desea almacenar tiene lugar una única vez por CD (omitiremos el hecho de que algún CD participan varios compositores o artistas). Todos los CD tienen más de una pista.

¿Debería establecer un límite en el número de pistas que se puedan guardar por CD? Parece una restricción arbitraria e innecesaria, así que nos quitaremos esa idea de la cabeza.

Si queremos permitir un número de pistas flexible, tenemos tres opciones:

  • Usar un único archivo, con una línea para la información del tipo “título” y después “n” líneas para la información de pistas del CD.
  • Introducir toda la información sobre cada CD en una línea, permitiendo que la línea continúe hasta que ya no haya que almacenar más información.
  • Separar la información relativa al título de la información de cada pista y usar un archivo diferente para cada una.

Únicamente la tercera opción le permite configurar fácilmente el formato de los archivos, lo cual tendrá que hacer si desea convertir alguna vez su base de datos en una forma relacional (más adelante veremos más información sobre este tema), por eso es la opción que vamos a escoger.

Lo siguiente es decidir lo que introduciremos en los archivos.

En primer lugar, para cada título de CD, vamos a introducir la siguiente información:

  • El número de catálogo de cada CD.
  • El título.
  • El tipo (clásica, rock, pop, jazz, etc).
  • El compositor o artista.

Para las pistas, introducirá solamente dos elementos:

  • El número de pista.
  • El título de la pista.

Para unir ambos archivos, tiene que relacionar la información de las pistas con el resto de información del CD. Para hacerlo, usará el número de catálogo del CD. Como es un número único para cada CD, aparecerá una sola vez en el archivo de títulos y una vez por cada pista en el archivo de pistas.

Veamos un archivo de títulos y de pistas a modo de ejemplo:

archivo_titulo_pistasAmbos archivos se unen usando el campo Catálogo. Recuerde que el archivo de pistas suele haber varias filas y en el archivo de títulos únicamente

La última decisión que hay que tomar es cómo separar las entradas. En una base de datos relacional son comunes los campos fijados en la base al ancho, pero no es siempre la mejor opción. Otro método muy común, usado para este ejemplo, es una coma (por ejemplo, variables separadas por coma, o CSV, archivo).

Una aplicación de CD

Para no perdernos por completo veamos las funciones que usaremos seguidamente:

get_return()
get_confirm()
set_menu_choice()
insert_title()
insert_track()
add_record_tracks()
add_records()
find_cd()
update_cd()
count_cds()
remove_records()
list_track()

  1. En primer lugar en el script aparece, como siempre, una línea asegurando que se ejecuta como un script shell, seguida de información del copyright:
    aplicacion_1
  2. Ahora debe comprobar que las variables globales que va a usar a lo largo del script, estén configuradas. Configure los archivos de títulos y de pistas y un archivo temporal, y presione CTRL-C, para que su archivo temporal desaparezca si el usuario interrumpe el script:
    aplicacion_2
  3. Defina las funciones, para que el script, ejecutándose desde la primera línea, pueda encontrar todas las definiciones de funciones antes de que usted pueda solicitarlas por primera vez. Para no tener que volver a escribir el mismo código en varias partes, las dos primeras funciones son utilidades sencillas:
    aplicacion_3
  4. Aquí aparece la función principal del menú, set_menu_choice. Los contenidos del menú varían dinámicamente, con opciones extra que se añaden si se selecciona una entrada de menú:
    aplicacion_nota_1aplicacion_4
  5. Aquí aparecen dos funciones muy breves, insert_title e insert_track, para añadir a los archivos de la base de datos. Están seguidas por la extensa función add_record_track que hace uso de ellas. Esta función usa la correspondencia de patrones para comprobar que no introducen comas (porque las estamos usando como separadores de campos) y también usa las operaciones aritméticas para aumentar el número de pistas actuales a medida que éstas se van introduciendo:
    aplicacion_5
  6. La función add-records permite introducir información principal del CD sobre un nuevo CD:
    aplicacion_6
  7. La función find_cd busca el nombre del catálogo en el archivo de títulos de CD, usando el comando grep. Es necesario saber cuantas veces encontró la cadena, pero grep envía un valor que indica únicamente si fueron 0 veces o muchas. Para solucionarlo, guarde los datos de salida en un archivo, que tendrá una sola línea por correspondencia, y después cuente las líneas por archivo.El comando de contabilización de palabras, wc, tiene espacios en blanco en las salidas para separar los números de líneas, las palabras y los caracteres de cada archivo. Use la notación $(wc -q $temp_file) para extraer el primer parámetro de la salida con el fin de configurar la variable linesfound. Si desea otro parámetro posterior, debería usar el comando set para configurar las variables de parámetros de la shell para la salida de comando.Cambie el IFS (Internal Field Separator, Separador de Campo Interno) por una coma para que pueda separar los campos delimitados por comas. Un comando alternativo es cut.
    aplicacion_7
  8. update_cd le permite volver a introducir información sobre un CD. Tenga en cuenta que está buscando (mediante grep) líneas que comiencen ( ^ ) con $cdcatnum seguido de “," y que tiene que introducir la expansión de $cdcatnum en { } para poder buscar “," sin espacios en blanco entre la coma y el número de catálogo. Esta función también usa { } para adjuntar varias sentencias que se ejecutarán si get_confirm envía true.
    aplicacion_8
  9. count_cds proporciona un rápido recuento de los contenidos de la base de datos:
    aplicacion_9
  10. remove_records elimina entradas de los archivos de la base de datos usando grep -v para eliminar todas las cadenas de correspondencia. Tenga en cuenta que tiene que usar un archivo temporal.Si intentó usar:
    aplicacion_10_ael redireccionamiento de salida > configuraría $title_file como vacío antes de que grep pudiese ejecutarse, de manera que grep leería un archivo vacío.
    aplicacion_10_b
  11. De nuevo, list_tracks usa grep para extraerlas líneas deseadas, cut para acceder a los campos deseados y more para proporcionar una salida paginada. Si tiene en cuenta el número de líneas en C que supondría volver a implementar estas extrañas 20 líneas de código, entenderá lo poderosa que puede llegar a ser una herramienta shell.
    aplicacion_11
  12. Ahora con todas las funciones definidas, podemos introducir la rutina principal. Las primeras líneas llevan los archivos a un estado conocido, después solicita la función del menú, set_menu_choice, y actúa en la salida.
    Cuando se selecciona quit, se elimina el archivo temporal, se esccribe un mensaje, y se sale con una condición de finalización con éxito:
    aplicacion_12

Resumen

En este capítulo, ha visto que la shell es un potente lenguaje de programación de pleno derecho. Su capacidad para evocar fácilmente a otros  prtogramas y después procesar sus datos de salida, hacen que la shell sea una herramienta ideal para tareas que conlleve3n el procesamiento de textos y archivos..

 

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s