构造函数中是否存在参数顺序的约定,特别是对于子类?

时间:2014-02-12 21:04:26

标签: inheritance constructor conventions cross-language

这可能看起来像一个奇怪的问题,但是有没有关于如何在构造函数中对参数进行排序的约定,尤其是在子类中添加构造函数“获得”的参数?在我发现自己正在阅读这样的代码之后,在我看来应该有一个(代码是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,任何曾经存在于构造函数参数中的订单都消失了。但请注意,程序员并没有随意添加新的参数 - 食品的作者认为应该在后面添加新的论点,Apple的作者认为应该在前面添加它们,而GreenApple的程序员则认为参数应该按字母顺序排序,但是它们一起使得构造函数相当混乱(类型安全在这里没有用,这些都是双倍的。)

巧合(嗯,不是真的),这些也是我可能会有的三个惯例。那么,我现在的问题是,是否存在这样的约定,如果存在,它是什么?语言之间有区别吗?

1 个答案:

答案 0 :(得分:0)

据我所知,没有任何"硬"像按字母顺序排序参数或类似的约定。在构造函数中或在任何函数中的IMHO参数应该从最重要到最不重要的排序。当然,这需要解释,但这不是一个问题,团队成员之间的良好沟通无法解决。

实际上,在大多数情况下,如果仍然需要从外部传递,我希望子类不重新排序构造函数参数。但是可以有非常有效的理由来制作例外。