【问题标题】:Various params method signature versus one object param method signature各种参数方法签名与一个对象参数方法签名
【发布时间】:2018-04-04 20:51:14
【问题描述】:

我需要构造具有许多属性的对象。 我可以为每个属性创建一个带有一个参数的构造函数:

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,任何其他可能的语言)编写

【问题讨论】:

标签: oop design-patterns signature method-signature


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    Intellij 有一个 add builder 模式重构可以很好地解决这个问题,可能有一个用于 eclipse/netbeans 的插件,但我并没有太努力。

    【讨论】:

      【解决方案3】:

      哇,第 3 版刚刚问世,但正确的答案是您应该使用 Bloch 的静态构建器模式,它解决了您在此处注意到的问题,以及如何制作许多相关的(可能更重要的)字段不可变。

      阅读here

      【讨论】:

        猜你喜欢
        • 2014-07-23
        • 2012-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多