以前の開発者が書いたコードを理解しようとしているときに、この質問について考えていました。プログラムの制御がどのように行われているかを追跡しようとすると、プログラムの実行パスがほとんど明らかでなかった BASIC の昔のことを思い出しました。これはイベントの乱用の兆候ですか、それともオブザーバー パターンに構造的な問題がありますか?
5 に答える
他のテクノロジーと同様に、イベントは誤って使用され、悪用される可能性があります。ただし、問題の例を挙げていないため、何について話しているのかを伝えることは事実上不可能です。
一般的に、いいえ。イベントは の OO に相当するものでGOTO
はなく、通常は問題にもなりません。また、私が認識しているオブザーバー パターンには構造的な問題はありません。しかし、虐待は何にでも起こりえます。
GOTO は多くの理由で悪いですが、最大の理由の 1 つは、単なるサブルーチンの実行ではなく、プログラム フローの転送であることです。goto を使用すると、プログラムの実行は、goto 呼び出しが完了した時点 (または非同期イベントの場合は開始された後) に戻りません。プログラム フローは、新しい実行ポイントに永続的に転送されます。さらに悪いことに、他の制御構造や他の関数の内部を含め、どこにでも実行を移すことができます。
イベントにはこれらの特性がまったくなく、オブジェクト認識とパブリッシュ/サブスクライブ機能を備えた関数ポインターにすぎません。(わかりました、それ以外にもたくさんありますが、これが基本的な使い方です)
いいえ、そうではありません。後藤は…あぁ…猛禽類が怖い…
イベントは、1 つずつ呼び出されるデリゲートのリストにすぎません。鉄:
-> Click Event gets called
-> List of associated Event-Handlers
-> Calls every Event-handler/Delegate in the List
イベントに関して私が目にした最悪の事態は、イベント内で他の複数のイベントを呼び出すことです。私が一緒に働いていたある同僚は、これを常に行っていました。トラバースするのが難しい状況かもしれないと思いますが、それでも GOTO よりは読みやすいです。
イベントはGOTOと同等ではありません。さらに悪化する可能性があります。プログラマーは、コードにGOTOを記述しなければならないときに気分が悪くなります。イベントでは違います。イベントを使用すると、人々は達成感があり、落ち着きがあり、クールだと感じます。私は最近、約100のクラス、400のイベント、300のハンドラー登録を持つシステムを理解しようと時間を費やしました。私はあなたの痛みを理解しています。Eventを使用すると、一見独立しているように見えるオブジェクトを簡単に接続できます。イベントは、オブジェクトと参照の論理的な関係をパスまたは非表示にし、システム全体を理解するのを非常に困難にする可能性があります。
あなたの質問に答えるために、GOTO自体は予約語であるため、イベントはGOTOに相当するオブジェクト指向ではありません。イベントは異なります。イベントは発火に従い、コード内で GOTO が「発火されるが手続き的に処理される」というパラダイムを忘れます。GOTO を使用すると乱用が発生し、スパゲッティ コードになる可能性があります。ただし、GOTO を使用できるのは、メソッドまたは関数の範囲内でエラーを回復する場合のみです。イベントは多くの受信者によって消費される可能性がありますが、GOTO は 1 つのみによって消費されます。
イベントのフローとトレースを確認してコードをよりよく理解するために、実行時に AOP をコードに挿入できるPostSharpなどの AOP フレームワークを使用する価値があるかもしれません。
これがお役に立てば幸いです。よろしくお願いします、トム。