我需要构造具有许多属性的对象。 我可以为每个属性创建一个带有一个参数的构造函数:
class Friend{
constructor(name, birthday, phone, address, job, favouriteGame, favouriteBand){
this.name = name;
this.birthday = birthday;
this.phone = phone;
this.address = address;
this.job = job;
this.favouriteGame = favouriteGame;
this.favouriteBand = favouriteBand;
}
}
或者我可以使用文字对象或包含所有值的数组接收一个参数:
class Friend{
constructor(descriptor){
this.name = descriptor.name;
this.birthday = descriptor.birthday;
this.phone = descriptor.phone;
this.address = descriptor.address;
this.job = descriptor.job;
this.favouriteGame = descriptor.favouriteGame;
this.favouriteBand = descriptor.favouriteBand;
}
}
在哪种情况下我应该使用每一个? 是否有关于这个主题的设计模式?
我对OOP感兴趣。我使用的是Javascript,但它可以用支持OOP的任何其他语言编写(PHP,Java,C ++,Python,任何其他可能的)
答案 0 :(得分:1)
第一个似乎对客户更明确,因为每个参数都在构造函数声明中定义
但是这种方式也很容易出错,因为你有很多参数,而且有些参数的类型相同。客户可以轻松地将它们混合在一起
因此,在这种特定情况下,使用诸如constructor(descriptor){...}
之类的文字似乎更清晰。
我不确定这种类型的构造函数是否为设计模式。它更像是一种构造函数,它取决于要求,也取决于所使用的语言
在JavaScript中,它很常见,因为它更直,它避免为setter方法或构建器构造函数编写样板代码。
但在Java等其他语言中,定义具有如此多参数的构造函数也是一种难闻的气味,但使用文字也不是一种可能的选择。
因此,通常建议使用setter或构建器构造函数。
答案 1 :(得分:1)
如果你认为单个对象中的许多字段是一种有点烦人的模式。这不是一种非常难闻的气味 - 我们称之为略微恶臭。
我见过的有很多像这样的字段的案例是Java Beans或pojos。这些往往是一个有很多字段的类,注释告诉各种服务应该如何使用字段。这些实际上并不需要复杂的构造函数,因为它们通常使用注释来创建。
其他类 - 其中包含逻辑的类 - 通常不需要这么多初始化字段。
当他们确实需要这个时,我会非常依赖工厂模式&不变性。
Intellij有一个添加构建器模式重构,对此有好处,可能有一个用于eclipse / netbeans作为插件,但我看起来并不太难。
答案 2 :(得分:0)
哇第3版刚出来,但对此的正确答案是你应该使用Bloch的静态构建器模式,它解决了你在这里注意到的问题,以及相关的(可能更重要的)如何使许多领域不可变。
了解它here。