我正在研究一组表示音符,小节,节奏等的类。当然,我必须处理最好用分数表示的时间签名(如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);
}
我的意思是......我可以同时拥有两个,但我应该在申请中选择哪一个?是否有“更好”的风格?
感谢您的想法!
答案 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
也提供其他服务(例如分数的简化),则该类获得其存在的权利。