「コマンド」と「複合」を組み合わせて時間遅延をシミュレートするにはどうすればよいですか?


9

学習課題(私は学校にいない-何か新しいことを学ぼうとしている老人)として、伝播遅延を組み込んだ論理ゲートシミュレーションを記述しようとしています。また、ユーザーはゲートをグループ化して、より高レベルのオブジェクトを作成できる必要があります。

問題にデザインパターンを適用したいのですが、苦労しています。

Head First Design Patternsを読んでいますが、コマンドパターンは、遅延のある回路を通る電気パルスをシミュレートするのに適した方法であることがわかりました。また、複合パターンはネストされたユニットをシミュレートするための優れた方法であることがわかります。2つを混ぜる方法がわかりません。

つまり、ゲートをループすると、ゲート「x」が発火するはずです。15ナノ秒の遅延があるので、現在のゲーム時間から15 nsのタイムスタンプでコマンドを作成します。ディスパッチャーはどこですか?ダイナーの例では、コマンドが「注文」であるため、ウェイトレスとコックはそれぞれコマンドをディスパッチし、遅延を導入するオプションがあります。「複合」ゲートがある場合、独自のディスパッチャーも持っていますか?キューを管理するためにシングルトンを使用する必要がありますか?

私は見つけたものを読みましたが、それでも正しい方向へのプッシュが必要です。


9
パターンはツールです。ハンマーやスクリュードライバーを使わずに、家を建てると思います。代わりに、家を建て始め、ハンマーが仕事を楽にする場所を理解します。

それは私の質問に正確に答えるものではありません。大規模なJavaアプリケーションがすでに構築されており、ゲートからゲートへメッセージを渡します。しかし、伝播遅延を組み込もうとしているのですが、私のアプリケーション設計ではそれを簡単に処理できないことがわかりました。デザインパターンが役立つことを願っていました...
Neil Mussett、2013

4
cronに似ていますが、「実際の」時間がない離散イベントシミュレーションを探しています。これを構築してから、「ああ、私はここでコンポジットを構築しています-方法を知っています」ではなく、ソリューションにコンポジットを割り込む方法を探すのではありません。

1
特に、Communications of the ACM 1977年8月、Volume 20、Number 8のシミュレーションイベントセットの効率的なデータ構造は非常に便利です(このタイトルのグーグル検索でPDFが表示されるはずです-へのリンクに問題がありますit)-インデックス付きリストに比べて大幅に改善されたデータ構造を実装するという概念を通過します。

1
これは、citeseerxでホストされているACM論文へのリンクです。
フランク

回答:


1

Javaで実行しようとしていることを実行するシミュレーターがあるので、Scalaでのプログラミングの例を確認することをお勧めします。

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

それらのアプローチを見ると、プログラムを変更して、希望する動作を実現する方法を見つけることができます。

あなたはそれを簡単に追加することはできないと述べたので、あなたのアプローチが何であるか、そしてあなたが遭遇する困難は何であるかを説明しないでください。そうすれば、人々はあなたが考慮しなかったかもしれないいくつかの提案を与えることができます。

先に述べたように、デザインパターンは、コードが何をしているかを速記する方法ですが、デザインパターンを強制しようとするという考えは、悪い考えのように思えます。

基本的に、伝播遅延は難しくありません。

あなたはである基本クラスを持つことができGate、彼女に遅延を入れます。

これからすべてのゲートが延長され、実際の遅延が設定されます。

さて、信号をフォローしているとき、ゲートにいるとき、そのスレッドはシミュレートされた遅延のためにスリープする可能性がありますが、これはまた、シミュレータが実際のシステムよりも遅いため、リアルタイムをシミュレーションされた時間にマッピングする必要があることを意味しますだろう。

スレッドが多すぎることがわかった場合は、並べ替えられたリストに次のリストを上に置き、一時停止したときに遅延を実行する時間を置くだけで、各ループでシミュレータは準備ができているスレッドを選択します、次のアクションを実行すると、次の遅延が発生します。

これはゲームループに似ています。


0

つまり、ゲートをループすると、ゲート「x」が発火するはずです。

次に、コマンドパターンを使用しません。

「複合」ゲートがある場合、独自のディスパッチャーも持っていますか?

親愛なる神様。複合パターンの要点は、1つのオブジェクトのみが必要な場所に複合オブジェクトを提供できることです。これにより、正常な動作を構成できます。

キューを管理するためにシングルトンを使用する必要がありますか?

地獄いいえ。全世界で料理人とウェイトレスは1人だけですか。キッチンは1つだけですか?

コマンドと複合パターンの混合はかなり簡単です。コマンドを表すインターフェースがいくつかあります。それぞれの具象コマンドは、そのインターフェースをオーバーライドして(または非継承言語でそれを満たす場合)、何らかの動作を提供することができます。あなたの遅延はそのような単純な行動の1つです。

複合パターンは、単一のインターフェースの背後に2つ(またはそれ以上)のオブジェクト/動作を提供します。この例の最も簡単な使用法は、他の2つのコマンドを受け取り、実行するように指示されたときに2つの保存されたコマンドをトリガーする複合コマンドです。この方法で、分離された「遅延」コマンドと任意の他のコマンドを使用して、遅延コマンドを作成できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.