Render

Hace unos días os comenté en qué consistía el patrón Visitor, que es el que voy a utilizar para realizar los render de preguntas. Un render es una representación en un formato específico de una pregunta. En mi caso, habrá tres tipos de render:

  1. HTML
  2. LaTeX
  3. GTK

La renderización en GTK permitirá la edición de una pregunta.

Validando tipos de pregunta

Anteriormente tenía varias funciones que validaban si los datos introducidos en el formulario para crear un tipo de pregunta eran correctos, exprimiendo un poco viendo los argumentos comunes y gracias a las facilidades de Python conseguí crear una función que validaba cualquiera de los tipos de pregunta de los que dispone el sistema, moviendo esta función a un módulo nuevo de validación. Después de hacer el esfuerzo, me di cuenta que muchas veces complicarse a la hora de crear un método (para no repetir código) no es la mejor opción, ya que complica su posterior modificación o extender la validación a otro tipo de preguntas.

Por lo tanto, finalmente, he creado una clase validator, que valida los parámetros comunes y luego subclases para validar cada tipo de pregunta específico.

Patrón Visitor

En programación orientada a objetos, el patrón visitor es una forma de separar el algoritmo de la estructura de un objeto.

La idea básica es que se tiene un conjunto de clases elemento que conforman la estructura de un objeto. Cada una de estas clases elemento tiene un método aceptar (accept()) que recibe al objeto visitador (visitor) como argumento. El visitador es una interfaz que tiene un método visit diferente para cada clase elemento; por tanto habrá implementaciones de la interfaz visitor de la forma: visitorClase1, visitorClase2visitorClaseN. El método accept de una clase elemento llama al método visit de su clase. Clases concretas de un visitador pueden entonces ser escritas para hacer una operación en particular.

Cada método visit de un visitador concreto puede ser pensado como un método que no es de una sola clase, sino de un par de clases: el visitador concreto y clase elemento particular. Así el patrón visitor simula el envío doble (en inglés este término se conoce como Double-Dispatch) en un lenguaje convencional orientado a objetos de envío único (Single-Dispatch), como son Java o C++.

El patrón visitor también especifica cómo sucede la interacción en la estructura del objeto. En su versión más sencilla, donde cada algoritmo necesita iterar de la misma forma, el método accept de un elemento contenedor, además de una llamada al método visit del objeto visitor, también pasa el objeto visitor como argumento al llamar al método accept de todos sus elementos hijos.

Este patrón es ampliamente utilizado en intérpretes, compiladores y procesadores de lenguajes, en general.