2

GUIボタンにMFCを使用してC++イベント駆動型アプリを作成し、onmousedownなどのHTMLイベントを使用してWebページでJavascriptをトリガーします。インターフェイスを使用していてイベントがハードコーディングされている場合、イベント駆動型プログラミングの考え方は直感的です。

Cで関数ポインターを使用する方法を知っており、Windowsがそれらを使用してイベントループを実行する方法を理解しています。別の関数を動的に呼び出すコードを書くことができます。

私の問題は、コンパイル時からランタイムに移行することです。ここではどの言語でも話していますが、言語が必要な場合は、最近使用しているJavascriptまたはPHPを選択してください。自分のイベントオブジェクトを使用して何かを実行する方法をまったく理解していません。それは私が得た概念ではありません。そして、私はそれらを使用しないので、それらの実際の使用が何であるかわかりません。

たとえば、カスタムのターンベースのゲームを作成したい場合は、イベントオブジェクトを使用して、「発生」する必要があるゲームピースの能力の効果を表すことができると思います。

誰かが私にカスタムイベントの簡単な使用法を教えてもらえますか?またはそれが有用または実用的な状況ですか?それは言語と環境、そしてイベントの処理方法に大きく依存しますか?Javascriptの答えは良いでしょうが、私は多くの言語を読みました。

申し訳ありませんが、私はこの点で不十分であり、実用的で高度な(中級?)洞察が必要です。それはCのポインターのようなものです。私はポインターとそれらがあなたの友達である方法を「取得」します。しかし、私がそうしなかった時がありました、そして私が知っている多くの人々はまだそうしません。一度取得すれば簡単です。カスタムの動的なイベントをそのように取得することはありません。

4

6 に答える 6

5

イベント指向プログラミングについて話すときは、通常、オブザーバー デザイン パターンの 1 つまたは複数の実装について話します。また、オブザーバー デザイン パターンの目標の 1 つは、オブジェクト間の疎結合を実現することです。

良い例がなければ、それはおそらくあまり意味がありません。確かに良い例はたくさんあります。私はそれらの中で最高のものになるとは思いませんが、それでも私はそれを強打します. 2 つのオブジェクトを想像してください。1 つのオブジェクトは、他のオブジェクトで何かが起こったときに知りたいので、それ自体で何かを行うことができます。おそらく、家族の犬であるローバーは、仕事から帰ってきたときにドアでお父さんに挨拶したいと考えています。そのシナリオをプログラムする方法はいくつかありますよね?

  • お父さんが Rover への参照を持っていることを確認し、お父さんが帰宅したら、Rover の greetingDatAtTheDoor() メソッドを呼び出すか、

  • ローバーにお父さんへの参照を与え、お父さんの onArriveHome イベントをリッスンし、それが起動したら、内部で greetingDadAtTheDoor() を呼び出します。

表面的には、この 2 つの間に大きな違いはないように見えるかもしれませんが、実際には、お父さんは Rover の実装の一部を彼に焼き付けています。何らかの理由で Rover の実装を変更する必要がある場合は、2 つの場所で変更を加える必要があります。1 つは Rover で、次にもう 1 つは Dad です。大したことではないかもしれませんが、それでも理想的ではありません。

ここで、お母さんがお父さんにも挨拶したいと想像してみてください。そして、猫の Bigglesworth さんは、お父さんがあまり好きではありませんが、お父さんが近くにいないことを確認したいので、むしろ外に出たいと思っています。近所のジョーは、お父さんがいつ家に帰るのか知りたがっています。これらすべてのシナリオと、必然的に発生する追加のシナリオをどのように説明すればよいでしょうか? お母さんのgreetHusband()メソッド、猫のgetOutNow()メソッド、犬のgreetDadAtTheDoor()メソッド、ジョーのgoGetMyMoney()メソッドへの参照をお父さんのクラス定義に入れると、お父さんはすぐに混乱してしまいます。お父さんが本当にしなければならないことは、自分自身が帰ってくることです。お母さん、犬、猫、そして隣人は、それが起こったときに通知を受けたいだけです.

言語はさまざまな方法でこのようなものの詳細を処理しますが、グーグルで調べ始めるとわかるように、パターンには通常、イベント「ディスパッチャー」(この場合はお父さん) に配列または配列のような構造が含まれます-- つまり、他の全員が関心を持っているオブジェクト)、および「サブスクライバー」(ママ、猫、ローバー、ジョーなど) はすべて、ディスパッチャーで公開されているメソッドを呼び出し、自分自身への参照を渡すことによって「登録」します。 -- 何らかの形で、お父さんの「サブスクライバー」の配列に含まれる参照。次に、お父さんが帰宅すると、「ただいま」というイベントを「送信」します。イベント、たとえば、これは基本的に、各サブスクライバーをループし、パブリックにアクセス可能な独自のメソッドでそれらを呼び出す機能です。それだけです。

私はたまたま最近ほとんど ActionScript をコーディングしているので、これが私の世界でどのように見えるかを以下に示します。

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 は私が説明した概念モデルに従います)、父が帰宅し、家族全員がそれを行います。自動的にサインアップしたこと。

イベント思考とはどのようなものか、疎結合とは何を意味するのか、なぜ重要なのかなど、これで少しは説明がつくことを願っています。頑張ってください!

于 2009-01-23T08:38:42.377 に答える
2

コンパイル済み言語では、独自のイベント ループを記述します。ランタイム言語では、ホスト環境によって既に実装されており、プログラマーはイベント システムへの抽象化されたインターフェイスのみを取得します。イベント ループは表示されません。

イベントを使用して機能を構築するには、2 つの側面があります。1 つ目は、イベントが発生する条件を定義することです。ブラウザの JavaScript には、単一のmousedownイベントはありません。実際、ページ上のすべての要素に 1 つずつあります。この場合、いずれかがいつ起動するかの条件は、マウス カーソルの位置と、マウス ボタンがアップ状態からダウン状態に切り替わったかどうかの両方に基づいています。この条件により、複数のイベントが発生する場合があります。(ブラウザには、bubblingこれに関連するイベントというものがありますが、ここでは範囲外です)。

もう 1 つの側面は、イベント ハンドラーです。イベントは、ハンドラーがあるかどうかに関係なく発生します。ハンドラの提供はあなた次第です。JavaScript では、関数はファースト クラスの値です。コンパイル時ではなく、実行時に定義されます。したがって、ポインタやジャンプ テーブルは必要ありません。実行時に新しい関数を作成し、特定のイベントが発生したときにホスト環境が検索する特別なプロパティに割り当てます。

そのため、スタック オーバーフローでは、下向き矢印の各イベントにイベント ハンドラーがありonclick、矢印が赤くなり、数値が減少し、他の変数がチェックされ、条件付きで通知が表示されます。その後、ハンドラーが戻ると、スレッドの制御がブラウザーに返され、ハレルヤ、ユーザーは再びブラウザーと対話できるようになります。(イベントが処理されている間はすべての対話が停止するため、すばやく処理することをお勧めします)。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 アプリケーションは、順を追って一直線に進むわけではありません。ユーザーの入力に動的に応答する必要があります。イベントは、マルチスレッド アプリケーションの外観を偽装する方法の 1 つです。互いに中断することなく、多くのことが同時に起こっているようにユーザーに見せることができます。

ライブラリを使用してカスタム イベントを定義できます。これはおそらく、何らかのドメイン固有のイベントをエンコードします。例: 次の動きを考えているチェス ゲームがあります。移動を検索するプロセスが時間切れになります。チェス ゲームでonComputerMoveイベントを発生させることができます。動きの仕様を取得し、チェス盤の視覚的表現を更新し、ユーザーにメッセージをポップアップして終了する関数を使用して、そのイベントを処理できます。次に、プレイヤーが移動したときにonPlayerMoveイベントを発生させることができます。これはほとんど同じことを行います。

于 2009-01-22T23:49:39.823 に答える
1

イベントの最も素晴らしい点は、2つのモジュールまたはクラス間の双方向の明示的な結合を減らすことです。

だから私は2つのクラスを持っているとしましょう:赤ちゃんとママ


イベントがなければ、ママが赤ちゃんを養うことを可能にする2つの方法が大まかにわかります。

  • ママは、baby.pokeBelly()あなたが呼び出す必要があるかどうかを知るために、30分ごとに赤ちゃんのメソッドを呼び出しますbaby.fillWith(milk)
    問題は、ママのスレッドが赤ちゃんの後に一日中待たなければならないということですループ
  • 赤ちゃんは関連するママを知っており、mommy.feed(me)メソッドを呼び出します。メソッドは次にを呼び出しますbaby.fillWith(milk)
    問題は、単純な赤ちゃんに、正しいお母さんに腹を満たすように頼むことです。
    彼らは単純なままでなければならないので、赤ちゃんはそれをしません。

Mommy.OnBabyCries(baby)イベントを使用すると、をその赤ちゃんのbaby.Cryイベントにバインドできます。

void Mommy.OnBabyCries(baby) {
    baby.fillWith(milk)
}

この後、赤ちゃんが食べたいと思ったら、Cryイベントを上げるだけです。

論理はママ、または後でベビーシッターにとどまり、ベイビーは心配することなく幸せにとどまります。

于 2009-01-23T02:21:37.927 に答える
0

あなたが探している答えの種類がよくわからないので、これが何かに近いものでなければ申し訳ありません。;)


カスタムとは、カスタム アクションカスタム トリガー、または真のカスタム イベントを意味しますか?

例:カスタム アクションは事前定義されたイベント (マウス クリックなど) に応答し、カスタム トリガーはスクリプトを介してマウス クリックを偽造し、カスタム イベントは言語によって定義されていないか定義されていないリスナーになります。すぐに利用できます。

カスタム イベントをお探しの場合は、私にはお役に立てません。ただし、JavaScript ではあまりサポートされていないと思います。


アクションを定義するには...

イベントは通常、オブジェクトの事前定義されたプロパティを介して確立されますwindow.onload。デフォルトでは、それらはすべてundefinedまたはに等しいnullです。したがって、それらを使用するには、それらを関数の値に設定する必要があります。

「匿名」関数を使用できます。

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();
于 2009-01-22T23:31:35.837 に答える
0

StackOverflow、反対票を投じると、評判が下がり、下向きの矢印が赤くなります。

通常、単一の を記述し、そのonclick中のすべての要素を更新し、ページ レイアウトが変更されるたびに変更することを忘れないようにします。

onVoteDown代わりに、イベントを宣言し、それを起動onclickして、このイベントを購読することができます:

  • あなたの評判div
  • あなたの矢img
  • あなたXmlHTTPRequestの投票をサーバーに送信します。
于 2009-01-22T23:07:35.137 に答える
0

あなたの質問を完全に理解しているかどうかはわかりませんが、イベントのあるクラスはボタンのある GUI のようなものです。ホムンクルスのように考えてみてください...イベントのあるすべてのクラス内には、押す仮想ボタンを持った小さな人がいます。ボタンが何をするかはわかりませんが、いつ押すかは知っています。次に、別の小さな人物がいる関連クラスについて考えてみましょう。その人は、ボタンが押されたというメッセージを聞いたとき、何かをしなければならないことを知っています。

最初の男がしたことを 2 番目の男に知らせたいときはいつでも、最初のクラスと 2 番目のクラスの間に配電盤を接続します (イベントに登録します)。最初の男がボタンを押す (イベントを発生させる) と、2 番目の男は自分がすべきだとわかっていることを何でも実行します...

これが役立つかどうかはわかりませんが、プログラムで小さな小さな人々を考えて酸っぱい旅行をしているだけです...

于 2009-01-22T22:53:03.557 に答える