Pregunta

Tengo una pregunta de diseño sobre la comunicación entre el modelo y el presentador en el patrón de diseño MVP -. O más exactamente su forma derivada la vista pasiva

Vamos a suponer la siguiente interfaz gráfica de usuario simple como un ejemplo: tengo una ventana en mi opinión es una lista y hay la posibilidad de abrir un diálogo de archivo para seleccionar un archivo. Una vez que he terminado mi selección el archivo se añade a la lista.

Mi modelo será la colección de todos los archivos que se han abierto.

Una aplicación recta de avance trata de (pseudo código Python) cuenta:

Solución A

class Model():
     def add(filename):
         # add file
         ...
         # return True if successful
         return True

class Presenter():
    # event from GUI
    def onFileOpen():
        filename = FileSelectorStuff()
        isFileAdded = model.add(filename)
        if isFileAdded:
            view.insertItem(filename)

En este caso sé que el archivo se agregó al modelo y por lo tanto puedo actualizar la vista en consecuencia.

Por otro lado pude agregar el archivo al modelo, y luego esperar a que el modelo para notificarme que se ha cambiado y que el presentador tiene que actualizar la vista, así:

Solución B

class Model():
     def add(filename):
         # add file
         ...
         # alert controller
         modelChanged(Type.FileAdded, filename)

class Presenter():
    # event from GUI
    def onFileOpen():
        filename = FileSelectorStuff()
        model.add(filename)

    # event from model
    def onModelChanged(type, filename):
        if type == Type.FileAdded:
            view.insertItem(filename)
        elif type == Type.FileRemoved:
            ...

Ahora, en este caso ambas implementaciones funcionan bien. Pero vamos a suponer que el modelo también supervisa los archivos y tiene que decirle al presentador cuando uno de ellos ha sido eliminado, por ejemplo. Entonces necesito este tipo de onModelChanged () mecanismo de devolución de llamada de todos modos.

Mi pregunta ahora es: debería mezclo las dos maneras para actualizar la vista (A para actualizaciones síncronas, y B para asíncrono) o más bien mantener todo el centro en un lugar tal como se propone en la solución B ?

¿Fue útil?

Solución

Este problema se resuelve probablemente mucho, pero me dispara desde un motor de búsqueda así que aquí está mi respuesta:

Uso B. Forget mezcla.

Si desea añadir en bits de A de eficiencia que tendrá que tener dos métodos para el modelo: uno que devuelve un valor booleano, los otros eventos que emiten. Si el método Model.add sincrónica emite eventos, entonces el controlador de eventos en el presentador tendrá que hacer caso de ellos durante esa llamada al método. Desordenado.

Sin embargo mi comprensión de Pasivo Ver sugiere que el presentador es el encargado de actualizar el modelo, por lo que se podría argumentar que debería ser el de eliminar archivos de la modelo, de todos modos. Esto allana el camino para una Una única solución.

Mi respuesta final: Un uso, o uso B. no se mezclan.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top