Come dovrei combinare "Comando" e "Composito" per simulare un ritardo?

9

Come esercizio di apprendimento (non sono a scuola - solo un vecchio che cerca di imparare qualcosa di nuovo), sto provando a scrivere una simulazione di gate logico che incorpori il ritardo di propagazione. L'utente dovrebbe anche essere in grado di raggruppare i gate per creare oggetti di livello superiore.

Voglio applicare modelli di progettazione al mio problema, ma mi sto trovando in difficoltà.

Sto leggendo Head First Design Patterns e vedo che il pattern Command è un buon modo per simulare gli impulsi elettrici attraverso un circuito con un ritardo. Vedo anche che il pattern Composite è un buon modo per simulare le unità annidate. Non so come mescolare i due.

In altre parole, mentre cancello i miei cancelli, vedo che la porta 'x' dovrebbe sparare. Ha un ritardo di 15 nanosecondi, quindi creo un comando con un timestamp di 15 ns dal tempo di gioco corrente. Dov'è il supervisore? Nell'esempio del commensale, con il comando che è "Ordine", la cameriera e il cuoco spediscono il comando e hanno la possibilità di introdurre un ritardo. Se ho un gate "composito", ha anche un proprio dispatcher? Devo usare un Singleton per gestire la coda?

Ho letto quello che ho trovato, ma ho ancora bisogno di una spinta nella giusta direzione:

posta Neil Mussett 24.02.2013 - 03:06
fonte

2 risposte

1

Potresti voler dare un'occhiata ad un esempio di Programming in Scala , poiché hanno un simulatore che fa ciò che stai cercando di fare in Java:

link

Osservando il loro approccio potresti scoprire come modificare il tuo programma per ottenere il comportamento che desideri.

Hai detto che non puoi aggiungerlo facilmente, quindi perché non spiegare quale sia il tuo approccio e quale sia la difficoltà che incontri, così le persone possono darti alcuni suggerimenti che potresti non aver considerato.

Come accennato, gli schemi di progettazione sono modi per parlare di ciò che il tuo codice sta facendo, come una stenografia, ma l'idea di provare a forzare i modelli di progettazione sembra solo una cattiva idea.

Fondamentalmente un ritardo di propagazione non dovrebbe essere difficile.

Puoi avere una classe base che è Gate e nel suo mettere un ritardo.

Tutti i gate si estendono da questo e impostano il ritardo effettivo.

Ora, quando stai seguendo un segnale, quando in un gate, quel thread può dormire per il ritardo simulato, ma questo significa anche che devi mappare il tempo reale al tuo tempo simulato, poiché il tuo simulatore sarà più lento di un vero sistema sarebbe.

Se scopri di avere troppi thread, inseriscili in una lista ordinata, la prossima in cima, e quando fai una pausa, metti solo il tempo in cui il delay è finito e su ciascun loop il simulatore sceglierà quelli che sono pronti, fai l'azione successiva, e poi avviene il prossimo ritardo.

Questo sarebbe simile a un ciclo di gioco.

    
risposta data 14.03.2013 - 00:47
fonte
0

In other words, as I loop through my gates, I see that gate 'x' should fire.

Quindi non stai utilizzando lo schema di comando.

If I have a 'composite' gate, does it also have its own dispatcher?

Caro Dio no. L'intero punto del pattern composito è che è possibile fornire un oggetto composito a una posizione che si aspetta solo un oggetto. Questo ti permette di comporre il comportamento in modo sano.

Do I need to use a Singleton to manage the queue?

Inferno no. Hai solo un cuoco e una cameriera in tutto il mondo? Hanno solo una cucina?

Mescolare il comando e il modello composito è abbastanza semplice. Hai qualche interfaccia che rappresenta un comando. Ogni comando concreto può eseguire l'override (o comunque soddisfarlo in linguaggi non ereditari) che interfaccia per fornire un comportamento. Il tuo ritardo è un comportamento così semplice.

Il modello composito fornisce due (o più) oggetti / comportamenti dietro una singola interfaccia. L'uso più semplice per questo esempio sarebbe un comando composito che accetta altri due comandi e quindi, quando gli viene richiesto di eseguire, attiva i due comandi memorizzati. In questo modo puoi prendere il tuo comando "delay" isolato e qualsiasi altro comando arbitrario per creare un comando ritardato.

    
risposta data 14.03.2013 - 01:13
fonte