各种参数方法签名与一个对象参数方法签名

Various params method signature versus one object param method signature

我需要构造具有许多属性的对象。 我可以为每个 属性:

创建一个带有一个参数的构造函数
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、任何其他可能的语言)

第一个对于客户来说似乎更明确,因为每个参数都在构造函数声明中定义。
但是这种方式也容易出错,因为您有很多参数并且某些参数具有相同的类型。客户可以很容易地混合它们,因为它们被传递给。
因此,在这种特定情况下,使用 constructor(descriptor){...} 之类的文字似乎更清楚。

我不确定这种类型的构造函数是不是一种设计模式。它更像是一种构造函数风格,它取决于需求,也取决于所使用的语言。
在 JavaScript 中,它很常见,因为它更直接,并且避免为 setter 方法或构建器构造函数编写样板代码。
但是在 Java 等其他语言中,定义具有如此多参数的构造函数也是一种难闻的气味,但使用文字也不是一种可能的选择。 因此通常建议使用 setter 或构建器构造函数。

哇,第三版刚刚出来了,但是正确的答案是你应该使用 Bloch 的静态构建器模式,它解决了你在这里提到的问题,以及相关的(可能更重要的一个)如何制作许多字段不可变。

了解一下 here

如果您考虑一下,单个对象中的多个字段是一种有点烦人的模式。这不是一种非常难闻的气味 -- 让我们称之为轻微难闻。

我见过的具有许多这样的字段的一个案例是 Java Beans 或 pojo。这些往往是一个 class,其中包含许多带有注释的字段,告诉各种服务应如何使用这些字段。这些实际上并不需要复杂的构造函数,因为它们通常是使用注释来创建的。

其他 classes——有逻辑的——通常不需要这么多初始化字段。

当他们确实需要这个时,我会非常倾向于工厂模式和不变性。

Intellij 有一个添加构建器模式重构,这对这个很有用,可能有一个 eclipse/netbeans 作为插件,但我没有太努力地寻找它。