@kyanny's blog

My life. Opinions are my own.

#shibuyarblunch も JS リーディング*1も継続してやってるんだけど、どうもおれははてダに書かないとダメなようで、なので今後はほかと重複する部分もあるかもだけどなるべく書いていこうと思った。

JS リーディングでは https://github.com/Modernizr/Modernizr というライブラリを読んで、これが今まで読んだやつのなかでも一番きつかった。読みづらいという意味で。たぶん複数人が書いたものが混じってて読んでるうちに「あれ?なんかスタイルかわった?」みたいなことがあるし、無駄としか思えない過剰な最適化があったりしてどうなのよ、と頭を抱えるようなこともあった。ダントツで「これはひどい」と思ったのが以下のコードで、この dis りネタはもう書くの三回目なんだけど、 !!~ ってなにしてるか意味わかりますか?

**
* contains returns a boolean for if substr is found within str.
*/
function contains( str, substr ) {
    return !!~('' + str).indexOf(substr);
}

おれならこう書く。

function contains( str, substr ) {
    return str.indexOf(substr) !== -1;
}

これのないわーと思う点としては以下。

  • 補数(ビット演算?)とかパッと見でわかりづらいのでコメントを書くべき
  • というか誰でも思いつくような -1 との比較ではダメな理由が思いつかない
  • 仮に比較よりも高速だったとして、 prototype.js の最深部で何度も呼ばれるユーティリティとかなら効率優先するのも理解できるけど、これは「あるブラウザが HTML5 のどの新機能をサポートしてるか判定するライブラリ」でこの contains 関数が何千何万と呼ばれるわけない
  • ~('' + str) ていうカッコで囲ってるあたりも気に入らなくて、まず文字列にキャストするなら String(str) のほうが明瞭だしそもそも文字列以外が渡されることを想定するなら str っていう仮引数名が良くないだろとか、「Array#include? 的なものかと思うやつがいるかもしれないだろ」というなら contains ていう関数名が悪くて str_contains とかにすべきだし、だいたいこのライブラリの中でしか使わないんだから文字列以外のものが不意に渡される可能性なんてほとんどない。あとカッコで囲わないと .indexOf をつなげてかけないとかそういう事情なのだろうけど、ふつうに一時変数に代入したって大差ないんじゃ(そもそもここそんなにパフォーマンス気にする必要あるんですか?)とかとか・・・

というわけで、いろんなライブラリの実装をみてベストプラクティスを学ぶ、という趣旨で始めた勉強会なんだけど、いまのところどっちかというと「べからず集あつめ」みたいな様相を呈していて、まぁこれはこれでありかもしれないけどちょっと不毛感あるなーというところです。無理やりオチをつけると「モダナイザーっていう名前だけど実装はあんまりモダンな感じしない」

*1:社内の有志でやってる JavaScript 製ライブラリのソースコードリーディング勉強会