代码样式:“隐藏”数据类型(Java)

时间:2013-01-09 14:49:00

标签: java types conventions

我正在研究一组表示音符,小节,节奏等的类。当然,我必须处理最好用分数表示的时间签名(如4 / 4,3 / 4等)。

我想知道什么是更好的风格。使用Bar的构造函数包含Fraction-object或仅包含两个整数作为时间签名。

public Bar(Fraction timeSignature) {
    this.timeSignature = timeSignature;
}

或:

public Bar (int num, int den) {
    timeSignature = new Fraction(num, den);
}

我的意思是......我可以同时拥有两个,但我应该在申请中选择哪一个?是否有“更好”的风格?

感谢您的想法!

5 个答案:

答案 0 :(得分:5)

就个人而言,我会选择第一种方法。如果你知道你需要/想要一个Fraction对象,为什么Bar不仅仅是那个?调用Bar类的人需要以任何方式理解Fraction(向你传递整数),所以它更干净。

答案 1 :(得分:5)

我使用第一个并在fraction类中提供一个工厂方法,以便能够调用类似的东西:

new Bar(Fraction.of(4, 4));

两全其美; - )

答案 2 :(得分:2)

首先,简单的API很好,是的,但是如果稍后扩展构造函数以获取更多参数(比如BPM),则使用基元而不是对象会使调用代码更难理解。即:

Bar myBar = new Bar(4, 4) // Okay
Bar myBar = new Bar(4, 4, 120) // ??
Bar myBar = new Bar(new TimeSignature(4, 4), 120) // Much clearer

如果有疑问,明确表示更好。

其次,我会说将时间签名存储在Fraction对象中 - 虽然它们通常被写成分数,但时间签名却不是。 3/4和6/8相当于分数,但是不同的时间签名会产生不同的声音。 TimeSignature位于您的计划的域内,它保证自定义类型。

答案 3 :(得分:2)

您可能需要考虑将时间签名设为枚举,以防止用户输入错误。由于您可能拥有一组有限的时间签名(2 / 4,6 / 8,4 / 4),因此您可以通过执行以下操作来控制用户创建的时间签名:

//example
new Bar(TimeSignature.DUPLE_2_2)

public enum TimeSignature{

DUPLE_2_2(2,2), QUADRUPLE_2_4(2,4), TRIPLE_3_4(3,4);

private final int numerator;
private final int denominator;

private TimeSignature(int numerator, int denominator) {
this.numerator = numerator;
this.denominator = denominator;
}


}

祝你好运

答案 4 :(得分:1)

与每个设计问题一样,这取决于。在这种情况下,您应该考虑如何使用您的课程。

一般来说,我更喜欢更简单的API。比较一下:

Bar myBar = new Bar(4, 4);

到此:

Bar myBar = new Bar(new Fraction(4,4));

后一种选择更明确(这是好的),但如果用文字参数实例化很多条形,可能会变得单调乏味。另一方面,如果你的代码需要处理分数,那么第一种语法可能会更好。

要考虑的另一个方面是引入新类Fraction的开销。创建一个额外的类只是为了存储两个int s意味着很多开销很少用。但是,如果Fraction也提供其他服务(例如分数的简化),则该类获得其存在的权利。