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

CoffeeScript でも名前空間毎にそれっぽいクラスを置いておきたい

CoffeeScript

CoffeeScript では、クラスを定義するときは:

class Foo

ってやるけど、Foo の中にある Bar クラスを定義するときはどうすればいいかっていうと、 普通に Foo.Bar ってやればいいんだ。
こんな風に:

class Foo.Bar

Foo はクラスでもいいし、オブジェクトでもいいよ。でも、定義されてなかったりするとまずいことになるよね。 良くわからない場合は、とりあえず空オブジェクトを Foo に入れておこう。

Foo = {} unless Foo?

Foo? は Foo が定義されているかどうか調べるよ!
定義されていると真を返すので、定義されてない時にうにゃうにゃする場合は、unless らないとね。

名前空間が複数のファイルをまたがっちゃう時は?

名前空間がファイル内で完結すればいいけど、クラス毎にファイルを分けたい時だってあるよね。 こういう時は、使うファイルを require することはするんだけど、exports とか module.exports に 渡すときはそのファイルで定義してるクラスを渡す様にすればなんとなくいいんじゃないかな。

# OAuth 自体に定義されているので require する。
OAuth = require './oauth'

この場合は OAuth がトップなんだ。
OAuth 自体にも何かしら定義されているので、それを使いたい場合は oauth を require する。
別に使いたくない場合はちょっと前のコードみたいに:

# 別に OAuth で定義されてるフィールドを使わないので空っぽでもいい。
OAuth = {} unless OAuth?

こんな風にしておけば、まあ、面目は保てるよね。
それで、exports に入れとくときは、そのファイルで定義されているクラスを入れる。

exports = OAuth.Token
module.exports = OAuth.Token

こうすると、他のファイルでも使いやすくなる…と思うんだ。