最好有两个构造函数,还是应该将它们合并为一个?

时间:2019-09-12 15:05:02

标签: javascript

我的项目中有两个构造函数。第一个是有关健身房的信息,第二个是该健身房中的所有私人教练。

看起来像这样

class Gym {
    constructor (
        id,
        name,
        GymId,
        address,
        imageUrl,
        description
    ) 
}

class Trainer {
    constructor (
        id,
        name,
        gymID,
        yearsExperience,
        Gender,
        description,
        imageUrl
    )
}

我通过检查gymId是否相等将教练与健身房联系起来。我的问题是,在体育课中嵌套教练数据会更好吗?因此我的体育课上会有一个额外的属性,例如trainers。我的数据可能看起来像这样:

new Gym (
    0,
    'Fitness First',
    0,
    'some random address',
    'image link'
    'This is a cool gym'
    [{id: 0, name: Jim, 0, 10, Male, 'Good Guy', 'imageURL'}, {...}, {...}]
)

2 个答案:

答案 0 :(得分:1)

我认为这里有两个单独的问题:

(1)我应该使用带有构造函数的类还是仅使用对象文字{id: 0, name: "Jim", gymID: 0, ...}

我认为一个答案很明确:当您有多个相同种类/形状的对象时,则应使用一个类,并且该类应具有构造函数。 (可以说,这是有些观点,但是我认为这是合理无争议的。)

(2)在GymTrainer的特定情况下,Gym类是否应具有其Trainer s列表的属性?

这是一个设计决定,实际上取决于您的应用程序需求;我认为不可能对此做出一般性回答。如果您经常遇到这样的情况,即您有一个gym实例并想遍历其训练员,那么与筛选通过所有健身房的全部训练员的庞大全局列表相比,预先填充该列表是更有效的方法。如果您经常将教练员重新分配到另一间健身房,则只需要更新一个属性比查找两个健身房并从一个列表中删除教练员实例并将其添加到另一个更容易,更快。

如果确定培训员列表,仍然可以使用Gym构造函数来填充它。然后,Trainer类可能需要也可能不需要gymID字段,具体取决于您是否需要它。具有两个功能的示例代码:

class Gym {
  constructor(id, name, ..., trainers) {
    this.id = id;
    // ...
    this.trainers = trainers;
    for (let trainer of trainers) {
      trainer.gymId = this.id;
    }
  }
}
let trainers = [
    new Trainer(0, "Jim", ...), 
    new Trainer(1, "Mary", ...)];
let gym = new Gym(0, "Fitness First", ..., trainers);

答案 1 :(得分:0)

我认为您误解了什么是构造函数。要直接回答您的问题,不,您不应该将它们分开。为什么?因为它们本质上是两个不同的对象。

由于它们是两个不同的对象,因此它们需要自己的构造函数。因为构造函数的工作就是简单地初始化对象,所以别无其他。

Jmrk是正确的解决方案。您可以简单地创建培训师类,创建培训师列表,然后将培训师列表传递给Gym对象。在Gym对象中,确保构造函数接受培训师列表。