¿Debo crear una pila de deshacer en el modelo o su contenedor?

7

Estoy creando una aplicación (Python / PyQt). El elemento de primer orden será una vista / modelo de árbol con muchas funciones de ayuda para agregar nuevos elementos, moverlos en el árbol, etc. Luego, tendré un objeto de ventana principal que básicamente servirá como envoltorio para el árbol. Esta ventana principal tiene una barra de herramientas con botones para que el usuario agregue / elimine / mueva elementos (estos botones llaman a los métodos auxiliares integrados en el objeto del árbol).

Ya casi está hecho, pero, por desgracia, he decidido agregar la funcionalidad deshacer / rehacer usando marco de deshacer de Qt . Es la primera vez que utilizo la funcionalidad de deshacer / rehacer, y tengo curiosidad por saber si hay un consenso / experiencia sobre si implementar la pila de deshacer en el envoltorio de la ventana principal, o insertar los detalles en la parte interna de la clase de árbol. Puedo ver yendo de cualquier manera.

Inicialmente puse la funcionalidad de deshacer la pila en la envoltura, así podría mantener mi árbol más simple, y estaba pensando que deshacer / rehacer es en gran parte una envoltura simple, no algo que quisiera incluir en la funcionalidad de árbol en sí.

Cuando comencé, sin embargo, me di cuenta de que parecía estar rompiendo la modularidad, y debido a la forma en que se implementan estas clases de deshacer (son bastante complicadas y se introducen en el interior del modelo de árbol), estaba empezando a parecer que Estaba haciendo que la envoltura se ocupara de demasiados detalles de cómo se implementa el árbol. Esto anula el propósito de un envoltorio simple.

Ahora me inclino por incorporar la pila de deshacer, en particular las clases QUndoCommand , en el Modelo de árbol, que está feliz de tratar con todos estos aspectos internos. Esto probablemente simplificaría la envoltura, que es una especie de punto. En otras palabras, estoy pensando que era ingenuo acerca de lo complicado que era agregar la funcionalidad de deshacer / rehacer. No es simple, pero algo en lo que el propio modelo realmente debería estar funcionando.

Sin embargo, soy completamente nuevo en esto, así que me pregunto si estoy cometiendo un error de diseño tonto que me perseguirá en dos años cuando intente expandir el proyecto. Una cosa que aprecio ahora: la forma en que incorporo el deshacer / rehacer en esta aplicación será una molestia para cambiar en el futuro, por lo que quiero hacerlo bien la primera vez.

Nota agregada

Basándome en un comentario, busqué 'deshacer patrones de diseño' y obtuve algunos enlaces potencialmente relevantes:

Si observa los documentos para el marco de deshacer de Qt vinculado anteriormente, parece utilizar el < a href="http://en.wikipedia.org/wiki/Command_pattern"> patrón de diseño de comando , así que eso es con lo que estoy trabajando. Entonces, replanteando mi pregunta, ¿debo generar los objetos de comando dentro de la clase original o su envoltorio? ¿Hay algún error obvio en mi razonamiento anterior de que es mejor para la modularidad hacerlo en la clase original?

    
pregunta neuronet 22.03.2015 - 22:08

1 respuesta

2

Parece que no estás preguntando cómo implementar el deshacer, ya que ya has elegido trabajar con Deshacer de Qt Framework , que ya tiene una implementación para conectar.

Si te entiendo correctamente, estás más interesado en dónde implementar el código necesario. Parece que has intentado implementarlo en dos lugares, lo que conduce a la complejidad en cualquiera de las situaciones (ya he estado allí antes). Así que en cierto modo es una elección arbitraria.

Una cosa que quizás no hayas considerado es crear más de una envoltura. Si tuviera que envolver su árbol con una envoltura que agregara la funcionalidad de deshacer y luego otra envoltura que agregue la funcionalidad adicional que su aplicación requiere, entonces puede terminar con una mejor arquitectura. En línea con el Principio de Responsabilidad Única . Tenga en cuenta que puede envolver el árbol en un orden diferente, según sus necesidades.

    
respondido por el Rossco 23.03.2015 - 23:47

Lea otras preguntas en las etiquetas