14
非同期プログラミング 養成ギブスとしてのnode.js niryuu<[email protected] > 14228日金曜日

非同期プログラミング養成ギブスとしてのNode.js

Embed Size (px)

Citation preview

Page 1: 非同期プログラミング養成ギブスとしてのNode.js

非同期プログラミング養成ギブスとしてのnode.js

niryuu<[email protected]>

14年2月28日金曜日

Page 2: 非同期プログラミング養成ギブスとしてのNode.js

自己紹介• プログラミング初心者

• C→Python→PHP→node.js

• Android,iOS

• 地理情報システムの会社

• 皆さん、酒飲んでて下さい

14年2月28日金曜日

Page 3: 非同期プログラミング養成ギブスとしてのNode.js

私と非同期プログラミング

• PHPでWebアプリケーションフレームワークを使ってやっていた→非同期とは無縁

• iOS/Android:まあHTTP通信とかNSOperationQueueとかAsyncTaskとかいろいろ非同期プログラミングが登場する場面はあるが、イディオムに従っていた感じ

• 要はわかっていない

• node.jsで非同期プログラミングをやっていくことで、教訓を得ていった

• koaとかQとかがあるが、実際どうなっているのか

• Webの話をするが、他のことでも本質的に変わらないと思う

14年2月28日金曜日

Page 4: 非同期プログラミング養成ギブスとしてのNode.js

ざっくりと記述すると• 非同期処理をやる前の処理(Context A)

• 非同期処理(Context B)

• やった後の処理(Context A)

• Thread でも Event Loop でも変わらない

• 継続とかの議論は省く(とはいっても、コルーチンなどが事実上使われ始めているので、無視はできないが)

14年2月28日金曜日

Page 5: 非同期プログラミング養成ギブスとしてのNode.js

何で難いか• 一旦元のコンテキストから切り離して、戻ってくるので、処理がリニアではない(非同期処理を言い換えてるだけじゃん!)

• concurrentとかparallelとかその辺の議論は勘弁

• 切り離すのはOK

• どう戻ってくるか

14年2月28日金曜日

Page 6: 非同期プログラミング養成ギブスとしてのNode.js

戻すのをマズるとどうやばいか

• 終わった/失敗した非同期処理、終わらない実行

• 非同期がないなら、処理が成功したらいけるしダメだったらただ死ぬのだが、そうでないのでデバッグが大変

• node.jsの場合→プロセスが1つなので、死んだら終わり(実際のところ passenger とかで解決可能であるが、望ましくはない)

• clusterで4つ立ち上げたら、4つとも刺さって死んだ

• →デバッグが大変

• 複数の非同期処理が混在してると、さらにわけわからなくなる

14年2月28日金曜日

Page 7: 非同期プログラミング養成ギブスとしてのNode.js

コールバックによる方法

• hidouki(arg1, arg2,.. ,cb)

• hidouki を呼ぶコンテキストと、cbが実行されるコンテキストが同じ

• とてもわかりやすい

• しかし

14年2月28日金曜日

Page 8: 非同期プログラミング養成ギブスとしてのNode.js

コールバック地獄• 省略(みなさんお分かりでしょう)

• 要約すると「▶」

• 問題:コードが汚い

• コードの汚さが記法によるため、リファクタリングする気もなくなる

• 解決策:ちゃんとcbの関数を定義して、それを呼びましょう

• 問題:cbにちゃんと戻さないとダメ

• 解決策:ちゃんとやる

14年2月28日金曜日

Page 9: 非同期プログラミング養成ギブスとしてのNode.js

Promise(Q)• もうコールバックスタイルの記法嫌だ

• Promiseでしょ

• hidouki(args).then(a).then(b).fail(e)

• 利点:記法がわかりやすい、スコープがわかりやすい、続けて書ける

• 変わらない点:ちゃんとresolve/rejectしましょう

• 変わらない点:長い処理を書くと、thenの中身が凄く長くなる

• 解決策:ちゃんと関数を定義して、それを呼びましょう

14年2月28日金曜日

Page 10: 非同期プログラミング養成ギブスとしてのNode.js

koa - yield/coによる方法• 期待の新星

• var result = yield hidouki(args)

• よっしゃ!これは良い!

• 利点:スコープがわかりやすい、非同期でないように書ける

• 例外処理を自然に使える

• なぜ「記法がわかりやすい」が利点でないか?

• 非同期処理してる部分とそうでない部分の区別が一見してつきにくい

• 解決策:ちゃんと責務を分けましょう

14年2月28日金曜日

Page 11: 非同期プログラミング養成ギブスとしてのNode.js

yield/coによる方法• 変わらない点

• ちゃんとreturnしましょう

• return しないなら、ちゃんと例外を吐いて、catchしよう

• 例外!全然使ったことなかった!

14年2月28日金曜日

Page 12: 非同期プログラミング養成ギブスとしてのNode.js

教訓• 最適解はあっても、ちゃんとしたコードが書けないと仕方がない

• ダラッダラ同じ所に処理を書くのをやめて、処理を分割しよう

• ちゃんとエラー処理とか例外とかをハンドリングしよう

• 当たり前のことを要求する養成ギブス

14年2月28日金曜日

Page 13: 非同期プログラミング養成ギブスとしてのNode.js

まとめ

• 養成されました

• node.js ありがとう

• おわり にしようと思ったが

14年2月28日金曜日

Page 14: 非同期プログラミング養成ギブスとしてのNode.js

• きれいに書けるに越したことはない

• ユーザーインタフェースとかの実装も簡潔に書けて、なおかつ検証も可能な計算モデルを構築したくなった

• 博士課程に行きます

14年2月28日金曜日