🙌

[初心者向け🔰]ハンドラーに対する理解度が上がった話

2024/11/23に公開

JavaFXでGUIについて勉強をしている最中にイベントハンドラーという用語に出くわしました。ハンドラーというと、Pythonでロガーを作成をする時に、logging.handlersで使っていたりAWSのlambdaでlambda_handlerでメソッド書いていたりとそれなりに馴染みがある言葉でした。が、そもそもハンドラーとは何者なのかという疑問が浮かんできたので、調査を経て自分なりに理解した特徴をこの記事にまとめてみました。

'XXX-er'の仲間たち

プログラミング用語には動詞+erを末尾に付ける用語を頻繁に目にします。何をするオブジェクトなのか一目で分かりますからね。ハンドラーはhandle+erですから、何らかの対象を取り扱う仕切り屋さん的なイメージになるのでしょうか。ハンドラーの前に対象がくっついて、ログならログハンドラー、イベントが対象ならイベントハンドラーとなるわけです。

名称 役割
handler イベントや動作を処理する(例: イベントハンドラー)
getter データを取得する(例: フィールドの値を返す)
setter データを設定する(例: フィールドの値を変更する)
listener イベントを「聞く」役割。イベントが起こるのを監視して通知を受け取る
logger ログを記録する(例: エラーや情報をログファイルに保存)
runner プログラムや処理を実行する(例: スレッドやジョブの実行)
loader データやリソースをロード(読み込む)する(例: ファイルや設定の読み込み)
reader データを読む(例: ファイルやストリームからデータを読み取る)
writer データを書き込む(例: ファイルやストリームにデータを保存)
parser データを解析して意味のある情報に変換する(例: JSONやXMLパース)
builder オブジェクトを構築する(例: 複雑なオブジェクトを段階的に作成)
filter データをフィルタリングする(例: 条件に合ったものだけを残す)

直接処理を書いた場合

イベントハンドラーの場合、クリックなどのアクションをトリガーにして何らかのイベントを処理します。具体的な実装としては、クリック発生時の挙動を書いた関数を用意して、クリック発生というイベントとその関数を紐づけるんですね。でも関数なら直接処理を書けばいいんじゃないかと思ったのですが、もしハンドラーを用意せずに直接コードに書くとなると、プログラムのどこかでクリックステータスを常にチェックしつづけなければならないという、非常にややこしい自体が起こります。

while (true) {
    if (ボタンがクリックされた) {
        System.out.println("ボタンが押されました");
    }
}

イベントは「いつ発生するか分からない」ものです。ユーザーがボタンをクリックするタイミングはプログラムの制御外です。ハンドラーを登録しておくことで、イベントが発生したときにだけ処理が実行されます。

button.setOnAction(event -> System.out.println("ボタンが押されました"));

同時に、ハンドラーを設定すれば、コードが構造化されるため、ケースごとに応じた処理の設定やコードの再利用/管理がしやすくなるというメリットも生まれます。

ハンドラーとメソッドの分岐点

「handle」という動作は、外部から発生するアクションや状況に応じて適切に処理を行うというニュアンスを持っています。故にhandlerは「自分で能動的に何かを始める」わけではありません。一般的な関数とハンドラーとを分ける特徴は外部依存性とイベント駆動的設計です。

  • 外部依存性
    • 例えば、ユーザーがボタンをクリックしなければhandleは呼び出されません
    • このように、動作のトリガー(起点)は外部で発生します
  • イベント駆動的な設計設計
    • プログラムのメインループが進行している間も、handleは「イベント発生待ち」の状態
    • トリガー発生後、必要に応じて実行されます

このような特徴を備えているため、handlerが活用される場面は次のようなものがあります。

活用シーン 具体例
イベント駆動プログラム GUI、ゲーム、IoTデバイスなど、外部からの入力を待ち続けるプログラム
非同期処理 ネットワーク通信や非同期タスクの完了を待って処理する場合
例外処理 実行時の想定外の事象(エラーや例外)を適切に対処する
リクエストとレスポンス WebサーバーやAPIで、クライアントからのリクエストを「handle」して、適切なレスポンスを返す

まとめ

今までゆるふわに理解していたハンドラーという用語について理解が深まりました。XXX-handlerという未知のクラス/メソッドを見ても、「外部のトリガーをきっかけにXXXについて何らかの処理を実行するんだな」と焦らずに済みますね。あれ、なんだか表面上の解像度はあまり変わらないように見えますが、頭の中では外部依存性イベント駆動的な設計というポイントを理解した状態になったので満足しています。

参考リンク

Discussion