読者です 読者をやめる 読者になる 読者になる

Murga

個人的に言いたいコト・主張・気持ち。

Gulp の思想を考える

Gulp の思想を理解すると、Gulp でタスクをどう書くか、なぜブラックリストが存在しているのか、といったことの理解が深まる気がして、少し見てみた。


公式サイトには、「By preferring code over configuration」という言葉が出てきている。

設定を定義するというより、JavaScript で処理を記述していくというスタイルは、Gulp の基本思想ということだろう。


Gulp はブラックリストというものを用意しており、ブラックリストに指定されたプラグインを使おうとすると警告が表示される。

ブラックリストに追加されているプラグインは以下で確認できる。

Gulp がブラックリストに登録する理由には、依存している対象のツールが Duplicated (廃止) されているために Gulp プラグインも廃止になっているから、とか、信用ならないプラグインだから、とかいう理由の他に「Gulp の思想に反している」というものがある。

gulpは自身のストリームの仕様を満たさないプラグインをブラックリストとして登録する場所があって、npmのgulpタグがついたリポジトリを日々精査しています。

Gulp は Node.js の Stream という API を利用し、ビルドするファイルの読み書きをしている。

gulp は、入力されたものに対して処理をいれていき、1つの流れの中でビルドを行うアプローチになります。

Vinyl (ビニール) というのは Gulp で使用する仮想ファイルオブジェクトだが、これをあれこれ引き回し、Stream による処理を行わせるのが Gulp であり、Gulp プラグインはそういうことをするためのプラグインである必要がある、というワケだ。

browserify には、 gulp-browserify というモジュールがあるんだけど、これは宗教上の理由からブラックリスト入りしてるらしいので、ちゃんと生の browserify モジュールを使う。

そこで「bundle が返したオブジェクトを普通に pipe すればいいじゃん!」と思ってこんなことをしてしまうと、エラーが出る。

何故か?答えは、「bundle が返すオブジェクトは vinyl じゃないから」

われわれが browserify を gulp に通すには、bundle の返したファイルストリームを vinyl に変換する必要がある。ここで、 vinyl-source-stream というモジュールを使う。

ということで、Gulp は「入力を受け付けて適切に変換処理して出力する」という形を取っていない Gulp プラグインをブラックリストに入れる傾向がある、ということだ。

gulp 的には「入出力を伴わない処理をプラグインにすんじゃねーよバーカ」ってことなんだと思う。

Gulp と Node.js を混同していると、何でも Gulp プラグインとしてラップされていないと gulpfile.js に書けないと思いがちだが、そんなことはなく、Stream 処理する必要がないモノは直接呼び出して使えば良いのである。


このような考え方が理解できていると、Gulp をよりシンプルに、低い依存度で書けるようになると思う。

流れるようなインターフェース (Fluent Interface) とメソッドチェーン (Method Chain)

「流れるようなインターフェース」という考え方がある。パッと見は jQuery なんかでよく見かけるメソッドチェーンみたいな書き方のアレだ。

メソッドチェーンとは、名前のとおり、メソッドを実行して、その結果に対してさらにメソッドを実行する感じで、メソッドを繋げながら何らかの処理をしていく仕組みです。

流れるようなインターフェース (Fluent Interface)

流れるようなインターフェースとメソッドチェーンは違うものだよ。ぱっとみは似ているかもしれないけど。

流れるようなインターフェースでは、ソースコードを書いている人が、中断することなく流れるようにコーディングできなければいけない。

思考を中断せずに流れるようにコーディングができるかどうかが重要なんだ。そして、よくできた流れるようなインターフェースは、可読性が高い。

「単なるメソッドチェーンとは違うのだよ!メソッドチェーンとは!」

内部DSLは、汎用のプログラミング言語の書き方を工夫して、見かけ上の構文を自然言語に近づけた言語です。

プログラマが知るべき97のこと

プログラマが知るべき97のこと

  • 作者: 和田卓人,Kevlin Henney,夏目大
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2010/12/18
  • メディア: 単行本(ソフトカバー)
  • 購入: 58人 クリック: 2,107回
  • この商品を含むブログ (349件) を見る

メソッドに全部やらせすぎ。「オブジェクトの生成」「値の設定」「処理の実行」。これらは全部違う役割。そしてnewやプロパティという、専用の構文が用意されているというのに、全部メソッドでやってしまっている。だから良くも悪くも視覚上フラット。見た目スッキリ整ったようだけど、それぞれの持つ役割の意味が、構文からではなく名前からでしか判断出来なくなってしまっている。

なんでもかんでもメソッドチェーンなのが気持ち良い気がしてたけど、異なる操作なら分けて書いた方が適切に文が区切れると思うし、連想配列 (ハッシュ) みたいなモノで複数値を設定したりする方が良いのかもしれない。