¿Cómo combinaría 'Comando' y 'Compuesto' para simular un retraso de tiempo?


9

Como ejercicio de aprendizaje (no estoy en la escuela, solo soy un viejo tratando de aprender algo nuevo), estoy tratando de escribir una simulación de puerta lógica que incorpore el retraso de propagación. El usuario también debe poder agrupar puertas para crear objetos de nivel superior.

Quiero aplicar patrones de diseño a mi problema, pero estoy teniendo dificultades.

Estoy leyendo los patrones de diseño de Head First , y veo que el patrón de comandos es una buena forma de simular impulsos eléctricos a través de un circuito con un retraso. También veo que el patrón compuesto es una buena forma de simular unidades anidadas. Simplemente no sé cómo mezclar los dos.

En otras palabras, cuando paso por mis puertas, veo que la puerta 'x' debería dispararse. Tiene un retraso de 15 nanosegundos, por lo que creo un comando con una marca de tiempo de 15 ns del tiempo de juego actual. ¿Dónde está el despachador? En el ejemplo del comensal, siendo el comando la 'Orden', la camarera y el cocinero envían el comando y tienen la opción de introducir un retraso. Si tengo una puerta 'compuesta', ¿también tiene su propio despachador? ¿Necesito usar un Singleton para administrar la cola?

Leí lo que pude encontrar, pero todavía necesito un empujón en la dirección correcta:


99
Los patrones son herramientas. Uno no toma un martillo y un destornillador y piensa que voy a construir una casa. En cambio, comience a construir una casa y comprenda dónde un martillo facilitaría el trabajo.

Eso no responde exactamente a mi pregunta. Tengo una gran aplicación Java ya construida, que pasa mensajes de puerta a puerta. Sin embargo, estoy tratando de incorporar el retraso de propagación y encuentro que el diseño de mi aplicación no puede manejarlo fácilmente. Esperaba que los patrones de diseño pudieran ayudar ...
Neil Mussett

44
Está buscando simulación de eventos discretos , como cron pero sin tiempo 'real'. Construya esto y luego reconozca "oh, estoy construyendo un compuesto aquí, sé cómo hacerlo" en lugar de buscar y encontrar alguna forma de encajar un compuesto en la solución.

1
En particular, puede encontrar una estructura de datos eficiente para el conjunto de eventos de simulación de Communications of the ACM, agosto de 1977, volumen 20, número 8, bastante útil (una búsqueda en Google de este título debería mostrar un pdf; estoy teniendo problemas para vincular it) - pasa por el concepto de implementar la estructura de datos que se mejora significativamente en una lista indexada.

1
Aquí hay un enlace al documento de ACM alojado en citeseerx.
Frank

Respuestas:


1

Es posible que desee ver un ejemplo de Programación en Scala , ya que tienen un simulador que hace lo que intenta hacer en Java:

http://www.cs.helsinki.fi/u/wikla/OTS/Sisalto/examples/html/ch30.html#sec6

Al observar su enfoque, puede encontrar cómo cambiar su programa para obtener el comportamiento que desea.

Mencionó que no puede agregarlo fácilmente, entonces, ¿por qué no explicar cuál es su enfoque y cuál es la dificultad que encuentra? Para que las personas puedan darle algunas sugerencias que quizás no haya considerado.

Como se mencionó, los patrones de diseño son formas de hablar sobre lo que está haciendo su código, como una abreviatura, pero la idea de intentar forzar patrones de diseño simplemente parece una mala idea.

Básicamente, un retraso de propagación no debería ser difícil.

Puede tener una clase base que es Gate, y en ella poner en un retraso.

Todas las puertas se extienden desde esto y establecen el retraso real.

Ahora, cuando está siguiendo una señal, cuando está en una puerta, ese hilo puede dormir durante el retraso simulado, pero esto también significa que necesita asignar el tiempo real a su tiempo simulado, ya que su simulador será más lento que un sistema real sería.

Si encuentra que tiene demasiados subprocesos, simplemente colóquelos en una lista ordenada, por el siguiente en la parte superior, y cuando haga una pausa, simplemente coloque el tiempo en que se realiza el retraso y en cada bucle el simulador seleccionará los que ya están listos , realice la siguiente acción y luego se produce el siguiente retraso.

Esto sería similar a un bucle de juego.


0

En otras palabras, cuando paso por mis puertas, veo que la puerta 'x' debería dispararse.

Entonces no estás usando el patrón de comando.

Si tengo una puerta 'compuesta', ¿también tiene su propio despachador?

Querido dios no. El punto completo del patrón compuesto es que puede suministrar un objeto compuesto a una ubicación que solo espera un objeto. Esto le permite componer el comportamiento de una manera sensata.

¿Necesito usar un Singleton para administrar la cola?

Diablos no. ¿Solo tienes una cocinera y una camarera en todo el mundo? ¿Solo tienen una cocina?

Mezclar el comando y el patrón compuesto es bastante sencillo. Tienes alguna interfaz que representa un comando. Cada comando concreto puede anular (o de otro modo satisfacerlo en lenguajes que no son de herencia) esa interfaz para proporcionar algún comportamiento. Su retraso es uno de esos comportamientos simples.

El patrón compuesto proporciona dos (o más) objetos / comportamientos detrás de una sola interfaz. El uso más simple para este ejemplo sería un comando compuesto que toma otros dos comandos y luego, cuando se le dice que se ejecute, dispara los dos comandos almacenados. De esta manera, puede tomar su comando de 'retraso' aislado y cualquier otro comando arbitrario para crear un comando retrasado.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.