Esto es una pregunta abierta así que van a surgir varias ideas interesantes seguro. No sé si alguna vez habéis intentando programar algún juego a base de "reglas" (un ajedez, por ejemplo) pero estoy teniendo bastantes problemas para llegar a una solución que me convenza. Me atormenta sobre todo la reusabilidad, como por ejemplo poder crear fácilmente nuevos sets de reglas (ajedrez 960, bughouse...) desde una misma base de código.
Mi aproximación actual despues de varias pruebas ha sido aplicar MVC+patrón comando (en juegos de tablero para hacer undo/redo, log de movimientos, etc.) pero he acabado siempre con controladores monolíticos, pesados y mal extensibles... en definitiva: una mierda de diseño.
En ciertos casos me ha resultado útil aplicar patrón observador pero no vale para todo... no todos los eventos del controlador son "observables" (sin desgranar en chopocientas capas tan ligeras que empiezan a resultar inútiles) y además aumentas el acoplamiento (aunque el encapsulado sea más lógico.) Ni siquiera así he llegado deshacer lo monolítico del controlador sin entremezclar los observadores (las diferentes reglas que se "influyen" entre sí), disminuir el encapsulado (clases friend y demás) o con interfaces monstruosos.
En otros casos me ha resultado útil el patrón cadena de responsabilidad, pero el problema es el mismo: en cuanto hay reglas complejas se convierte más bien en un árbol de responsabilidad en el que los propios procesadores crean nuevos comandos en una espiral de locura.
La "solución" que usan en juegos complejos es un sistema de mensajes-eventos pero me parece excesivo para un simple juego de tablero, es casi peor que el controlador monolítico (infierno de debuggear.)
¿Habéis hecho esto alguna vez? ¿Se os ocurre algo? ¿O es que simplemente el dominio del problema es inherentemente complejo y "desordenado"? Soy consciente de que no todo se puede arreglar a base de patrones pero tiene que haber ALGO que se me escapa. Es el problema de siempre: simplicidad vs. completitud, y en este caso aún más exagerado (reglas simples = juegos aburridos... reglas complejas = código inmantenible... ¡no acabo de encontrar el punto de equilibrio!)