Hace un tiempo el director del coro Monseñor Zazpe, de la parroquia San José, me pidió algo para administrar las asistencias de los coristas. Empecé a desarrollar un programa en Mono con Gtk#. Luego de algunas dificultades que tuve para que funcione bien en Windows, me decidí por un camino más seguro: Windows.Forms. Él (la persona que me pidió este programa) trabaja en Windows, así que eso hizo que definitivamente me incline por ese toolkit.
Ahora estoy arrepentido 🙁 Luego, después de que la interfaz esté bastante avanzada, me di cuenta de por qué aquellas pruebas con Gtk en Windows no funcionaron. Pero bue… ya está, quizá mas adelante haga algo.
UPDATE: Pueden visitar ésta página con más información al respecto
Con Zazpe (le puse ese nombre al programita) podemos ingresar personas y eventos, para luego ir registrando las asistencias a dichos acontecimientos, y también generar informes para imprimir. Esto último todavía no está totalmente implementado, y me falta escoger una forma cómoda de setear las asistencias.
Hace unas semanas, cuando me senté un rato a continuar con esto, me pregunté sobre una forma rápida para corregir los bugs del programa. Por más que uno pruebe lo que hace, siempre el que lo termina usando encuentra una forma de hacer explotar todo. Seguramente cuando le envíe alguna revisión, va a saltar una excepción y el programa se va a cerrar. No puedo pedirle que me haga un informe de error, que me cuente lo que estaba haciendo en el momento del error, porque es mucho quilombo para él.
Copiándole un poco el sistema a Windows y a Ubuntu, lo que hago es ir armando un informe a medida que la aplicación avanza en su ejecución. Así, registro los datos que fueron ingresados, los formularios que se cargaron, etc. Todo esto se va guardando en un archivo de texto plano. Cuando salta una excepción no capturada, le informa al usuario que ha ocurrido un error, y le pide que envíe el archivo de informe a mi mail. De esta forma, puedo verificar exactamente (bueno, casi) lo que estaba pasando, los datos ingresados, la excepción que saltó y su stacktrace. Para un software más serio, quizá esto sea demasiado “espía”.
Para hacerlo, lo que hice fue declarar una clase (subclase de Windows.Forms.Form), FormLogging, de la cual heredan todos los formularios. Ésta es la clase encargada de realizar todo el log de lo que pasa en el form. Se encarga de setear los event handlers de los controles que me interesan (como los TextBoxes, ComboBoxes, etc) para que registren lo que pasa. Todo este trabajo es totalmente transparente para los formularios que son subclases.
Un ejemplo de log sería el siguiente:
Carga: MainForm Carga: IngresarPersona txtDNI: 123456 cmbSexo: Hombre txtApellido: Pividori txtNombre: Milton btnCancelar presionado Salida: IngresarPersona Carga: AcercaDe Salida: AcercaDe Carga: IngresarEvento btnCancelar presionado Salida: IngresarEvento Carga: IngresarPersona txtDNI: 1111 cmbSexo: Hombre txtApellido: Pividori txtNombre: Milton btnAceptar presionado Excepción no capturada: Tipo: Zazpe.Personas.PersonaExistenteException Mensaje: Se está intentando ingresar una persona que ya existe en la base de datos. Source: ControladorPersonas StackTrace: ...
En él vemos que el usuario quizo ingresar una persona, agregó algunos datos, pero luego se arrepintió y cerró la ventana con el botón Cancelar. Luego le pegó un vistazo al formulario Acerca de. Pensó ingresar un evento, pero cambió de opinión luego. Después de ir a atender el timbre (había pedido una pizza, porque no tenía nada en la heladera para comer) :D, pensó que era una buena idea agregarme, después de todo, a la lista de personas, pero se olvidó de que ya lo había hecho antes… y yo me olvidé de capturar la excepción PersonaExistenteException al intentar ingresar una persona a la base de datos.
Volviendo al tema de Gtk#, no sería difícil portarlo a GNU/Linux. A la mayor parte la desarrollé en este sistema, con Mono. También utilicé NUnit para el unit testing, y SQLite como base de datos.
Dentro de poco voy a agregar una página a este blog con más información sobre Zazpe, y un link para bajar los fuentes.
Si más adelante quisiera desarrollar otro ABM, tendría que tomar mucho de lo que hice en Zazpe, y modificarlo, ya que es muy similar. ¿No conocen algún framework para automatizar esto? Me comentaron algo sobre Turbo Gears y leí de Ruby on Rails, pero estoy más interesado en que el resultado final sea una aplicación de escritorio, no una web.