Come combinerei "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 cercando di scrivere una simulazione del gate logico che incorpori il ritardo di propagazione. L'utente dovrebbe anche essere in grado di raggruppare le porte per creare oggetti di livello superiore.

Voglio applicare modelli di progettazione al mio problema, ma sto avendo difficoltà.

Sto leggendo Head First Design Patterns e vedo che il modello Command è un buon modo per simulare gli impulsi elettrici attraverso un circuito con un ritardo. Vedo anche che il modello Composito è un buon modo per simulare unità nidificate. Semplicemente non so come mescolare i due.

In altre parole, mentre attraverso le porte, vedo che il cancello "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'è lo spedizioniere? Nell'esempio del commensale, con il comando "Ordine", la cameriera e il cuoco inviano ciascuno 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 sono riuscito a trovare, ma ho ancora bisogno di una spinta nella giusta direzione:


9
I modelli sono strumenti. Uno non prende un martello e un cacciavite e pensa che costruirò una casa. Invece, inizia a costruire una casa e renditi conto dove un martello faciliterebbe un lavoro.

Questo non risponde esattamente alla mia domanda. Ho già creato una grande applicazione Java, che passa i messaggi da gate a gate. Tuttavia, sto cercando di incorporare il ritardo di propagazione e trovo che il design della mia applicazione non sia in grado di gestirlo facilmente. Speravo che i modelli di design potessero aiutare ...
Neil Mussett,

4
Stai cercando una simulazione di eventi discreti, come cron ma senza tempo "reale". Costruisci questo e poi riconosci "oh, sto costruendo un composito qui - so come farlo" piuttosto che andare e cercare un modo per incuneare un composito nella soluzione.

1
In particolare, potresti trovare una struttura di dati efficiente per il set di eventi di simulazione dalle comunicazioni dell'ACM di agosto 1977, volume 20, numero 8 abbastanza utile (una ricerca su Google per questo titolo dovrebbe recuperare un pdf - Ho problemi a collegarmi a esso) - passa attraverso il concetto di implementazione della struttura dei dati che è significativamente migliorata su un elenco indicizzato.

1
Ecco un link al documento ACM ospitato su citeseerx.
Frank,

Risposte:


1

Potresti voler guardare un esempio dalla programmazione in Scala , in quanto hanno un simulatore che fa quello che stai cercando di fare in Java:

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

Osservando il loro approccio potresti scoprire come cambiare 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, quindi le persone possono darti alcuni suggerimenti che potresti non aver considerato.

Come accennato, i modelli di progettazione sono modi per parlare di ciò che il tuo codice sta facendo, come una scorciatoia, 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 in lei mettere un ritardo.

Tutte le porte si estendono da questo e impostano il ritardo effettivo.

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

Se scopri di avere troppi thread, inseriscili in un elenco ordinato, in cima al prossimo in cima, e quando ti fermi, inserisci solo il tempo del ritardo e su ogni ciclo il simulatore sceglierà quelli che ora sono pronti , esegui l'azione successiva e quindi si verifica il ritardo successivo.

Questo sarebbe simile a un loop di gioco.


0

In altre parole, mentre attraverso le porte, vedo che il cancello "x" dovrebbe sparare.

Quindi non stai usando il modello di comando.

Se ho un gate "composito", ha anche un proprio dispatcher?

Caro dio no. L'intero punto del modello composito è che è possibile fornire un oggetto composito in una posizione che prevede solo un oggetto. Ciò ti consente di comporre il comportamento in modo sano.

Devo usare un Singleton per gestire la coda?

Diavolo, no. Hai solo una cuoca 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ò sovrascrivere (o comunque soddisfarlo in linguaggi non ereditarietà) che si interfacciano per fornire un comportamento. Il tuo ritardo è un comportamento così semplice.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.