Entries

スポンサーサイト

カテゴリ:スポンサー広告
更新日:--------
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

メソッドチェーンとループ脳

カテゴリ:JavaScript
タグ: underscore.js   
更新日:2013-04-02
backbone.jsを使うようになって、依存しているUnderscore.jsも使うようになった。
jQueryでeachとかmapとかを使い始めていたところだったので、それほど違和感もない。んだけど・・・

ときに、メソッドチェーンというのは、オブジェクト指向プログラミングの成果なのだろか?それとも、関数型プログラミングの成果なのだろか?

こんなコード書いてたんだよね。
    var detail_id, item_id;
var suryo = _(details).reduce(function(sum, detail){
detail_id = detail.id;
item_id = detail.item_id;
return sum + detail.Suryo;
}, 0);
明細の数量の合計を計算してる。
で、代表値として明細idと品目idを保存している。(前処理で品目idはすべて同じになっている。明細idは代表値で一つあればいい)

酷い。

どうも私は、根本的に構造化プログラミング脳らしい。
オブジェクト指向や関数型プログラミングを学んでも、「手続き」から考え始めている。
eachとかmapとかreduceとか、基本的に「ループ」と考えているみたい。
だから、reduceに関係のない処理を入れてしまう。


jQueryでeachを使い始めたのは、JavaScriptで配列走査にfor inが使えないからだった。

> 2011年11月3日の作業日報。配列走査で for in を使っちゃいけないんだと。javascript、嫌いになりました。 いや、もともとなんか好きじゃないんだけど。まぁ、Ajaxやる限りはしかたがない。 - fintopo

連想配列(オブジェクト)と普通の配列の区別をしなくていいし、lengthとループ変数のfor文より書きやすい。
for文のループ変数って、多重ループのときに添字間違いとか、結構ミスの元なんだよね。

ところが、eachでいいところで、mapを使ってたりしたんだよなぁ。
当時は、よく分かってなかったんだけど、これも酷いなぁ。

まぁ、少なくとも関数型プログラミングじゃねーな。
というわけで、以下のように書きなおした。
    var _details = _(_options.details);

var detail_suryo = _details.reduce(function(sum, detail){
return sum + detail.suryo;
}, 0);

var first_detail = _details.first();
if (first_detail){
detail_id = first_detail.id;
item_id = first_detail.item_id;
}
もっと良い書き方があるかなぁ?

ほんとに、まだよく分かってないことがたくさんある。
メソッドチェーンでつなげていって、最後はeachとか。
ようするに、ループで考えた中から、外せるところだけチェーン化してるだけなんだよなぁ。
精進だねぇ。

ところで、Underscore.jsでメソッドチェーンしたときの実行効率が気になるんだけど、
    var _details = _(_options.details);

var first_detail = _details.first();
とか、いちいち待避しちゃうのも構造化プログラミングの癖なのかねぇ?
構造化脳というより貧困的プログラミング脳か?
まぁ、まだ困ってないので、ちゃんと調べたくなるほどではなく、気になるだけなのですが。
スポンサーサイト

Appendix

プロフィール

いむら@fintopo いむら@fintopo

ガーデニングが趣味のフリーのシステムエンジニア兼プログラマ(フルスタックエンジニア)です。

仕事募集中です。個人なので、融通がききます。 大規模な開発はできないかもしれませんが、研究や製品開発レベルでの小規模開発、特に相談しながら新しいものを作っていくのが得意です。詳しくはWebサイトをご覧ください。
詳しくは「fintopoとは」をご覧ください。

> fintopoとは

このページのQRコード

季節暦

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。