2

音符、小節、リズムなどを表す一連のクラスに取り組んでいます。当然、分数で表すのが最適な拍子記号 (4/4、3/4 など) を扱う必要があります。

スタイルがいいのはどっちだろうと悩んでいます。Bar のコンストラクターに分数オブジェクトまたは拍子記号として 2 つの int のみを含める。

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

また:

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

つまり… 両方を持っている可能性がありますが、アプリケーションではどちらを選択する必要がありますか? 「より良い」スタイルはありますか?

ご感想ありがとうございます!

4

5 に答える 5

5

個人的には、最初のアプローチを採用します。Fraction オブジェクトが必要/必要であることがわかっている場合、なぜ Bar はそれを取らないのでしょうか? Bar クラスを呼び出す人は、いずれかの方法で Fraction を理解する必要があります (int を渡すため)。

于 2013-01-09T14:51:29.877 に答える
5

最初のものを使用し、fraction クラスにファクトリ メソッドを提供して、次のようなものを呼び出せるようにします。

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

両方の世界のベスト;-)

于 2013-01-09T14:53:24.870 に答える
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;
}


}

幸運を

于 2013-01-09T15:59:30.487 に答える
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プログラムのドメイン内にある場合、カスタム型が保証されます。

于 2013-01-09T15:35:37.530 に答える
1

すべての設計の質問と同様に、これは状況によって異なります。この場合、クラスがどのように使用されるかを検討する必要があります。

一般的に、私はより単純なAPIを好みます。これを比較してください:

Bar myBar = new Bar(4, 4);

これに:

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

後者の方法はより明示的ですが(これは良いことです)、文字通りの引数を使用して多数のバーをインスタンス化すると、面倒になる可能性があります。一方、コードで分数を処理する必要がある場合は、最初の構文の方が適している可能性があります。

考慮すべきもう1つの側面は、新しいクラスを導入するオーバーヘッドですFraction。2つのを格納するためだけに追加のクラスを作成するintことは、ほとんど使用しないために多くのオーバーヘッドを意味します。ただし、Fraction他のサービス(分数の単純化など)も提供する場合、クラスは存在する権利を獲得します。

于 2013-01-09T14:58:53.493 に答える