传递最少的参数好吗?
Is it good to pass minimal parameters?
假设我有一个对象 Car,有五个参数,{ numwheels, color, mileage, horsepower, maxSpeed }。
我有一个方法需要这些值中的 3 个。
据说这 2 个选项中的哪一个是最佳实践?
是传递封闭对象并减少参数数量更好,还是只将最少的数据传递给方法(例如:方法 2 中不会访问 numwheels 和 color)?
选项 1 传递整个对象:
void compute(Car c, Person p) {
return c.mileage + c.horsepower + c.maxSpeed + p.age;
}
选项 2:仅传入方法值。
void compute(int mileage, int horsepower, int maxSpeed, int age) {
return mileage + horsepower + maxSpeed + age.;
}
注意:假设出于某种原因,计算不能成为 Car class 的一部分。请记住这个假设来回答。
我建议第三种选择:向 Car 添加一个方法 "compute"。
这叫做"Tell, don't ask"。
最好传递封闭的对象,因为计算中所需参数数量的任何变化都不会影响将来的方法签名。
事实上,您可以接受 interface 类型,例如 Vehicle
。这允许相同的方法稍后在 Bike
、Jet
等上计算数据。
public int compute(Vehicle veh) {
return veh.computePerformance();
}
其中 Car
将方法实现为
public int computePerformance() {
return mileage + horsepower + maxSpeed;
}
我们的想法是编写易于扩展的代码。
我建议第二种选择。
为什么?
假设一:你的计算方法被其他class用来计算里程,比如说'class Owner'
假设二:假设明天你的计算方法还需要class汽车的一个属性来计算里程。
如果您采用选项一:那么您将不得不在方法计算中再引入一个参数,这将导致其他 class 调用您的方法时出现编译问题。在这种情况下 'class Owner'.
如果您采用选项二:您可以灵活地更新您的计算方法实现,而不会影响使用此方法的任何其他class。
假设我有一个对象 Car,有五个参数,{ numwheels, color, mileage, horsepower, maxSpeed }。 我有一个方法需要这些值中的 3 个。 据说这 2 个选项中的哪一个是最佳实践? 是传递封闭对象并减少参数数量更好,还是只将最少的数据传递给方法(例如:方法 2 中不会访问 numwheels 和 color)?
选项 1 传递整个对象:
void compute(Car c, Person p) { return c.mileage + c.horsepower + c.maxSpeed + p.age; }
选项 2:仅传入方法值。
void compute(int mileage, int horsepower, int maxSpeed, int age) { return mileage + horsepower + maxSpeed + age.; }
注意:假设出于某种原因,计算不能成为 Car class 的一部分。请记住这个假设来回答。
我建议第三种选择:向 Car 添加一个方法 "compute"。
这叫做"Tell, don't ask"。
最好传递封闭的对象,因为计算中所需参数数量的任何变化都不会影响将来的方法签名。
事实上,您可以接受 interface 类型,例如 Vehicle
。这允许相同的方法稍后在 Bike
、Jet
等上计算数据。
public int compute(Vehicle veh) {
return veh.computePerformance();
}
其中 Car
将方法实现为
public int computePerformance() {
return mileage + horsepower + maxSpeed;
}
我们的想法是编写易于扩展的代码。
我建议第二种选择。
为什么?
假设一:你的计算方法被其他class用来计算里程,比如说'class Owner'
假设二:假设明天你的计算方法还需要class汽车的一个属性来计算里程。
如果您采用选项一:那么您将不得不在方法计算中再引入一个参数,这将导致其他 class 调用您的方法时出现编译问题。在这种情况下 'class Owner'.
如果您采用选项二:您可以灵活地更新您的计算方法实现,而不会影响使用此方法的任何其他class。