重构推入不同的数组

时间:2016-04-06 11:31:38

标签: coffeescript

有什么方法可以在Coffeescript中重构这个吗?

class Article
    constructor: () ->
        @rims   = []
        @tyres  = []
        @others = []
        @wheels = []

    addRim: (id) ->
        product = new SimpleProduct(id)
        @rims.push(product)
        product

    addTyre: (id) ->
        product = new SimpleProduct(id)
        @tyres.push(product)
        product

    addOther: (id) ->
        product = new SimpleProduct(id)
        @others.push(product)
        product

    addWheel: (rimId, tyreId) ->
        wheel = new Wheel(rimId, tyreId)
        @wheels.push(wheel)
        wheel

2 个答案:

答案 0 :(得分:1)

这些添加功能可以放在一个

class Article
    constructor: () ->
      @rims   = []
      @tyres  = []
      @others = []
      @wheels = []

    add: (aryName, model, args...) =>
      m = new model(args...)
      @[aryName].push m

class Rim 
   constructor: (args...) ->
     console.log args

class Tyre
   constructor: (args...) ->

a = new Article()

a.add('rims', Rim, 'a','b','c')

答案 1 :(得分:0)

这三个相同的函数可能会使用另一个通用的addProduct方法使其语法干涸,该方法接受一个变量(一个数组)并将一个新的Simple Product推送到它。你的addWheel看起来不同,以保证它是一个单独的方法。我实际上认为最好的解决方案可能涉及做一些addWheel创建Rims的东西,但我不确定你是如何使用这个模型的。

class Article
    constructor: () ->
        @rims   = []
        @tyres  = []
        @others = []
        @wheels = []

    addProduct: (variable, id) ->
        variable.push(product = new SimpleProduct(id))
        product

    addRim: (id) ->
        this.addProduct(@rims, id)

    addTyre: (id) ->
        this.addProduct(@tyres, id)

    addOther: (id) ->
        this.addProduct(@others, id)

    addWheel: (rimId, tyreId) ->
        wheel = new Wheel(rimId, tyreId)
        @wheels.push(wheel)
        wheel

轮子有轮辋和轮胎的事实,你的模型上可能不需要单独的实例变量用于轮辋和轮胎,最好像这样嵌套它们:

class Article
    constructor: () ->
        @others = []
        @wheels = []

    addOther: (id) ->
        @others.push(product = new SimpleProduct(id))
        product

    addWheel: (rimId, tyreId) ->
        wheel = new Wheel(rimId, tyreId)
        @wheels.push(wheel)
        wheel

    rims: ->
        @wheels.map((wheel) -> wheel.rim)

    tyres: ->
        @wheels.map((wheel) -> wheel.tyre)

class Wheel
    constructor: (rim, tyre) ->
        @rim  = new SimpleProduct(rim)
        @tyre = new SimpleProduct(tyre)

在这里,您可以执行以下操作:

a = new Article()
a.addWheel(2,3)
a.tyres()    // returns [SimpleProduct(2)]

第二个示例仅在您尝试使用this.tyres访问使用addWheel()方法添加的轮胎时。据我所知,你使用的是不同的轮胎,轮辋和轮子(轮胎和轮辋)。