WebSocketでネトゲを作るよー 開発フレームワーク編

とまあ宣言してからにはゴリゴリ書いてるわけなのだけど
今回は言語にcoffeescript, フレームワークにzappaを使う。

WebSocketでネトゲを作るよー - mizchi's blog

zappa

Socket.IO+Expressを扱う薄いDSL
主にCoffeeScriptで簡潔に記述できるようにAPIが整理されている。RSSリーダー書いたときにも使ったが、気に入ってる。公式ドキュメントの背景画像がフランク・ザッパなのが笑った。
SocketStreamも考えたがあれはちょっと大規模すぎる(Railsのような押し付けがましさがある)

zappaギッハブのサンプル mauricemach/zappa - GitHub

require('zappa') ->
  Gizmo = require './model/gizmo'

  @use 'bodyParser', 'methodOverride', @app.router, 'static'

  @configure
    development: => @use errorHandler: {dumpExceptions: on}
    production: => @use 'errorHandler'

  @get '/': -> @render 'index'

  @get '/gizmos/:id': ->
    Gizmo.findById @params.id, (err, gizmo) =>
      @render index: {err, gizmo}

  @on connection: ->
    @emit welcome: {time: new Date()}

  @on shout: ->
    @broadcast shout: {@id, text: @data.text}

expressとsocket.ioに馴染んでるならなんとなくわかる、かな。
クライアント側は基本的にsocket.ioに仕組みに従う。
クライアントとサーバーを明確にわけてしまうと、コールバック同士でスパゲティ化するので、編集する距離が近いと気持ち的に楽。(もちろんあとで整理するのだけど)

大規模JavaScriptとモジュールローディング

大規模JSをすっきり記述するためにCoffeeScriptを用いる。
CoffeeScriptではclass化と継承が使える。使えるとはいっても実際はプロトタイプをラップしてそのように見せかけてるだけなのだけど、使う側が深く考えなくても自然なOOPが実現できる

class Animal
  constructor: (@name) ->

  move: (meters) ->
    alert @name + " moved #{meters}m."

class Snake extends Animal
  move: ->
    alert "Slithering..."
    super 5

class Horse extends Animal
  move: ->
    alert "Galloping..."
    super 45

こんなの。

モジュール化

nodeではCommonJSという仕組みがあって、外部JSの読み込みをexportsという名前空間に制限することで、名前空間の使用を抑制することができる。(他の言語なら当然のように持ってるものだが)