コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

「イベント駆動型プログラミング」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
m 曖昧さ回避ページブラックボックスへのリンクを解消、リンク先をブラックボックス (代表的なトピック)に変更(DisamAssist使用)
Teikan (会話 | 投稿記録)
m 曖昧さ回避
 
(10人の利用者による、間の12版が非表示)
1行目: 1行目:
{{出典の明記|date=2015年12月}}
{{出典の明記|date=2015年12月}}
{{プログラミングパラダイム}}
'''イベント駆動型プログラミング'''(イベントくどうがたプログラミング、{{lang-en-short|event-driven programming}})は、[[コンピュータプログラム]]が起動すると共に[[イベント (プログラミング)|イベント]]を待機し、発生したイベントに従って受動的に処理を行う[[プログラミングパラダイム]]のこと。従来の[[キャラクタユーザインタフェース]] (CUI) のプログラムに多く見られる、起動後に指定のタスクのみを実行して即座に終了するような、直線的な[[制御フロー]]を基本とするプログラミングパラダイムに対する概念。「イベント駆動」は「イベントドリブン ({{lang|en|event-driven}})」とカナ表記されることもある。


'''イベント駆動プログラミング'''(イベントくどうプログラミング、{{lang-en-short|event-driven programming}})とは、ユーザー側の操作による受動的なイベントの発生によって、コンピュータ側の能動的なプロセスの実行と[[制御構造|プログラムフロー]]の選択が決定されるという[[プログラミングパラダイム]]である。イベントドリブンとも邦訳される。[[グラフィカルユーザーインターフェース]](GUI)ソフトウェアでよく用いられており、ユーザー入力に対するレスポンス出力の実装に適している。[[デバイスドライバ]]プログラムでも多用されている。[[Webアプリケーション]]でも[[並行計算]]を実現するための[[非同期処理]]で活用されている<ref>https://www.tc3.co.jp/graphic-explanation-on-eventdriven-in-cloudnative/</ref>。
== 概要 ==

規則型(宣言型)のイベント駆動型プログラミングにおいては、規則の条件部が満たされ指定されたイベントが発生すると、その規則が実行される。このような規則を [[ECA]]規則 ({{lang|en|event-condition-action rule}}) という。
ここで言うイベントとは、[[クリック (マウス)|マウスクリック]]や[[キーボード (コンピュータ)|キーボード]]押下によるユーザー操作、[[センサー]]や[[シグナル (Unix)|シグナル]]受信によるハードウェア入力、走行[[スレッド (コンピュータ)|スレッド]]や発生[[トランザクション]]からの[[メッセージ (コンピュータ)|メッセージ]]受信を指している。プロセスの実行とは、[[スレッド (コンピュータ)|スレッド]]の開始や[[手続き]]/[[関数 (プログラミング)|関数]]の呼出しを指している。

== 特徴 ==
[[ファイル:Event driven programming Simply Explained.jpg|200x200px|サムネイル|イベントフロー図]]
規則型(宣言型)のイベント駆動型プログラミングにおいては、規則の条件部が満たされ指定されたイベントが発生すると、その規則が実行される。このような規則を [[ECA]]規則 ({{lang|en|event-condition-action rule}}) という。例えば為替レート換算であれば

* プログラムの起動直後 → '''換算前の金額'''を1に設定する
* 換算前の通貨単位と変換後の通貨を「選択」する → '''換算前の金額'''とそれぞれの通貨を為替換算サービスに送る
* サービスから為替レートを「受け取る」→ '''換算前の金額'''とレートから換算式を組み立てる。
* 入力欄に換算前の通貨の金額を「入力」する → 入力された金額を'''換算前の金額'''に設定する
* '''換算前の金額'''が「設定される」→ 換算式を利用して換算結果を提示する

といった規則を用意しておけば、利用者としては

* 通貨単位だけ選択済みで金額が未入力ならば、例えば1円あたり何ドルかが得られる
* 金額だけを変更することで、選択しておいた通貨間で換算を次々に行える
* 金額をそのままにしても、通貨を選ぶ度にすぐに換算される。
* 入力を「確定する」という余計な手順を省ける(リアルタイム性)

というメリットを享受できる。ここで挙げた例は、データや状態の変化に反応して処理が起動される{{仮リンク|リアクティブプログラミング|en|Reactive_programming}}と呼ばれる。


[[プロシージャ|手続き]]型のイベント駆動型プログラミングにおいては、まず各イベントに対応する処理を記述した手続き([[サブルーチン]]、関数、あるいは[[メソッド (計算機科学)|メソッド]])を、[[システム]]あるいは[[アプリケーションフレームワーク]]に登録する。この手続きはイベントハンドラー ({{lang|en|event handler}}) と呼ばれ、イベントが発生したときにシステムあるいはアプリケーションフレームワークによって呼び出される([[コールバック (情報工学)|コールバック]]される)。イベントの待機中([[アイドリング]]時)の処理はシステムに任せる。
[[プロシージャ|手続き]]型のイベント駆動型プログラミングにおいては、まず各イベントに対応する処理を記述した手続き([[サブルーチン]]、関数、あるいは[[メソッド (計算機科学)|メソッド]])を、[[システム]]あるいは[[アプリケーションフレームワーク]]に登録する。この手続きはイベントハンドラー ({{lang|en|event handler}}) と呼ばれ、イベントが発生したときにシステムあるいはアプリケーションフレームワークによって呼び出される([[コールバック (情報工学)|コールバック]]される)。イベントの待機中([[アイドリング]]時)の処理はシステムに任せる。
11行目: 31行目:
イベント駆動型プログラミングを行うメリットは、アプリケーションを作成する際に、必要なイベントハンドラーにのみ処理を書けばよい、ということである。イベントを待機するプログラム構造自体はどのアプリケーションもほぼ共通であり、結果として、アプリケーションフレームワークによるプログラム構造の[[ブラックボックス (代表的なトピック)|ブラックボックス]]化と再利用がしやすくなり、アプリケーションプログラマーが記述しなければならないコード量が減る。処理の記述をハンドラーごとに分けるので、プログラムの見通しも良くなる。
イベント駆動型プログラミングを行うメリットは、アプリケーションを作成する際に、必要なイベントハンドラーにのみ処理を書けばよい、ということである。イベントを待機するプログラム構造自体はどのアプリケーションもほぼ共通であり、結果として、アプリケーションフレームワークによるプログラム構造の[[ブラックボックス (代表的なトピック)|ブラックボックス]]化と再利用がしやすくなり、アプリケーションプログラマーが記述しなければならないコード量が減る。処理の記述をハンドラーごとに分けるので、プログラムの見通しも良くなる。


==用語と解説==
==イベント駆動型プログラミングの用語==
; イベント : 「キーボードのキーを押した」、「時計がある時刻になった」などの、プログラムの流れとは別に発生する事象。または、その事象に関する情報を含んだ[[メッセージ (コンピュータ)|メッセージ]]を指す。 →[[イベント (プログラミング)]]
; イベント : 「キーボードのキーを押した」、「時計がある時刻になった」などの、プログラムの流れとは別に発生する事象。または、その事象に関する情報を含んだ[[メッセージ (コンピュータ)|メッセージ]]を指す。 →[[イベント (プログラミング)]]
; イベントハンドラー : イベントが発生した際に実行すべき[[サブルーチン]]のこと。イベント[[フック (プログラミング)|フック]]、イベントリスナーなどの呼び方がある。
; イベントハンドラー : イベントが発生した際に実行すべき[[サブルーチン]]のこと。イベント[[フック (プログラミング)|フック]]、イベントリスナーなどの呼び方がある。
18行目: 38行目:
; イベントキュー : 複数のイベントが連続して発生した場合に、それらのイベントを[[キュー (コンピュータ)|待ち行列]]として保持するデータ構造。イベントの発生間隔が短く、次のイベントが発生するまでにイベントハンドラーの処理が間に合わない場合に[[バッファ]]として用いられる。→[[メッセージキュー]]
; イベントキュー : 複数のイベントが連続して発生した場合に、それらのイベントを[[キュー (コンピュータ)|待ち行列]]として保持するデータ構造。イベントの発生間隔が短く、次のイベントが発生するまでにイベントハンドラーの処理が間に合わない場合に[[バッファ]]として用いられる。→[[メッセージキュー]]
; [[イベントループ]] : イベントを待機する[[ループ (プログラミング)|ループ]]を持つ機構。イベントループ内にイベントディスパッチャーを持つ構造が一般的である。メッセージループ、メッセージポンプとも呼ばれる。
; [[イベントループ]] : イベントを待機する[[ループ (プログラミング)|ループ]]を持つ機構。イベントループ内にイベントディスパッチャーを持つ構造が一般的である。メッセージループ、メッセージポンプとも呼ばれる。

== 実装 ==
イベントで駆動される処理はイベントハンドラーに記述されるが、その実装方法は開発者に一任される。処理の特性(実行内容、規模/複雑性)に合わせた典型的なイベントハンドラ実装パターンが存在する。以下に各パターンを挙げる。

'''Fluxパターン'''

Flux(フラックス{{Efn|アプリケーションのデータフロー管理のためのアーキテクチャパターン。}})は、Actionを介したブロードキャスト型[[メッセージパッシング]]によるパターンである。状態管理をStoresに委譲し、イベントハンドラはActionの発火に特化する。イベント側と状態管理(ビジネスロジック)側を[[疎結合]]にできる利点を持つ。またActionメッセージを保持・記録して取り回すことができる。

UIが関わる実装としては、[[Redux (JavaScriptライブラリ)|Redux]]が[[デファクトスタンダード]]である<ref>{{Cite web |title=Related Libraries {{!}} Flux |url=https://facebook.github.io/flux/docs/related-libraries |website=facebook.github.io |access-date=2023-03-06 |language=en |publisher=[[Meta (企業)|Meta]] |date=2019/07/27 |work=flux}}</ref>。

'''Commandパターン'''{{Main|Command パターン}}
Commandパターンは[[オブジェクト指向プログラミング]]を用いたパターンである。実際の処理をCommandオブジェクトへ委譲し、command.Execute(コマンド実行)インターフェースをイベントハンドラ内で叩くことにより、イベントハンドラ側と処理側を[[疎結合]]に出来る利点を持つ。またCommandオブジェクトを保持・記録して取り回すことができる。

== 脚注 ==

=== 注釈 ===
<references group="注釈" />
<div class="references-small">
=== 引用 ===
<references /></div>


==関連項目==
==関連項目==
*[[プログラミングパラダイム]]
*[[データフロープログラミング]]
*[[シグナルプログラミング]]
*[[コールバック関数]]
*[[イベント (プログラミング)]]
*[[イベント (プログラミング)]]
*[[イベントループ]]
*[[イベントループ]]
*[[コールバック関数]]
*[[割り込み (コンピュータ)|割り込み]]
*[[出版-購読型モデル]]
*[[出版-購読型モデル]]
*[[メッセージ指向ミドルウェア]]
*[[メッセージ指向ミドルウェア]]
*[[データフロープログラミング]]
*[[割り込み (コンピュータ)|割り込み]]
*[[シグナルプログラミング]]
*{{仮リンク|フローベースプログラミング|en|Flow-based programming}}
*{{仮リンク|フローベースプログラミング|en|Flow-based programming}}
<!-- 以前の版に記載されてあった「フロー駆動型プログラミング」は出典がなく、独自研究により生み出された造語と思われるため、削除。なお、「命令型プログラミング」や「手続き型プログラミング」は、イベント駆動型プログラミングの対になる概念ではない。 -->
<!-- 以前の版に記載されてあった「フロー駆動型プログラミング」は出典がなく、独自研究により生み出された造語と思われるため、削除。なお、「命令型プログラミング」や「手続き型プログラミング」は、イベント駆動型プログラミングの対になる概念ではない。 -->


==外部リンク==
==外部リンク==
*[http://www.x-media.co.jp/jiten/index.cfm?ID=1772 X-Media用語辞典]{{リンク切れ|date=201512}}
*[https://web.archive.org/web/20070928120051/http://www.x-media.co.jp/jiten/index.cfm?ID=1772 X-Media用語辞典] - 2007928日12時00分51秒時点のアーカイブ。


{{プログラミング言語の関連項目}}
{{プログラミング言語の関連項目}}

2024年12月22日 (日) 08:04時点における最新版

イベント駆動プログラミング(イベントくどうプログラミング、: event-driven programming)とは、ユーザー側の操作による受動的なイベントの発生によって、コンピュータ側の能動的なプロセスの実行とプログラムフローの選択が決定されるというプログラミングパラダイムである。イベントドリブンとも邦訳される。グラフィカルユーザーインターフェース(GUI)ソフトウェアでよく用いられており、ユーザー入力に対するレスポンス出力の実装に適している。デバイスドライバプログラムでも多用されている。Webアプリケーションでも並行計算を実現するための非同期処理で活用されている[1]

ここで言うイベントとは、マウスクリックキーボード押下によるユーザー操作、センサーシグナル受信によるハードウェア入力、走行スレッドや発生トランザクションからのメッセージ受信を指している。プロセスの実行とは、スレッドの開始や手続き/関数の呼出しを指している。

特徴

[編集]
イベントフロー図

規則型(宣言型)のイベント駆動型プログラミングにおいては、規則の条件部が満たされ指定されたイベントが発生すると、その規則が実行される。このような規則を ECA規則 (event-condition-action rule) という。例えば為替レート換算であれば

  • プログラムの起動直後 → 換算前の金額を1に設定する
  • 換算前の通貨単位と変換後の通貨を「選択」する → 換算前の金額とそれぞれの通貨を為替換算サービスに送る
  • サービスから為替レートを「受け取る」→ 換算前の金額とレートから換算式を組み立てる。
  • 入力欄に換算前の通貨の金額を「入力」する → 入力された金額を換算前の金額に設定する
  • 換算前の金額が「設定される」→ 換算式を利用して換算結果を提示する

といった規則を用意しておけば、利用者としては

  • 通貨単位だけ選択済みで金額が未入力ならば、例えば1円あたり何ドルかが得られる
  • 金額だけを変更することで、選択しておいた通貨間で換算を次々に行える
  • 金額をそのままにしても、通貨を選ぶ度にすぐに換算される。
  • 入力を「確定する」という余計な手順を省ける(リアルタイム性)

というメリットを享受できる。ここで挙げた例は、データや状態の変化に反応して処理が起動されるリアクティブプログラミング英語版と呼ばれる。

手続き型のイベント駆動型プログラミングにおいては、まず各イベントに対応する処理を記述した手続き(サブルーチン、関数、あるいはメソッド)を、システムあるいはアプリケーションフレームワークに登録する。この手続きはイベントハンドラー (event handler) と呼ばれ、イベントが発生したときにシステムあるいはアプリケーションフレームワークによって呼び出される(コールバックされる)。イベントの待機中(アイドリング時)の処理はシステムに任せる。

一般的に、グラフィカルユーザインタフェース (GUI) を使用するオペレーティングシステムアプリケーションソフトウェアでは、イベント駆動型プログラミングを利用している。マウス操作やキーボード操作といったユーザーからの入力や、システム状態の変化・変更といった各イベントに対する処理を統一的に記述することができる。

イベント駆動型プログラミングを行うメリットは、アプリケーションを作成する際に、必要なイベントハンドラーにのみ処理を書けばよい、ということである。イベントを待機するプログラム構造自体はどのアプリケーションもほぼ共通であり、結果として、アプリケーションフレームワークによるプログラム構造のブラックボックス化と再利用がしやすくなり、アプリケーションプログラマーが記述しなければならないコード量が減る。処理の記述をハンドラーごとに分けるので、プログラムの見通しも良くなる。

用語と解説

[編集]
イベント
「キーボードのキーを押した」、「時計がある時刻になった」などの、プログラムの流れとは別に発生する事象。または、その事象に関する情報を含んだメッセージを指す。 →イベント (プログラミング)
イベントハンドラー
イベントが発生した際に実行すべきサブルーチンのこと。イベントフック、イベントリスナーなどの呼び方がある。
トリガー
イベントを発生させるきっかけ。プログラム内部でイベントを起こすことを「イベントをトリガーする」と表現することもある。
イベントディスパッチャー
発生したイベントをイベントハンドラーに振り分ける機能のこと。
イベントキュー
複数のイベントが連続して発生した場合に、それらのイベントを待ち行列として保持するデータ構造。イベントの発生間隔が短く、次のイベントが発生するまでにイベントハンドラーの処理が間に合わない場合にバッファとして用いられる。→メッセージキュー
イベントループ
イベントを待機するループを持つ機構。イベントループ内にイベントディスパッチャーを持つ構造が一般的である。メッセージループ、メッセージポンプとも呼ばれる。

実装

[編集]

イベントで駆動される処理はイベントハンドラーに記述されるが、その実装方法は開発者に一任される。処理の特性(実行内容、規模/複雑性)に合わせた典型的なイベントハンドラ実装パターンが存在する。以下に各パターンを挙げる。

Fluxパターン

Flux(フラックス[注釈 1])は、Actionを介したブロードキャスト型メッセージパッシングによるパターンである。状態管理をStoresに委譲し、イベントハンドラはActionの発火に特化する。イベント側と状態管理(ビジネスロジック)側を疎結合にできる利点を持つ。またActionメッセージを保持・記録して取り回すことができる。

UIが関わる実装としては、Reduxデファクトスタンダードである[2]

Commandパターン

Commandパターンはオブジェクト指向プログラミングを用いたパターンである。実際の処理をCommandオブジェクトへ委譲し、command.Execute(コマンド実行)インターフェースをイベントハンドラ内で叩くことにより、イベントハンドラ側と処理側を疎結合に出来る利点を持つ。またCommandオブジェクトを保持・記録して取り回すことができる。

脚注

[編集]

注釈

[編集]
  1. ^ アプリケーションのデータフロー管理のためのアーキテクチャパターン。

引用

[編集]
  1. ^ https://www.tc3.co.jp/graphic-explanation-on-eventdriven-in-cloudnative/
  2. ^ Related Libraries | Flux” (英語). facebook.github.io. flux. Meta (2019年7月27日). 2023年3月6日閲覧。

関連項目

[編集]

外部リンク

[編集]