各种params方法签名与一个对象param方法签名

时间:2018-04-04 20:51:14

标签: oop design-patterns signature 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,任何其他可能的)

3 个答案:

答案 0 :(得分:1)

第一个似乎对客户更明确,因为每个参数都在构造函数声明中定义 但是这种方式也很容易出错,因为你有很多参数,而且有些参数的类型相同。客户可以轻松地将它们混合在一起 因此,在这种特定情况下,使用诸如constructor(descriptor){...}之类的文字似乎更清晰。

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

答案 1 :(得分:1)

如果你认为单个对象中的许多字段是一种有点烦人的模式。这不是一种非常难闻的气味 - 我们称之为略微恶臭。

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

其他类 - 其中包含逻辑的类 - 通常不需要这么多初始化字段。

当他们确实需要这个时,我会非常依赖工厂模式&不变性。

Intellij有一个添加构建器模式重构,对此有好处,可能有一个用于eclipse / netbeans作为插件,但我看起来并不太难。

答案 2 :(得分:0)

哇第3版刚出来,但对此的正确答案是你应该使用Bloch的静态构建器模式,它解决了你在这里注意到的问题,以及相关的(可能更重要的)如何使许多领域不可变。

了解它here