Hola Javi!
El código hereda una malinterpretación del patrón MVC que proviene del artículo original. Normalmente el controlador no tiene que conocer a la vista. Más aún, es importante que la vista no necesite conocer al controlador para actualizarse. De esta forma pueden instanciarse varias vistas y controladores que pueden operar independientemente. Para ello suele utilizarse en sistemas orientado a objetos lo que se llama inversión de control [1].
Esta inversión de control, en orientación a objetos, se implementa a menudo mediante el patrón observer [2]. En C++ podemos utilizar boost::signals2
[3] para implementar el patrón, aunque en casos sencillos es fácil implementarlo a mano. Por ejemplo, podemos cambiar el modelo de este repositorio de esta forma
class StudentModel {
...
void set...(...) {
...
notify();
}
using Listener = std::function<void(const StudentModel&)>;
void connect(Listener listener) {
if (listeners_.find(listener) != listeners_.end())
throw std::runtime_error("Double connection");
listeners_.push_back(listener);
}
void disconnect(Listener listener) {
auto iter = listeners_.find(listener);
if (iter == listeners_.end())
throw std::runtime_error("Listener not connected");
listeners_.erase(listener);
}
private:
void notify() const {
for (const auto& listener : listeners_)
listener(*this);
}
std::vector<Listener> listeners_;
}
De esta forma, en lugar de dar la vista a conocer al controlador, podemos bien dar el modelo a la vista, o incluso realizar la conexión desde fuera, por ejemplo, en main.cpp
podriamos hacer algo asi:
StudentModel model = ...;
StudentView view;
model.connect([] (const StudentModel& model) {
view.printStudentDetails(model.name(), model.date());
});
Por supuesto, en esto pueden realizarse diferentes variaciones. Por ejemplo, incluyendo notificaciones más granulares (i.e. una por atributo), o utilizando técnicas de diffing como las usadas por React.js o Angular.js o añadiendo cierta forma de transacciones.
[1] https://en.wikipedia.org/wiki/Inversion_of_control
[2] https://en.wikipedia.org/wiki/Observer_pattern
[3] http://www.boost.org/doc/libs/1_57_0/doc/html/signals2.html