CoffeeScript で Titanium Mobile すると嬉しいのか?

CoffeeScript は Ruby / Python に似た記法で (結果として) JavaScript を書くことができるプログラミング言語です。 CoffeeScript をコンパイルすると JavaScript になるので、 JavaScript プログラミングは CoffeeScript で置き換えることができます。

Titanium Mobile は JavaScript を使って iOS や Android など、モバイル向けのアプリケーション開発を行うためのツールですから、これを CoffeeScript で置き換えることができます。 Titanium Mobile で CoffeeScript を使うことで、どんなメリットがあるのかをかいつまんで説明します。そして、オススメするかどうかもチョロっと書きます。

括弧が減る

本当に括弧が減ります。 Titanium Mobile では Window や View オブジェクトを作るために create 系のメソッドを使います。

こんなコードですね。 create 系のメソッドに限った話ではありませんが、 Titanium オブジェクトを作るときは引数にオブジェクトを渡します。上の例程度ならカワイイものですが、これがズラリ並んでいたり、入れ子になっていたりすると閉じ括弧周辺が凄いことになります。 CoffeeScript では、

こう書けます。括弧が消えました。インデントと改行だけでオブジェクトを渡すことができます。 Python チックですね。コーヒー美味しいです。でも飲み過ぎは厳禁です。一人で開発しているならこれがオブジェクトを渡していることが分かるでしょうが、複数人で開発していたら共通認識持ってないとやばそうです。

内包表記凄い

これは CoffeeScript グッジョブな機能で、スマートにイテレーションと付随する処理を書けます。例えば、 Sample.Todo ではタブを作るためのパラメータを持ったオブジェクトの配列を作って、タブオブジェクトを作るときにイテレーションしています。

似たようなことを CoffeeScript のコードで行おうと思うと、

極端な形ですが、こんなコードを書くことができます。変に見えるかもしれませんが、これで2つのオブジェクトリテラルを内包した配列ができあがります。この配列をイテレーションして、 Titanium.UI.TabGroup オブジェクトの addTab メソッドを使ってタブを追加する場合、 CoffeeScript では以下のように書くことが可能です。

1行目は普段通り createTabGroup メソッドを使って TabGroup オブジェクトを作っています。そして2行目では、

  1. tab_arr 配列から要素を取り出す
  2. 取り出した要素を Ti.UI.createTab メソッドに渡して Tab オブジェクトを作る
  3. Tab オブジェクトを TabGroup の addTab メソッドに渡してタブを追加する

この一連の流れをワンライナーで書いています。 Python にもリスト内包表記がありますが、似た感じで書けて気持ちが良いですね。コーヒー美味しいです。さらに for の後ろにはフィルタが書けたりして条件絞り込みまでできますが、やり過ぎると魔術になるので飲み過ぎ厳禁です。俺スゲエ感を一瞬感じて、あとから読めなくなります。

map 処理も楽々

内包表記の応用ですが、元となる配列に何らかのフィルタや処理を加えて新しい配列を作りたい場面があったとします。 Titanium Mobile は JavaScript 1.6 相当の機能が使えますから、 map 関数を使うのも一つの手です。でも CoffeeScript では内包表記を応用して以下のように書けます。

1〜100までの数値が入った配列の中から、 10 と 3 で割り切れるアイテムの数を探す処理です。だからどうといったことは無いですが、内包表記の応用でこんな形で map 処理が書けます。 Web API と連動して取ってきた JSON を何らかの形で処理するときに使えそうですね。これも飲み過ぎ注意。 Titanium Mobile ではなく、 CoffeeScript 自体のお話ですけどね。魔術どころか魔法になります。

CommonJS モジュールがモジュールらしくなる (?)

コンストラクタ関数をモジュール化すると、

こんな形でコードを書きますが、個人的な趣味の上ではこれは気持ちが良いコードではありません。感覚的なのですが、モジュールは MyClass なのですから、そこだけは、こう、ビシッとまとめて書きたいわけです。

この方がモジュールを書いているっ! という気分になります。単なる好みの問題なんですけどね…。

書いといてなんですが

ここまで書いといてあれなんですが、万人に CoffeeScript を使って Titanium Mobile アプリケーション開発を進めるかというと微妙なところです。私は Python でサーバサイドのプログラムを書くこともあるので似た記法が使えると嬉しいですし、内包表記にも慣れています。

クラスベースでラップすることで CommonJS モジュールを書くときの見通しが良くなるなどのメリットを感じてもいるのですが、これは個人的な感覚ですし、そもそも CoffeeScript 自体の特性を知っておかないと嫌なところで「はまって」時間を取られることもあるでしょう。

例えば CoffeeScript の関数は基本的に式です。ということは巻き上げがおきません。

純粋な JavaScript を書いているとき、これは正しく動作します。しかし、

これはダメです。 hoge 関数は式なので、呼んだ時点ではまだ undefined です。 CoffeeScript がどんな JavaScript を出力するのかを知らないと辛いということは、結局のところ元となる JavaScript を書けないと結構辛いということと考えています。

これは CoffeeScript そのもののお話なので Titanium Mobile がどうこうというお話ではないですが、 CoffeeScript を使ったから Titanium Mobile が楽々になるというわけではないですね。やっぱり JavaScript そのもので Titanium Mobile アプリケーションを書けないと CoffeeScript を使っても満足には書けないかなと思います。

とはいえ、クラスベースでラップされて書きやすくなるとか、内包表記のおかげで行数減らせるとか、出力される JavaScript が安定するから嬉しいとか、様々な理由の上で Titanium Mobile アプリケーション開発に CoffeeScript を持ってくると幸せになれます。万人受けはしませんが、はまる人にははまるブレンドになるでしょう。

Code Strong :-)