这似乎是一个奇怪的问题,但是否有关于如何在构造函数中排序参数的约定,尤其是在子类中添加构造函数"获得"的参数的约定?在我发现自己阅读了这样的代码之后,我觉得应该有一个(代码是Groovy,但这并不是真正的问题):
class Matter {
double volume
double mass
Matter (double m, double v) {
mass = m; volume = v;
}
}
class Food extends Matter {
double nutrition
Food (double m, double v, double n) {
super (m,v); nutrition = n;
}
}
class Apple extends Food {
double sweetness
Apple (double s, double m, double v, double n) {
super (m,v,n); sweetness = s;
}
}
class GreenApple extends Apple {
double acidity
GreenApple (double a, double m, double n, double s, double v) {
super (s,m,v,n); acidity = a;
}
}
正如我上面所说明的,一旦我们到达GreenApple,构造函数参数中可能存在的任何顺序都将消失。然而,请注意,程序员并没有随机添加他们的新论点——Food的作者认为新论点应该添加在后面,Apple的作者认为它们应该添加在前面,GreenApple的程序员认为这些论点应该按字母顺序排列,但放在一起,它们使得构造函数相当混乱(类型安全在这里没有用,它们都是双重的)。
无独有偶(嗯,不是真的),这也是我认为可能存在的三个惯例。所以,我现在的问题是,有这样的惯例吗?如果有,那是什么?不同语言之间有区别吗?
据我所知,没有任何"硬性"约定,比如按字母顺序对参数排序或类似的约定。构造函数或任何函数中的IMHO参数都应该从最高有效到最低有效进行排序。当然,这需要解释,但这不是团队成员之间良好沟通无法解决的问题。
事实上,在大多数情况下,如果构造函数参数仍然需要从外部传递,我希望子类不会重新排序。但可能有非常合理的理由做出例外。