4

私は音楽作品を表す3つの非静的クラスを持っています。これらは、スコア、パート、およびノー​​トのクラスです。

スコアにはArrayList<Part>、スコアの複数の楽器パートを表すインスタンス変数が含まれ、パートにはArrayList<Note>、ノートシーケンスを表すインスタンス変数が含まれます。

public class Score {

   private ArrayList<Part> parts;
   private int resolution;

   public Score(int resolution) {
      parts = new ArrayList<Part>();
      this.resolution = resolution;
   }

   public void addPart(Part part) {
      parts.add(part);
   }

   public ArrayList<Part> getParts() {
      return parts;
   }

   public int getResolution() {
      return resolution;
   }
}

public class Part {

   private ArrayList<Note> notes;

   public Part() {
      notes = new ArrayList<Note>();
   }

   public void addNote(Note note) {
      notes.add(note);
   }

   public ArrayList<Note> getNotes() {
      return notes;
   }
}

public class Note() {
   private long startStamp;
   private long endStamp;
   private int resolution;

   public Note(long startStamp, long endStamp, int resolution) {
      this.startStamp = startStamp;
      this.endStamp = endStamp;
      this resolution = resolution;
   }

   public double getDuration() {
      int duration = (double) (getEndStamp() - getStartStamp()) / resolution;
      return duration;
   }
}

各ノートの長さは、スコア解像度を使用して計算されます。特定のスコアインスタンスの解決は、ノートがインスタンス化されるたびにノートコンストラクターを通過します。ArrayList<Note> notes次に、対応するPartインスタンスにメモが追加されArrayList<Part> parts、Scoreインスタンスにパーツが追加されます。

同じスコアに属する多くのノートがあるため、ノートコンストラクターパラメーターとして使用する私のソリューションはint resolutionエレガントではないようです。つまり、解像度はノートの属性ではなくスコアの属性です。

Noteクラスのコンストラクター、またはおそらく他のソリューションを介して解決を渡す代わりに、Noteクラス内から対応するScoreオブジェクトを参照することによって解決を取得する方法はありますか?

4

3 に答える 3

2

解像度は、メモではなくスコア(デザインに基づく)に関係しているようです。Note#getDurationのメソッドシグネチャを変更して、特定の解像度で期間を計算してみませんか。

public double getDuration(int resolution) {
  double duration = (double) (getEndStamp() - getStartStamp()) / resolution;
  return duration;

}

同じノートを異なる解像度で異なるスコアに追加できるようになりました。

またはさらに良いことに、単に戻ってみませんか:

public long getDuration() {
  return getEndStamp() - getStartStamp();

}

呼び出し元のコードに、実行する必要のある変換を処理させますか?

于 2012-06-28T17:07:30.617 に答える
0

スコアをNoteコンストラクターに渡すことで、それらを地獄のように緊密に結合するか、スコア自体に関数getDuration(Node n)を作成します。そうすれば、スコアだけが解像度を知ることができますが、これはより正しいようです。(解像度が本当にスコアの特性であると仮定します。私は一般的に音楽に愚かです:()

編集:

たとえば、このタイトルを使用すると、よりわかりやすくなる可能性があります。はい、ベートーベンは馬鹿でしたが、彼がJavaプログラマーだったとしたらどうでしょうか。:)

于 2012-06-28T17:05:22.193 に答える
0

期間を計算する必要があるのはいつですか? 私は個人的に、ドメイン オブジェクトにいかなる種類のロジックも含めないように努めており、スコアとメモを参照できる 3 つのオブジェクトすべての外で、サービスにメモの長さを計算させます。startStamp と endStamp プロパティをノートに持つ代わりに、startStamp と duration 属性を持ち、ノート オブジェクトの作成時にデュレーションを計算することもできます。

public class Note() {
   private long startStamp;
   private long duration;

   public Note(long startStamp, long duration) {
      this.startStamp = startStamp;
      this.duration = duration;
   }

   public double getDuration() {
      return duration;
   }
}
于 2012-06-28T17:24:21.637 に答える