【问题标题】:Is it good to pass minimal parameters?传递最少的参数好吗?
【发布时间】:2015-03-06 14:24:09
【问题描述】:

假设我有一个对象 Car,它有五个参数,{ numwheels, color, mileage, horsepower, maxSpeed }。 我有一个需要其中 3 个值的方法。 据说这两个选项中的哪一个是最佳实践? 传递封闭对象并减少参数数量是否更好,或者只是将最少的数据传递给方法(例如:方法2中不会访问numwheels和color)?

  1. 选项 1 传递整个对象:

    void compute(Car c, Person p) {
        return c.mileage + c.horsepower + c.maxSpeed + p.age;
    }
    
  2. 选项 2:只传入方法值。

    void compute(int mileage, int horsepower, int maxSpeed, int age) {
        return mileage + horsepower + maxSpeed + age.;
    }
    

注意:假设由于某种原因,compute 不能成为 Car 类的一部分。请记住这个假设来回答。

【问题讨论】:

  • 可能是口味决定的。遵循约定总是有帮助的,所以我会说使用更少的参数更常见,更有意义,最重要的是更灵活(更改 Car 类中的字段不会更改方法签名)

标签: java design-patterns coding-style


【解决方案1】:

最好传递封闭的对象,因为计算中所需参数数量的任何变化都不会影响将来的方法签名。

实际上,您可以接受 interface 类型,例如 Vehicle。这允许稍后使用相同的方法计算Bike、Jet 等的数据。

public int compute(Vehicle veh) {
    return veh.computePerformance();
}

Car 将方法实现为

public int computePerformance() {
    return mileage + horsepower + maxSpeed;
}

我们的想法是编写易于扩展的代码。

【讨论】:

  • 最好传递封闭的对象,因为计算中所需参数数量的任何变化都不会影响将来的方法签名。 - 答案!
【解决方案2】:

我建议第三种选择:向 Car 添加一个“计算”方法。

这就是所谓的“告诉,不要问”。

见http://martinfowler.com/bliki/TellDontAsk.html

【讨论】:

  • 假设我们 compute 需要另一个名为卡车的对象,并且由于某种原因不能成为汽车的一部分?
  • @JavaDeveloper 也许可以创建一个抽象超类 Vehicle 并在其中实现一个非抽象方法 compute。使 Car、Truck 以及您需要的一切都继承自它(或者如果您希望稍后在子类中实现它,则将其抽象化)。然后所有子类将自动拥有compute。您实际上可以将mileage、horsepower 和maxSpeed 字段全部移到超类中。
  • @Shashank 假设 compute 需要另一个类 Person,该类在类层次结构中不相关。问题的重点不是学习继承,它关于pass more params vs pass single object
  • @JavaDeveloper 如果您绝对必须在这两个选项之间做出决定,那么传递单个对象总是更好。
  • @Shashank 回答!
【解决方案3】:

我建议第二个选项。

为什么?

假设一:其他类使用您的计算方法来计算里程,例如“类所有者”

假设二:假设明天您的计算方法需要 Car 类的另一个属性来计算里程数。

如果您选择选项一:那么您将不得不在方法计算中再引入一个参数,这将导致其他调用您的方法的类出现编译问题。在本例中为“类所有者”。

如果您选择第二个选项:您可以灵活地更新您的计算方法实现,而不会影响使用此方法的任何其他类。

【讨论】:

    猜你喜欢
    • 2011-08-07
    • 1970-01-01
    • 2020-12-27
    • 2019-11-19
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    相关资源
    最近更新 更多