イベント指向プログラミングについて話すときは、通常、オブザーバー デザイン パターンの 1 つまたは複数の実装について話します。また、オブザーバー デザイン パターンの目標の 1 つは、オブジェクト間の疎結合を実現することです。
良い例がなければ、それはおそらくあまり意味がありません。確かに良い例はたくさんあります。私はそれらの中で最高のものになるとは思いませんが、それでも私はそれを強打します. 2 つのオブジェクトを想像してください。1 つのオブジェクトは、他のオブジェクトで何かが起こったときに知りたいので、それ自体で何かを行うことができます。おそらく、家族の犬であるローバーは、仕事から帰ってきたときにドアでお父さんに挨拶したいと考えています。そのシナリオをプログラムする方法はいくつかありますよね?
表面的には、この 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 は私が説明した概念モデルに従います)、父が帰宅し、家族全員がそれを行います。自動的にサインアップしたこと。
イベント思考とはどのようなものか、疎結合とは何を意味するのか、なぜ重要なのかなど、これで少しは説明がつくことを願っています。頑張ってください!