CoffeeScriptを知ったのはRailsに組み込まれたからですが、Rails3.1で採用されてすぐに飛びついたわけではなく、しばらく敬遠してた時期もありました。しかし使い始めてからはもう手放せなくなりました。
そして次第にCoffeeScriptのclass構文を使えばよりよいJavaScriptの開発ができるのではないかと思うようになりました。
今回は最近CoffeeScriptを使ってどのように開発しているかを紹介したいと思います。
CoffeeScriptでのclass定義はこうやります
class Person constructor: (@my_name) -> greeting: -> alert "Hello! my name is #{@my_name}." window.Person = window.Person || Person
コンパイルすると以下のようなJavaScriptになります
(function() { var Person; Person = (function() { Person.name = 'Person'; function Person(my_name) { this.myname = my_name; } Person.prototype.greeting = function() { return alert("Hello! my name is " + this.my_name); }; return Person; })(); window.Person = window.Person || Person; }).call(this);
※nameプロパティを使うと上書きしてしまうのでmynameとしました
例えばこのようなコードを person というファイル名で保存し、インスタンス生成は main という別ファイルで実行します。
main.coffee$ -> kozo = new window.Person 'kozo' kozo.greeting()main.js
(function() { $(function() { var kozo; kozo = new window.Person('kozo'); return kozo.greeting(); }); }).call(this);
こうすることでまず管理がしやすくなりますし、テストも気持ちよく書けると思います。
テストフレームワークはよく jasmine をつかっています。その前は QUnit だったんですが jasmine の方がドキュメントが探しやすいのとツールが整っている印象ですし、なによりコードが書きやすく後からでも見やすいですね。人によるかも知れませんが。
僕の場合CoffeeScript を使うときはほぼ Rails か sinatra 上ですので jasmine-headless-webkit というgemをつかってます。これを使うとCUIで実行結果が得られます。(jasmine-railsはこれに依存しています)
jasmineの諸々の設定は省略しますがテストコードはこんな感じにしています。
person_spec.coffeedescribe "Person", -> beforeEach -> @person = new window.Person 'sample' afterEach -> delete @person describe "propaties", -> it "have 'my_name' string", -> expect(typeof @person.my_name).toBe "string" describe "greeting method", -> beforeEach -> spyOn window, "alert" @person.greeting() it "alert greeting text", -> expect(window.alert).toHaveBeenCalledWith "Hello! my name is sample."
DOMが絡むテストは jasmine-fixture というのをhelperとして読み込んで使っています。jqueryに依存しているのですが、むしろ使わない事のほうが少ないので気にしないです。affix という便利メソッドが使えるようになって、jqueryオブジェクトのprototypeにも追加されるので気に入ってます。
以上のような形で開発を進めてるのですが、クラスファイルと実行ファイルを分けてなるべくDOMの情報とかは実行ファイルに書き込むようにするといいと思います。
サイトのトップページにスライドショー的なものを設置するなら例えば以下の様な感じです。
$ -> slideshow = new window.Slideshow { container_id: '#hoge-slideshow' controller_id: '#hoge-controller' duration: 800 wait: 3000 } slideshow.start()
要はリテラル値をまとめて書いておくということです。
ただこのように実行ファイルに分けていてもファイル名が script とかにする人がいたりして…それはそれでわからなくはないのですが、mainの方が無難じゃないですかねぇ。
あぁマシン持ち寄ってこうゆう話ししながら酒を呑む仲間がほしいなぁ…
0 コメント:
コメントを投稿