Top > Programming > .NetFramework > Tips > EventHandlerOrOverride
Last-modified: Sat, 16 Mar 2013 17:28:07 JST
Counter:2791 Today:2 Yesterday:0 Online:5
このエントリーをはてなブックマークに追加

イベントハンドラよりオーバーライドを優先する

About

EffectiveC#の内容のようです。継承によって機能を引き継いだオブジェクトを設計する場合に、次の2つからいずれかの実装方法を選択することがあります。例えばC#(.Net)プログラミングでいうと、GUIの実装が主な例になります。

  • (1)「あるイベントAの通知に対して、実行されるメソッドAをオーバーライドする」
  • (2)「あるイベントAの通知に対して、そのイベントハンドラとなるメソッドBを実装する」

このような場合にはどちらを選択するべきなのでしょうか、という話です。通常は「イベントハンドラよりもオーバーライドを優先する」が正しいようです。

Why

通常のメソッドかイベントハンドラか分かりにくい

この理由は実装してみると良く理解できます。オーバーライドであれば、任意のメソッド名ではなく、オーバーライドする元のメソッド名が与えられるので、ある程度、ソースコードの(直観的な)視認性は向上します。一方でイベントに対し任意のイベントハンドラとなるメソッドで実装する場合、そのメソッドはoverride修飾子は与えられず、さらにプログラマによって自由な名前が与えられるので、オーバーライドと比較してソースコードの視認性が落ちます。どのタイミングで実行される内容で、どのイベントによって通知されるメソッドなのか、を明示することができる、という意味で、複数のプログラマによって開発がすすめられる場合は特に有効なのかもしれません。

小さな規模の開発では、これに関しては気にする必要があまりないかもしれません。C#の主要な開発環境は何れもregionコードによって任意のグループに仕分けし、ソースコードの視認性を向上させることができます。

イベントの登録忘れや登録順によるトラブル防止

オーバーライドによって、イベントの登録忘れによるトラブルは発生しなくなります。もっともこのような例はほとんど無いのでしょうが。

またイベントに対しる処理の実行順を変更しにくくすることも出来るでしょう。しかしながら、これにも反する問題が発生してしまうのです。ハードコーディングしてしまうと順序は確かだが、変更に対して柔軟性がなく、またイベントハンドラよりマシな程度で、やっぱり実行順に対して厳格な保証はありません。

その他

プログラミング初心者である私が恩恵を確認しにくいので、詳細を掲載しません(出来ません)。EffectiveC#では次のような議論がされているようです。

  • イベントハンドラはオーバーライドよりも重たい処理である
    • 大量の通知が発生しない限り、これを気にする必要が現代においてあるのかどうかが疑問
  • イベントハンドラは呼び出される保証がない
    • スーパークラス(継承元)のメソッドはいずれにせよ、実行される上に、厳格なプログラミングが求められる環境では全ての例外処理に対応する必要があるので言い分が理解できない。

Reference