有什么方法可以在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
答案 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()
方法添加的轮胎时。据我所知,你使用的是不同的轮胎,轮辋和轮子(轮胎和轮辋)。