Edited at

イベント駆動プログラミング

More than 5 years have passed since last update.

D氏がiPhoneについての記事を書いているので、便乗します!

今回はイベント駆動プログラミングについて説明していきます。


イベント駆動とは

イベント駆動とは「イベント」と呼ばれるアプリや端末上で起きた出来事に対して処理を行うプログラムの実行形式のことです。

イベントがトリガーとなって、関数やメソッドが実行される、というイメージです。

javascriptでのプログラミングもobjective-Cでのプログラミングも、このイベント駆動の仕組みを理解するとプログラミングがしやすくなります。


イベント駆動型プログラミングの難しさ

CやJavaで普通のプログラミングをする時は、基本はじめにmain関数が呼ばれ、上から順に実行されていきます。こういうプログラミングは、「どの関数がいつ実行されるか」ということをプログラマが決めることができます。

一方イベント駆動プログラムの場合は、「どの関数がいつ実行されるか」をきめることができるのは、そのプログラム書いた人だけではありません。この、「完全に実行順序を制御できない」ことがイベント駆動のプログラミングをする上での難しさになってきます。



http://www.ics.kagoshima-u.ac.jp/edu/ProgramingJava/Event/images/eventdriven.gif

イベント駆動はこんな図で表されます。(イベントループなどは現状分からなくてもOK)


javascriptでのイベント

javascriptでイベントを発生させる可能性があるのは、いったい誰でしょうか。

まず最初に浮かぶのは、ユーザーです。


ユーザーによるイベント

例えばHTMLで

 <input type="button" onClick="yourFunction()">

と指定したボタンがあったとします。ユーザーがこのボタンをおすと、そのタイミングでyourFunction()関数が実行されます。


ブラウザによるイベント

もう一つイベントを発生させる可能性があるものは、ブラウザです。javascriptプログラミングにおいて、

window.onload = function(){}

のように書かれているのを見たことがあることは多いと思います。

window.onloadはページの読み込みが完了した時に実行される処理です。ここに関数を登録することで、ページの読み込みが完了時にその関数が実行されます。ちなみに

function(){}

という関数は「無名関数」という関数定義の方法で、プログラム内で一度しか書くことのない関数はこのように書くことがあります。


Objective-Cでのイベント

Objective-CでiPhoneアプリを開発する際も、同じようにイベント駆動型プログラミングをすることになります。


ユーザーによるイベント

ユーザーによるイベントには、例えばボタンのタッチイベントがあります。

ストーリーボード上でボタンと.hファイルをTouch Up Insideなどでつなげると

- (IBAction)buttonTouch:(id) sender;

のようなメソッドが作成されます。このメソッド内に書いた処理はユーザーがこのボタンを押すという「イベント」により発火されます。


iPhoneによるイベント

iPhoneのiosにより発火されるイベントもあります。これを理解するには、iPhoneのライフサイクルを理解することが必要です。以下の図のようになっています。



http://www.aguuu.com/wp-content/2011/02/UIViewControllerlifecycle-300x225.png

シングルビューアプリケーションを作成した際、ViewController.mのコード内に

- (void)viewDidLoad

{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}

というコードが自動的に生成されています。NSLogなどで確認すると分かりますが、上の図に書いてあるようにこの関数は画面が表示される直前に呼ばれます。この関数内には、インスタンス変数の初期化などの処理や、最初に一度実行したい処理を書いていくことになります。


おわりに

イベント駆動似ついては以上になります。少しでも分かってもらえたでしょうか?

もっと図や絵を入れて分かりやすい記事にしようと思ったのですが、ネット上に落ちてませんでした。:(´ཀ`」 ∠):

顔文字で代用しようかなヾ(@^∇^@)ノ