node.js で「サラリーマンの朝」をプログラムしてみる
2012.10.17
先日の「node.js と thread hog の話」には、たくさんのコメントをいただいたが、やはり「イベント駆動型」のプログラミングには抵抗がある人も多いようだ。そこで、JavaScript の無名関数を使ったイベント駆動型のプログラミングの可読性が悪くないことを示すために、「朝7時に目覚まし時計をかけて眠りにつき、朝ご飯を食べ終わったら会社に行く」という典型的な「サラリーマンの朝」をイベント駆動型のJavaScriptで記述してみた。
注目して欲しいのは、素早く出来る「着替える」「顔を洗う」などの動作は割り込み不可な動作なので、通常のプログラミングと同じようにシーケンシャルに実行するが、時間のかかる「朝ご飯を食べる」「駅まで歩く」などの動作は割り込み可能な状態で実行し、"complete" のイベントを受けてから次の動作に移る点だ。
ちなみに、目覚まし時計は 「スヌーズボタン」付きなので、はっきりと目が覚める前にはそちらを押しておき、万が一再び眠りについてしまった場合には、目覚まし時計が5分後にもう一度鳴る、という部分までサクッと記述できてしまうところがイベント駆動型の素晴らしさだと思うのだがいかがだろう。
// 夜寝る前にすること
clock.setAlarm('7:00am'); // 目覚ましを朝7時にセットする
me.sleep(); // 眠る
// 目覚ましが鳴ったらすること
clock.on('alarm', function() {
clock.snooze(); // スヌーズボタンを押す(5分後にまた鳴る)
me.wakeup(); // 起きる努力をする(失敗する可能性あり)
});
// ちゃんと起きることができたらすること
me.on('wokeup', function() {
clock.stopAlarm(); // 目覚ましを止める
me.switchDress('working-style'); // 着替える(割り込み不可)
me.washFace(); // 顔を洗う(割り込み不可)
// テレビを付ける
tv.swith('on').on('interesting news', function(topic) {
web.surf(topic); // 面白いニュースがあったら、ネットで調べる
});
// 朝ご飯を食べる(割り込み可能)
me.eat('breakfast').on('complete', function() {
// トイレに行く(ある程度、割り込み可能)
me.poop().on('complete', function() {
tv.switch('off'); // テレビはちゃんと消しておく
// 駅まで歩く
me.walkTo('station').on('arrived', function() {
// 電車に乗る
me.rideTrainTo('station near the office').on('arrived', function() {
// 会社まで歩く
me.walkTo('office').on('arrived', function() {
// 働き始める
...
});
});
});
});
});
可読性に関しましては賛成ですが、イベント駆動型のプログラミングで気をつけなければいけないのは処理が二重にはしってしまう可能性があるってことじゃないでしょうか。
例えば、me.wakeup() に処理が五分以上かかったとして、きちんと書いてないとwokeup 時の処理が二重に走ってしまいます。そうすると、着替えた後にまた着替えたりひげ剃り終わってるのにひげ剃ろうとして血だらけになるなど起きる可能性があります。そっちの方が可読性よりもこっちの方が問題な気がします。
Posted by: buster84 | 2012.10.17 at 17:56