2012-11-27 8 views
9

私はプログラミングが初めてで、多くのゲームコーディングチュートリアルをチェックしてきました。ほとんどの場合、メソッドを直接呼び出すのではなく、カスタムイベントを使用してメソッドをトリガーすることに気がつきました。ダイレクトメソッド呼び出しの代わりにカスタムイベントを使用する理由

このプラクティスの背後にある理由は何ですか?なぜ彼らは方法を呼んでいないのですか?例えば

AB


我々は2つのオブジェクトを持っています。 Aには条件が発生したときにBが使用する必要があるメソッドA.methodA()があります。

BA.methodA()

の代わりに実行するようにAを伝えAにイベントを送出します:実装なぜ

BA.methodA()

を使用しています
+0

だけでなく、参照にuはメソッドをトリガーする必要があるたびに作り、u'reガベージコレクタのために簡単に命を作る=)(彼は)心配するより少ないものを持っています。 – Ziul

答えて

14

主な理由は、利益の分離です。イベントを使用する場合、クラスAはクラスBの存在を知る必要はありません(またその逆もあります)。

これにはいくつかの利点があります。

  • はるかに簡単ユニットテスト(あなたはクラスBなしでクラスAをテストすることができます)あなたが少なく、クラスAまたはB
  • を変更したときにコードを壊すの
  • 少ないチャンスあなたのコード内の他のクラスへの参照は、メモリリークの可能性を減らします。
  • クリーナーコード
  • もっと柔軟で再利用可能なコードです。
+4

+1;また、オブジェクトがその親と通信するための適切な方法であると付け加えます。メソッド呼び出しまたはパブリックプロパティは、親がその子と通信する適切な方法です。 – JeffryHouser

+3

@ www.Flextras.com - 特に、子クラスがさまざまな親クラスで使用されている場合に合意しました。 – BadFeelingAboutThis

2

通常、イベントを使用するより大きなアプリケーションでは、すべてを抽象化するのに役立ちます。あなたが15以上のクラスを持っていて、それらがすべてコントローラにイベントをディットしているときは、コードをトレースして関数をトレースするよりも、何が起こっているのかを理解するのがずっと簡単です。コールバックを使用すると、スパゲッティコードが作成されます。

ただし、直接関数呼び出しはイベントよりも高速に実行されます。

1

個人的には、使いやすさのためにカスタムイベントを使用しています。何かが起こったとき(アニメーションが終了する、またはダウンロードでエラーが発生するなど)、あるクラスがイベントを送出し、そのイベントに基づいて他の任意の数の他のクラスを実行できます。さらに、私は再利用性をコードします。各クラスの目標は完全な独立性であり、他のパッケージを必要とせずにどのプロジェクトでも実行できます。したがって、あるクラスが別のクラスのメソッドを呼び出すのではなく、第2クラスがリッスンする最初のクラスからイベントを送出し、そのメソッドを実行します。その後、私は別のプロジェクトのファーストクラスが必要なときに、私はそれを変更せずに、すべての機能を失うことなく、それをコピー/貼り付けすることができます。

EDIT: また、イベントの引数を渡すことを回避するために、ユーザーが記述したことを行うことがあることに注意してください。

ステージ上にボタンがあり、それをクリックする必要があるとしますが、手動でそのメソッドを呼び出すことができる必要があるとします。あなたがnullイベントを渡すことができ、単一のメソッドしか持てないことを気づかない人もいます。それとも、nullのデフォルト引数として設定することができ、以下を参照:

private function onClickHandler(e:MouseEvent = null):void{ 
    //as long as you never reference "e" within this method, this method can be used both for MouseEvent listeners and manually calling it elsewhere in the code 
} 

技術は、他の方法と他には何を呼び出すイベントハンドラを避ける助けることができます。私のプログラミングのこの時点で、私が書き込むすべてのAS3イベントハンドラは、デフォルトでイベント引数をnullに設定します。後で簡単にするだけです。

1

You might want to read this.

も注意してコールバックメソッドを使用して、カスタムイベントモデルから直接ではなく、それにパラメータを渡すことができます。

0

非常に単純化された独自のイベントディスパッチャシステムを構築しました。 ASイベントモデルは非常に強力ですが、99%の状況ではそのパワーは必要ありません。イベントとして起動されたパラメータを持つ単純なコールバックは十分です。イベントモデルから多様性を保つことはできますが、シンプルなボタンのようにあまりにも多くのコード行を書く必要はありません。 私はセットアップ、このような単純なイベントができます。

Buttonizer.autoButton(_buttQuit, this, "onPress"); 
public function onPressQuit(c:Sprite) { 
// Execution goes here 
} 

あなたがあなた自身のイベントモデルを構築することができ、それは単純に生活し、あなたのコードははるかに簡潔になります。

関連する問題