1

バックボーンモデル内でインスタンス変数をどのように定義する必要があるのか​​疑問に思っています。これは私が現在それをしている方法です:

class GeneSet extends Backbone.Model
    initialize: (parsedGenes)->
        @set parsedGenes: parsedGenes
        @set geneNames: (gene.gene_name for gene in @get("parsedGenes"))
        @set geneIds: ("gene_#{id}" for id in [1..@get("parsedGenes").length])
        @set columnNames: @getColumnNames()
        @set columnGroups: @getColumnGroups()
        @set geneExpressions: @getGeneExpressions()
        @set groupedGeneExpressions: @getGroupedGeneExpressions()
        @set extent: @getExtent()

    clusterColor: ->
        d3.scale.category20()()

    getGeneNameById: (geneId)->
        @get("geneNames")[@get("geneIds").indexOf(geneId)]

    getColumnGroups: ->
        _.uniq((@get("columnNames")).map((columnName)->
            columnName.split("_")[0]
        ))

    getExtent: ->
        expressions = _.flatten(@get("geneExpressions").map (geneExpression)->
            geneExpression.map (item)->
                item.y
        )
        d3.extent(expressions)

    getColumnNames: ->
        Object.keys(@get("parsedGenes")[0]).filter (columnName) ->
            !columnName.match(/cluster/) && isNumber(parsedGenes[1][columnName])


    getGeneExpressions: ->
        @get("parsedGenes").map (gene) =>
            @get("columnNames").map (columnName) -> 
                x: columnName
                y: +gene[columnName] # make numeric

これを行うには少し冗長に思えます。@set columnGroups: @getColumnGroups()使用してすべての変数を取得する必要があるのは、@get("...")一種の冗長なようです(できればいいのですが@variableName)。私の質問は、これはモデルとインスタンス変数を使用する正しい方法ですか、それとも間違っていますか?また、これを行うことに何か違いはありますか?:

    class GeneSet extends Backbone.Model
        initialize: (parsedGenes)->
            @parsedGenes = parsedGenes
            @geneNames = (gene.gene_name for gene in @parsedGenes)
            @geneIds = ("gene_#{id}" for id in [1..@parsedGenes.length])
            @clusters = (gene.cluster for gene in @parsedGenes)
            @descriptions = (gene.description for gene in @parsedGenes)
            @columnNames = @getColumnNames()
            @columnGroups = @getColumnGroups()
            @geneExpressions = @getGeneExpressions()
            @groupedGeneExpressions = @getGroupedGeneExpressions()
            @extent = @getExtent()

そして、ただやっているという観点から@model.columnNames

4

1 に答える 1

3

これが私のベースモデルのスーパークラスで行うことです。これはバックボーンの設計にかなり反していますが、私も使用するのが嫌いgetset、すべての属性アクセスの背後にある実際のメソッドが必要です。だから私はいくつかのメタプログラミングを行い、名前付きのget/setメソッドを生成します。したがって、実行する代わりに:

model.get("name")
model.set("name", "Tom")

私はただすることができます

model.name()
model.name("Tom")

これは、任意のattributesオブジェクトに対してこれを自動的に行うための私の基本コードです。

addConvenienceMethods = ->
  for prop, value of this.attributes
    ((prop) ->
      #Define a setter/getter function
      this[prop] = (newValue...) ->
        if newValue.length
          obj = {}
          obj[prop] = newValue[0]
          this.set obj
          return this
        else
          return this.get prop
      #Use the newly-defined setter function to store the default value
      this[prop](value)
    ).call(this, prop)

########## Base Model Superclass ##########
class exports.Model extends Backbone.Model
  initialize: ->
    addConvenienceMethods.call this

これは、をサポートしないのに十分古いバックボーンバージョンで書かれていることに注意してくださいset("key", "value")。更新する場合は、おそらくそのバリアントを使用します。setフレーバーはオブジェクトを返すため、チェーン可能であることに注意してください。model.name("John").email("john@example.com").role("admin")

于 2012-05-24T21:54:10.713 に答える