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

4,364 views

Published on

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,364
On SlideShare
0
From Embeds
0
Number of Embeds
3,006
Actions
Shares
0
Downloads
6
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

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

  1. 1. 非同期プログラミング 養成ギブスとしてのnode.js niryuu<niryuu@gmail.com> 14年2月28日金曜日
  2. 2. 自己紹介 • プログラミング初心者 • C→Python→PHP→node.js • Android,iOS • 地理情報システムの会社 • 皆さん、酒飲んでて下さい 14年2月28日金曜日
  3. 3. 私と非同期プログラミング • PHPでWebアプリケーションフレームワークを使ってやっていた→非同 期とは無縁 • iOS/Android:まあHTTP通信とかNSOperationQueueとかAsyncTaskとかいろ いろ非同期プログラミングが登場する場面はあるが、イディオムに従っ ていた感じ • • • • 14年2月28日金曜日 要はわかっていない node.jsで非同期プログラミングをやっていくことで、教訓を得ていった koaとかQとかがあるが、実際どうなっているのか Webの話をするが、他のことでも本質的に変わらないと思う
  4. 4. ざっくりと記述すると • • • • • 非同期処理をやる前の処理(Context A) 非同期処理(Context B) やった後の処理(Context A) Thread でも Event Loop でも変わらない 継続とかの議論は省く(とはいっても、コルーチン などが事実上使われ始めているので、無視はでき ないが) 14年2月28日金曜日
  5. 5. 何で難いか • 一旦元のコンテキストから切り離して、戻っ てくるので、処理がリニアではない(非同期処 理を言い換えてるだけじゃん!) • • • 14年2月28日金曜日 concurrentとかparallelとかその辺の議論は勘弁 切り離すのはOK どう戻ってくるか
  6. 6. 戻すのをマズると どうやばいか • • 終わった/失敗した非同期処理、終わらない実行 非同期がないなら、処理が成功したらいけるしダメだったらた だ死ぬのだが、そうでないのでデバッグが大変 • node.jsの場合→プロセスが1つなので、死んだら終わり(実際の ところ passenger とかで解決可能であるが、望ましくはない) • • • 14年2月28日金曜日 clusterで4つ立ち上げたら、4つとも刺さって死んだ →デバッグが大変 複数の非同期処理が混在してると、さらにわけわからなくなる
  7. 7. コールバックによる方法 • hidouki(arg1, arg2,.. ,cb) • hidouki を呼ぶコンテキストと、cbが実 行されるコンテキストが同じ • とてもわかりやすい • しかし 14年2月28日金曜日
  8. 8. コールバック地獄 • • • 省略(みなさんお分かりでしょう) 要約すると「▶」 問題:コードが汚い • コードの汚さが記法によるため、リファクタリングする気 もなくなる • • 問題:cbにちゃんと戻さないとダメ • 14年2月28日金曜日 解決策:ちゃんとcbの関数を定義して、それを呼びましょう 解決策:ちゃんとやる
  9. 9. Promise(Q) • • • もうコールバックスタイルの記法嫌だ • • • 利点:記法がわかりやすい、スコープがわかりやすい、続けて書ける Promiseでしょ hidouki(args) .then(a) .then(b) .fail(e) 変わらない点:ちゃんとresolve/rejectしましょう 変わらない点:長い処理を書くと、thenの中身が凄く長くなる • 14年2月28日金曜日 解決策:ちゃんと関数を定義して、それを呼びましょう
  10. 10. koa - yield/coによる方法 • • • • • • 期待の新星 var result = yield hidouki(args) よっしゃ!これは良い! 利点:スコープがわかりやすい、非同期でないように書ける 例外処理を自然に使える なぜ「記法がわかりやすい」が利点でないか? • 非同期処理してる部分とそうでない部分の区別が一見してつきに くい • 14年2月28日金曜日 解決策:ちゃんと責務を分けましょう
  11. 11. yield/coによる方法 • 変わらない点 • ちゃんとreturnしましょう • return しないなら、ちゃんと例外を吐 いて、catchしよう • 例外!全然使ったことなかった! 14年2月28日金曜日
  12. 12. 教訓 • 最適解はあっても、ちゃんとしたコードが書け ないと仕方がない • ダラッダラ同じ所に処理を書くのをやめて、 処理を分割しよう • ちゃんとエラー処理とか例外とかをハンドリ ングしよう • 14年2月28日金曜日 当たり前のことを要求する養成ギブス
  13. 13. まとめ • 養成されました • node.js ありがとう • おわり にしようと思ったが 14年2月28日金曜日
  14. 14. • きれいに書けるに越したことはない • ユーザーインタフェースとかの実装も 簡潔に書けて、なおかつ検証も可能な 計算モデルを構築したくなった • 博士課程に行きます 14年2月28日金曜日

×