Comment combiner «Commande» et «Composite» pour simuler un délai?

9

En tant qu'exercice d'apprentissage (je ne suis pas à l'école - juste un vieil homme essayant d'apprendre quelque chose de nouveau), j'essaie d'écrire une simulation de porte logique qui incorpore le retard de propagation. L'utilisateur doit également pouvoir regrouper les portes pour créer des objets de niveau supérieur.

Je veux appliquer des modèles de conception à mon problème, mais j'ai du mal.

Je lis les modèles de conception Head First et je vois que le modèle de commande est un bon moyen de simuler des impulsions électriques à travers un circuit avec un retard. Je vois également que le motif composite est un bon moyen de simuler des unités imbriquées. Je ne sais juste pas comment mélanger les deux.

En d'autres termes, en parcourant mes portes, je vois que la porte «x» devrait se déclencher. Il a un retard de 15 nanosecondes, donc je crée une commande avec un horodatage de 15 ns à partir du temps de jeu actuel. Où est le répartiteur? Dans l'exemple du dîner, la commande étant l '«Ordre», la serveuse et le cuisinier envoient chacun la commande et ont la possibilité d'introduire un délai. Si j'ai une porte «composite», a-t-elle aussi son propre répartiteur? Dois-je utiliser un Singleton pour gérer la file d'attente?

J'ai lu ce que j'ai pu trouver, mais j'ai encore besoin d'un coup de pouce dans la bonne direction:

Neil Mussett
la source
9
Les motifs sont des outils. On ne prend pas un marteau et un tournevis et je pense que je vais construire une maison. Au lieu de cela, commencez à construire une maison et réalisez où un marteau rendrait le travail plus facile.
Cela ne répond pas exactement à ma question. J'ai une grande application Java déjà construite, qui transmet les messages de porte à porte. Cependant, j'essaie d'incorporer le délai de propagation et je trouve que la conception de mon application ne peut pas facilement le gérer. J'espérais que les modèles de conception pourraient aider ...
Neil Mussett
4
Vous recherchez une simulation d'événement discrète - comme cron mais sans temps «réel». Construisez ceci et reconnaissez ensuite "oh, je construis un composite ici - je sais comment faire cela" plutôt que d'aller chercher un moyen de caler un composite dans la solution.
1
En particulier, vous trouverez peut-être une structure de données efficace pour l'ensemble d'événements de simulation des communications de l'ACM août 1977, volume 20, numéro 8 (une recherche Google pour ce titre devrait afficher un pdf - j'ai du mal à créer un lien vers it) - il passe par le concept de mise en œuvre de la structure de données qui est considérablement améliorée par rapport à une liste indexée.
1
Voici un lien vers le document ACM hébergé chez citeseerx.
Frank

Réponses:

1

Vous voudrez peut-être regarder un exemple de programmation dans Scala , car ils ont un simulateur qui fait ce que vous essayez de faire en Java:

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

En examinant leur approche, vous découvrirez peut-être comment modifier votre programme pour obtenir le comportement souhaité.

Vous avez mentionné que vous ne pouvez pas l'ajouter facilement, alors pourquoi ne pas expliquer quelle est votre approche et quelle est la difficulté que vous rencontrez, afin que les gens puissent vous faire des suggestions que vous n'avez peut-être pas envisagées.

Comme mentionné, les modèles de conception sont des moyens de parler de ce que fait votre code, en abrégé, mais l'idée d'essayer de forcer les modèles de conception semble simplement être une mauvaise idée.

Fondamentalement, un retard de propagation ne devrait pas être difficile.

Vous pouvez avoir une classe de base qui est Gate, et en elle mettre un délai.

Toutes les portes s'étendent à partir de cela et définissent le retard réel.

Maintenant, lorsque vous suivez un signal, dans une porte, ce thread peut dormir pendant le délai simulé, mais cela signifie également que vous devez mapper le temps réel à votre temps simulé, car votre simulateur sera plus lent qu'un vrai système serait.

Si vous trouvez que vous avez trop de threads, alors mettez-les simplement dans une liste triée, par la suivante en haut, et lorsque vous vous arrêtez, mettez simplement le temps de retard et sur chaque boucle, le simulateur choisira ceux qui sont maintenant prêts , effectuez l'action suivante, puis le délai suivant se produit.

Ce serait similaire à une boucle de jeu.

James Black
la source
0

En d'autres termes, en parcourant mes portes, je vois que la porte «x» devrait se déclencher.

Ensuite, vous n'utilisez pas le modèle de commande.

Si j'ai une porte «composite», a-t-elle aussi son propre répartiteur?

Cher dieu non. L'intérêt du motif composite est que vous pouvez fournir un objet composite à un emplacement qui n'attend qu'un seul objet. Cela vous permet de composer le comportement d'une manière saine.

Dois-je utiliser un Singleton pour gérer la file d'attente?

Sûrement pas. Vous n'avez qu'un seul cuisinier et une seule serveuse dans le monde entier? N'ont-ils qu'une seule cuisine?

Le mélange de la commande et du motif composite est assez simple. Vous avez une interface qui représente une commande. Chaque commande concrète peut remplacer (ou autrement la satisfaire dans des langages sans héritage) cette interface pour fournir un certain comportement. Votre retard est un de ces comportements simples.

Le modèle composite fournit deux (ou plus) objets / comportements derrière une seule interface. L'utilisation la plus simple pour cet exemple serait une commande composite qui prend deux autres commandes, puis lorsqu'elle est invitée à s'exécuter, déclenche les deux commandes stockées. De cette façon, vous pouvez prendre votre commande «delay» isolée et toute autre commande arbitraire pour créer une commande retardée.

Telastyn
la source