Tengo una aplicación muy centrada en los datos, escrita en Python/PyQt. Estoy planeando para hacer algunas refactorizaciones para separar realmente la IU del núcleo, principalmente porque todavía no existen pruebas reales, y eso claramente tiene que cambiar.Acerca de la refactorización
Ya hay algo de separación, y creo que he hecho bastantes cosas de la manera correcta, pero está lejos de ser perfecto. Dos ejemplos, para mostrar qué tipo de cosas me están molestando:
Cuando el usuario hace clic sobre la representación de un objeto de datos, el menú contextual que aparece es creado por el objeto de datos, aunque este objeto de datos (esencialmente la representación ORM de una fila de base de datos) claramente no debe tener nada que ver con la interfaz de usuario.
Cuando se escribe algo en la base de datos, pero la escritura falla (por ejemplo, porque el registro de la base de datos es bloqueado por un usuario diferente), se presenta al usuario el cuadro de mensaje clásico "reintentar/abortar". Este cuadro de diálogo es creado por el proveedor de datos *, aunque obviamente el proveedor no debería tener ninguna funcionalidad de UI. Claramente, el proveedor puede presentar una excepción o indicar una falla, y la IU puede detectar y actuar en consecuencia.
* esa es la palabra que uso para el objeto que básicamente representa una tabla de base de datos y media entre entre sus objetos de datos y el motor de la base de datos; No estoy seguro de si eso es lo que suele llamarse un "proveedor"
no tengo experiencia con las pruebas, así que no fácilmente "sentir" los problemas de la capacidad de prueba o similares, pero antes Me meto en eso, hay que hacer una reorganización.
No hay una complicada lógica de negocios involucrada (principalmente es CRU
D
, sí, incluso sin la D), y esto sería mucho más reorganizador que reescritura, así que no estoy realmente preocupado por la introducción de errores de regresión como discutido en this question.
Mi plan es comenzar a refactorizar con la idea en mente de que la parte de la IU podría fácilmente ser arrancada para ser reemplazada por, digamos, una interfaz web o una interfaz basada en texto en lugar de la interfaz Qt. Por otro lado, Qt aún sería utilizado por el núcleo, porque el mecanismo de señal/ranura se utiliza en bastantes lugares, p. Ej. los objetos de datos emiten una señal changed
para indicar, bueno, ya sabes qué.
Entonces, mi pregunta: ¿Es ese un enfoque factible para aumentar la capacidad de prueba y la mantenibilidad? ¿Alguna otra observación, especialmente con Python en mente?
¡Esa es una idea interesante, me encanta! ¿No tiene alguna fuente o sugerencia sobre el despachador? Es decir. diferentes posibilidades de implementación, posibles advertencias, experiencias, etc.? – balpha
Dispatcher pasaría todas las llamadas API a todos los subsistemas como administrador de caché, validador, correlacionador de URL ... Así que el despachador pasa la llamada API, contexto, argumentos a cada uno de los subsistemas (dependiendo de ciertas reglas) y finalmente invoca la API si necesario. Inicialmente, intentamos tener un diseño genérico de distribuidor para permitir el registro de subsistemas, pero más tarde se resolvió para el despachador que tenga conocimiento de cómo tratar con los subsistemas. Desafortunadamente, este marco para aplicaciones centradas en API es una fuente cerrada, pero el efecto es algo así como una pila de decoradores para cada API, pero de forma implícita. – Shekhar
También se jugó un papel muy importante para determinar y pasar el contexto. – Shekhar