传递最小参数是否合适?

时间:2015-03-06 14:24:09

标签: java design-patterns coding-style

假设我有一个对象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.;
    }
    
  3. 注意:假设由于某种原因,计算不能成为Car类的一部分。请记住这个假设。

3 个答案:

答案 0 :(得分:6)

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

事实上,您可以接受接口类型,例如Vehicle。这允许相同的方法稍后在BikeJet等上计算数据。

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

其中Car将方法实现为

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

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

答案 1 :(得分:5)

我建议使用第三种方法:向Car添加“计算”方法。

这叫做“告诉,不要问”。

请参阅http://martinfowler.com/bliki/TellDontAsk.html

答案 2 :(得分:2)

我建议第二种选择。

为什么?

假设一个:您的计算方法被其他一些类用于计算里程数,例如“类所有者”

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

如果你选择第一个:那么你将不得不在方法计算中引入另外一个参数,这将导致在调用你的方法的其他类中的编译问题。在这种情况下,“班主”。

如果你选择第二个选项:你有灵活性来更新你的计算方法实现,而不会影响使用这种方法的任何其他类