することはできますか?かった、抽象イベントオブジェにしました。
-
19-08-2019 - |
質問
長々と書きましたC++のイベント駆動型のアプリを使用MFCのためのGUIのボタンで、使っていHTMLのようなイベントonmousedownトリガーの一部Javascriptをします。のイベント駆動プログラミングは直感的なときはインタフェースを用いて、イベントはハードコードされた.
私の使い方を知関数ポインタをCで、どのようにWindows用実行イベントループを実行します。で書くコードを動的に通話を異なる機能です。
私の問題からコンパイル時-空間で行います。私の話す言語が必要な場合は、言語を選択し、Javascript、PHPとして使っていてもこれらの日です。いて把握の方法を使い、自分のイベントオブジェクト。うなコンセプトを取得します。とても使わない、どうなるかはわからないが実用化なのかもしれません。
例えば、と思う場を作りたいと思ったカスタムしてくれるゲームそのものを使いますイベントオブジェクトを表す影響の一部のゲームを作る能力が必要"が起こる。"
できる人という簡単な使用のカスタムイベント?た場合では合理的ですか。なにより大きく左右され言語や環境をどのイベントを処理するのですか?Javascript考えられるが読んだ多言語で発信していきます。
申し訳ないで欠損に関する必要があり、先進(中級?) 気づきを得ることになる。このようにポインタ.私は"get"のポインタは、どのようにしてください!があるため時間がなかったが、多くのプラネタリウムなどの見所も静かないようになりましたよ。プロサンゼルス生まれで、私だけでなくカスタム、イベントにすることができてうれしいです。
解決
イベント指向プログラミングについて話すとき、通常は observer design pattern 。オブザーバーデザインパターンの目標の1つは、オブジェクト間の疎結合。
それはおそらく、良い例がなければ大したことではないでしょうし、確かにたくさんの良い例があります。私は彼らの最高のものになるとは思いませんが、それでも私はそれを強打します。 2つのオブジェクトを想像してください。あるオブジェクトは、他のオブジェクトで何かが発生したことを知りたいので、それ自体が何かを行うことができます-多分、家族の犬、ローバーは、彼が仕事から家に帰るとき、ドアで父に挨拶したいかもしれません。そのシナリオをプログラムする方法はいくつかありますよね?
-
お父さんがローバーへの参照を持っていることを確認し、彼が帰宅したら、ローバーのgreetDatAtTheDoor()メソッドを呼び出すか、
-
ローバーに父親への参照を与え、 お父さんのonArriveHomeイベントを聞いて、 そして、それが起動したら、呼び出します 内部でgreetDadAtTheDoor()。
表面的には、この2つの間に大きな違いはないように見えるかもしれませんが、実際、パパにはローバーの実装の一部が焼き付けられています。何らかの理由でローバーの実装を変更する必要がある場合は、2つの場所で変更を行う必要があります。1回はローバーで、もう1回はお父さんです。大したことではないかもしれませんが、それでも理想的ではありません。
今、お母さんもお父さんにあいさつをしたいと考えています。そして、お父さんがあまり好きではないネコのビグルスワース氏は、周りにいないことを確認したいので、むしろ外に出たいと思っています。そして、隣人のジョーは、パパがいつ家に帰るかを知りたがっているので、パパが彼に負っている20ドルについて彼を悩ますことができます。これらすべてのシナリオと、必然的に発生する追加のシナリオをどのように説明しますか? MomのgreetHusband()メソッド、catのgetOutNow()メソッド、dogのgreetDadAtTheDoor()メソッド、およびJoeのgoGetMyMoney()メソッドへの参照をお父さんのクラス定義に配置すると、お父さんにとって物事がすぐに混乱します。お父さんは本当にする必要があります、彼自身は、帰ってきました。お母さん、犬、猫、そして隣人は、それが起こったときに通知を受け取りたいだけなので、内部実装に必要なことは何でもできます。
言語はこのようなものの詳細をさまざまな方法で処理しますが、Googlingを開始するとわかるように、パターンには通常、イベントに配列または配列のような構造が含まれます<!> quot; dispatcher <!> quot; (この場合、お父さん-つまり、他のみんなが興味を持っているオブジェクト)、および<!> quot; subscribers <!> quot; (例:ママ、猫、ローバー、ジョー)すべて<!> quot; register <!> quot;ディスパッチャーで公開されているメソッドを呼び出し、それ自体への参照を渡すことにより-何らかの形で、お父さんの<!> quot; subscribers。<!> quotの配列になる参照その後、パパが家に帰ると、彼は<!> quot; dispatches <!> quot;イベント-<!> quot; I'm home!<!> quot;基本的に、各サブスクライバーをループし、パブリックにアクセス可能な独自のメソッドを使用してそれらを呼び出す関数であるイベントのみです。リスナーは、渡したときにそれを提供しました。
最近はたまたまActionScriptをコーディングすることが多いので、私の世界でどのように見えるかを以下に示します。たとえば、Momクラス内で宣言されているように:
var dad:Dad = new Dad();
dad.addEventListener(DadEvent.ARRIVED_HOME, greetHusbandAtDoor);
private function greetHusbandAtDoor(event:DadEvent):void
{
// Go greet my husband
}
お父さんの場合、家に帰るときにしなければならないことは次のとおりです。
dispatchEvent(new DadEvent(DadEvent.ARRIVED_HOME));
...そして、Flashは私のためにイベントディスパッチと通知の詳細を処理するため(再び、誰もがそれとは少し異なりますが、内部的には、Flashは私が説明した概念モデルに従います)、私のお父さんが家に帰ると、家族全員がサインアップしたことを自動的に行います。
イベント思考がどのように見えるか、疎結合が何を意味するか、なぜ重要なのかなど、物事を少し説明してください。幸運を祈ります!
他のヒント
コンパイル済みの言語では、独自のイベントループを記述します。ランタイム言語では、ホスト環境によって既に実装されており、プログラマはイベントシステムへの抽象化されたインターフェイスのみを取得します。イベントループは表示されません。
イベントで機能を構築するには、2つの側面があります。 1つ目は、イベントが発生する条件を定義することです。ブラウザのjavascriptには、単一の<!> quot; mousedown <!> quot;はありません。イベント。実際、ページ上のすべての要素に1つあります。この場合、それらのいずれかが発生する条件は、マウスカーソルの位置と、マウスボタンがアップ状態からダウン状態に切り替わったかどうかの両方に基づいています。この状態により、複数のイベントが発生する場合があります。 (ブラウザには、イベント<!> quot; bubbling <!> quotと呼ばれるものがあります。これはこれに関連していますが、ここでは範囲外です。)
もう一方のファセットはイベントハンドラです。イベントは、そのハンドラがあるかどうかに関係なく発生します。ハンドラーの提供はあなた次第です。 JavaScriptでは、関数はファーストクラスの値です。コンパイル時ではなく、実行時に定義されます。したがって、ポインタやジャンプテーブルは必要ありません。実行時に新しい関数を作成し、特定のイベントが発生したときにホスト環境が検索する特別なプロパティに割り当てます。
そのため、スタックオーバーフローでは、下矢印の各<!> quot; onclick <!> quot;にイベントハンドラがあります。イベントは矢印を赤に変え、数値を減らし、他の変数をチェックし、条件付きで通知を表示します。その後、ハンドラーが戻ると、スレッドの制御がブラウザーに返され、ハレルヤはユーザーが再びブラウザーと対話できるようになります。 (イベントの処理中はすべての対話が停止するため、すばやく処理することをお勧めします) jqueryライブラリを使用した例を次に示します。
jQuery("a .downarrow")
.click(function(e){ e.target.style.color="red" /* ... do other things */ });
または生のjavascript(バージョン1.6)では
Array.prototype.slice.apply(document.getElementsByTagName("a"))
.filter(function(o){ return !!(/downarrow/).exec(o.className)})
.forEach(function(o){
o.onclick= function(e){
e.target.style.color="red" /* ...do other things * /
}
});
本当に簡単です。このようなことをする主な理由は、非同期の相互作用が可能になることです。 GUIアプリケーションは、ステップバイステップで直線的に進行しません。ユーザーの入力に動的に応答する必要があります。イベントは、マルチスレッドアプリケーションの外観を偽装する方法です。ユーザーには、お互いを中断することなく、多くのことが同時に起こっているように見えます。
ライブラリを使用してカスタムイベントを定義できます。これはおそらく、ドメイン固有のイベントをエンコードします。たとえば、次の動きを考えているチェスゲームがあるとします。移動を検索するプロセスが時間切れになります。チェスゲームは<!> quot; onComputerMove <!> quot;を起動できます。イベント。移動の仕様を取得し、チェス盤の視覚的表現を更新し、ユーザーにメッセージをポップアップして終了する関数を使用して、そのイベントを処理できます。次に、プレーヤーが移動すると、<!> quot; onPlayerMove <!> quot;を起動できます。ほぼ同じことを行うイベント。
イベントの最も素晴らしい点は、2つのモジュールまたはクラス間の双方向の明示的な結合を減らすことです。
だから、2つのクラスがあるとしましょう:赤ちゃんとママ
イベントなしで、お母さんが赤ちゃんを養うことができるように、おおまかに2つの方法があります:
- mommyは、30分ごとにBabyの
baby.pokeBelly()
メソッドを呼び出して、baby.fillWith(milk)
を呼び出す必要があるかどうかを確認します。
問題は、ママのスレッドが赤ちゃんのしばらくのループの後、一日中待たなければならないことです - 赤ちゃんは関連するママを知っており、
mommy.feed(me)
メソッドを呼び出します。このメソッドはMommy.OnBabyCries(baby)
を呼び出します。
問題は、単純な赤ちゃんに右のママに腹を満たすように頼むことです。
赤ちゃんは単純なままにする必要があるので、そうしません。
イベントを使用すると、baby.Cry
をその赤ちゃんの<=>イベントにバインドできます:
void Mommy.OnBabyCries(baby) { baby.fillWith(milk) }
この後、赤ちゃんが食べたい場合は、泣くイベントを上げるだけです。
ロジックはママに、または後でベビーシッターにとどまり、ベイビーは心配することなく幸せなままです。
あなたの質問を完全に理解しているかどうかはわかりませんが、イベントを持つクラスはボタンを持つGUIのようなものです。ちょうどそれを同音異義語のように考えてください...イベントがあるすべてのクラスの中に、押すべき仮想ボタンを持つ小さな人がいます。彼はボタンが何をするのか分からないが、いつ押すべきかは知っている。次に、他の小さな人がいる関連クラスを考えます。その人は、ボタンが押されたというメッセージを聞いたとき、彼は何かをすることになっていることを知っています。
最初の男がしたことを2番目の男に知らせたいときはいつでも、最初のクラスと2番目のクラスの間にスイッチボードを接続します(イベントにサブスクライブします)。最初の男がボタンを押すと(イベントが発生します)、2番目の男は自分がすべきことを知っていることを何でもします...
これが役立つかどうかわからないのか、自分のプログラムの小さな小さな人々のことを考えてただのアシッドトリップをしています...
StackOverflow
で投票すると、評判が落ち、下矢印が赤に変わります。
通常、単一のonclick
を記述し、その中のすべての要素を更新し、ページレイアウトが変更されるたびに変更することを忘れないようにします。
代わりに、onVoteDown
イベントを宣言し、div
で発生させて、このイベントをサブスクライブできます。
- あなたの評判
img
- 矢印
XmlHTTPRequest
- サーバーに投票を送信する<=>。
いかのような答えを探しているので、会員の方はログインしてくだ場合は、日本には何もあります。;)
による カスタム, いう カスタムアクション, カスタムトリガー, や真 カスタムイベント?
E.g.:A カスタムアクション う反応するのは、事前に定義されたイベント(たとえば、マウスをクリックし、 カスタムトリガー う捏マウスをクリックし経由のスクリプト、 カスタムイベント するリスナーが定義されていない言語ではない可能です。
ばんざい カスタムイベント, できませんのお手伝いいたします。ものとは思わないがたくさんのサポートに向かっているとのことです。
を定義する 行動...
イベントが通常よって定義済プロパティのオブジェクトという window.onload
.デフォルトでは、彼らはすべて等しい undefined
または null
.なので、ち上がりが望まれていることから、その価値機能です。
でご利用いただけます。"anonymous"機能:
window.onload = function (eventObject) {
/* ... */
};
または設定を機能ご参考(せんが、同様にポインタ):
function handleOnload(eventObject) {
/* ... */
}
window.onload = handleOnload; /* note the lack of parenthesis */
きのとき、関数が呼び出されます。なので、いずれの設定の場合、ページの読込みが完了するコード配置の代わりに /* ... */
が実行されることはありません。
あるものの形式的手法で作成できる。W3Cの定義 addEventListener
がIE用 attachEvent
. 詳細情報.
あたっぷりの参考文献利用の学習の一覧をご用意。ここでの2べきを楽しみたい方にピッタリ:
ブラウザの通常のトリガイベント--いずれかのブラウザにイベントonload
)またはユーザーイベントonclick
).の機能には対応いたします。
トリガ ご自身のイベントなものを成し遂げた完全に定義する Event
オブジェクトがかかる作業で、 により異なるブラウザ.
も必要がない場合には、 Event
オブジェクトでのイベント:
window.onload();