ウェブプログラミングおじさん

PHPとRubyと時々CSSやJSなどなど

CoffeeScriptでクラスのプライベートメンバを作るのに挫折した話と妥協案

JS書くのも疲れてきたので、CoffeeScriptを触っていたんですが、クラスを使えると聞いて試してみて沼にはまったお話し。

まず試してみたクラスが以下のもの

class BadPractice
  # static
  @public_static_var = 'public_static_var'
  private_static_var = 'private_static_var'
  @public_static_func = ->
    console.log 'public_static_func'
  private_static_func = ->
    console.log 'private_static_func'

  # prototype
  public_prototype_var: 'public_prototype_var'
  public_prototype_func: ->
    console.log 'public_prototype_func'

  constructor: (this_is_also_private_var)->
    # instance
    @public_instance_var = 'public_instance_var'
    private_instance_var = 'private_instance_var'
    @public_instance_func = ->
      console.log 'public_instance_func'
    private_instance_func = ->
      console.log 'private_instance_func'

こんなもの使えたもんじゃなかった。

具体的に言うと、staticメンバが相互に呼び出せなかったり、プロトタイプメソッドから、プライベートなインスタンス変数を呼び出せなかったり、、、死んじゃう。

なので、クラスの素晴らしい機能である隠匿というものを捨てて、全てパブリックで定義してみた。

class GoodPractice
  # class
  @class_var = 'class_var'
  @class_func = =>
    console.log 'class_func'
    console.log "class_func can access #{@class_var}"

  # instance
  constructor: (@instance_var) ->
  instance_func: ->
    console.log 'instance_func'
    console.log "instance_func can access #{@instance_var}"
    console.log "instance_func can access #{GoodPractice.class_var}"

これで沼からは脱出したが、なんだかなあ。。。

だれかよい方法を教えてください。