Wie würde ich 'Befehl' und 'Zusammengesetzt' kombinieren, um eine Zeitverzögerung zu simulieren?


9

Als Lernübung (ich bin nicht in der Schule - nur ein alter Mann, der versucht, etwas Neues zu lernen) versuche ich, eine Logikgattersimulation zu schreiben, die eine Ausbreitungsverzögerung beinhaltet. Der Benutzer sollte auch in der Lage sein, Gates zu gruppieren, um übergeordnete Objekte zu erstellen.

Ich möchte Designmuster auf mein Problem anwenden, aber es fällt mir schwer.

Ich lese Head First Design Patterns und sehe, dass das Command Pattern eine gute Möglichkeit ist, elektrische Impulse durch einen Schaltkreis mit Verzögerung zu simulieren. Ich sehe auch, dass das zusammengesetzte Muster eine gute Möglichkeit ist, verschachtelte Einheiten zu simulieren. Ich weiß nur nicht, wie ich die beiden mischen soll.

Mit anderen Worten, wenn ich durch meine Tore gehe, sehe ich, dass das Tor 'x' feuern sollte. Es hat eine Verzögerung von 15 Nanosekunden, daher erstelle ich einen Befehl mit einem Zeitstempel von 15 ns ab der aktuellen Spielzeit. Wo ist der Dispatcher? Im Beispiel des Diner, wobei der Befehl die 'Bestellung' ist, senden die Kellnerin und der Koch jeweils den Befehl aus und haben die Möglichkeit, eine Verzögerung einzuführen. Wenn ich ein 'zusammengesetztes' Tor habe, hat es auch einen eigenen Dispatcher? Muss ich einen Singleton verwenden, um die Warteschlange zu verwalten?

Ich habe gelesen, was ich finden konnte, aber ich brauche noch einen Schub in die richtige Richtung:


9
Muster sind Werkzeuge. Man nimmt keinen Hammer und keinen Schraubenzieher und denkt, ich baue ein Haus. Beginnen Sie stattdessen mit dem Bau eines Hauses und stellen Sie fest, wo ein Hammer die Arbeit erleichtern würde.

Das beantwortet meine Frage nicht genau. Ich habe bereits eine große Java-Anwendung erstellt, die Nachrichten von Gate zu Gate weiterleitet. Ich versuche jedoch, die Laufzeitverzögerung zu berücksichtigen, und stelle fest, dass mein Anwendungsdesign nicht einfach damit umgehen kann. Ich hatte gehofft, Designmuster könnten helfen ...
Neil Mussett

4
Sie suchen nach einer diskreten Ereignissimulation - wie cron, aber ohne "Echtzeit". Erstellen Sie dies und erkennen Sie dann "Oh, ich baue hier ein Komposit - ich weiß, wie das geht", anstatt nach einer Möglichkeit zu suchen, ein Komposit in die Lösung einzuklemmen.

1
Insbesondere könnte eine effiziente Datenstruktur für den Simulationsereignissatz aus Communications of the ACM August 1977, Band 20, Nummer 8 sehr nützlich sein (eine Google-Suche nach diesem Titel sollte ein PDF aufrufen - ich habe Probleme beim Verknüpfen mit it) - Es geht durch das Konzept der Implementierung der Datenstruktur, die gegenüber einer indizierten Liste erheblich verbessert wurde.

1
Hier ist ein Link zu dem bei citeseerx gehosteten ACM-Artikel.
Frank

Antworten:


1

Vielleicht möchten Sie sich ein Beispiel aus der Programmierung in Scala ansehen , da es einen Simulator gibt, der das tut, was Sie in Java versuchen:

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

Wenn Sie sich ihren Ansatz ansehen, finden Sie möglicherweise heraus, wie Sie Ihr Programm ändern können, um das gewünschte Verhalten zu erzielen.

Sie haben erwähnt, dass Sie es nicht einfach hinzufügen können. Erklären Sie also, wie Sie vorgehen und auf welche Schwierigkeiten Sie stoßen, damit die Leute Ihnen einige Vorschläge machen können, die Sie möglicherweise nicht berücksichtigt haben.

Wie bereits erwähnt, sind Entwurfsmuster eine Möglichkeit, als Kurzform darüber zu sprechen, was Ihr Code tut, aber die Idee, Entwurfsmuster zu erzwingen, scheint nur eine schlechte Idee zu sein.

Grundsätzlich sollte eine Laufzeitverzögerung nicht schwierig sein.

Sie können eine Basisklasse haben, die ist Gate, und in ihr eine Verzögerung setzen.

Alle Tore erstrecken sich davon und stellen die tatsächliche Verzögerung ein.

Wenn Sie einem Signal folgen und sich in einem Gate befinden, kann dieser Thread für die simulierte Verzögerung in den Ruhezustand versetzt werden. Dies bedeutet jedoch auch, dass Sie die Echtzeit Ihrer simulierten Zeit zuordnen müssen, da Ihr Simulator langsamer als ein reales System ist wäre.

Wenn Sie feststellen, dass Sie zu viele Threads haben, fügen Sie diese einfach in eine sortierte Liste ein, und zwar nach dem nächsten oben. Wenn Sie pausieren, geben Sie einfach die Zeit ein, zu der die Verzögerung abgeschlossen ist, und der Simulator wählt in jeder Schleife diejenigen aus, die jetzt bereit sind Führen Sie die nächste Aktion aus, und dann erfolgt die nächste Verzögerung.

Dies wäre ähnlich wie bei einer Spielschleife.


0

Mit anderen Worten, wenn ich durch meine Tore gehe, sehe ich, dass das Tor 'x' feuern sollte.

Dann verwenden Sie nicht das Befehlsmuster.

Wenn ich ein 'zusammengesetztes' Tor habe, hat es auch einen eigenen Dispatcher?

Lieber Gott, nein. Der gesamte Punkt des zusammengesetzten Musters besteht darin, dass Sie ein zusammengesetztes Objekt an einen Ort liefern können, an dem nur ein Objekt erwartet wird. Auf diese Weise können Sie das Verhalten auf vernünftige Weise zusammenstellen.

Muss ich einen Singleton verwenden, um die Warteschlange zu verwalten?

Auf keinen Fall. Haben Sie nur eine Köchin und eine Kellnerin auf der ganzen Welt? Haben sie nur eine Küche?

Das Mischen des Befehls und des zusammengesetzten Musters ist ziemlich einfach. Sie haben eine Schnittstelle, die einen Befehl darstellt. Jeder konkrete Befehl kann diese Schnittstelle überschreiben (oder auf andere Weise in Nichtvererbungssprachen erfüllen), um ein bestimmtes Verhalten bereitzustellen. Ihre Verzögerung ist ein solches einfaches Verhalten.

Das zusammengesetzte Muster bietet zwei (oder mehr) Objekte / Verhaltensweisen hinter einer einzigen Schnittstelle. Die einfachste Verwendung für dieses Beispiel wäre ein zusammengesetzter Befehl, der zwei andere Befehle akzeptiert und dann, wenn er zur Ausführung aufgefordert wird, die beiden gespeicherten Befehle auslöst. Auf diese Weise können Sie Ihren isolierten Befehl 'delay' und einen beliebigen anderen Befehl verwenden, um einen verzögerten Befehl zu erstellen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.