うーん、楽しい問題です。
実際には、Composite と一緒に Command パターンに変えたいと思っています。これは、モデル化されたオブジェクトを名詞ではなく動詞にするという意味で、通常の OO アプローチを逆にするようなものです。次のようになります。
Note は、 lengthtone` という 1 つのメソッドを持つクラスplay(), and a ctor taking
ですand
。
音色、アタックなど、シンセの動作を定義するインストゥルメントが必要です。
次に、TimeSignature を持ち、小節を含む Composite パターンである Score を作成します。小節には音符が含まれます。
実際にプレイするということは、別のコンテナである Repeats や Codas など、他のものを解釈することを意味します。それを再生するには、コンポジットの階層構造を解釈し、メモをキューに挿入します。ノートがテンポに基づいてキューを移動すると、各ノートでplay()
メソッドが呼び出されます。
うーん、それを逆にするかもしれません。各ノートはインストゥルメントへの入力として与えられ、インストゥルメントは必要に応じて波形を合成して解釈します。それは元のスキームのようなものに戻ります。
分解へのもう 1 つのアプローチは、パルナスの法則を適用することです。要件が変更される可能性がある秘密の場所を保持するために分解します。しかし、それは最終的に同様の分解になると思います。拍子記号とチューニングを変更できます。楽器を変更できます。バイオリン、ピアノ、マリンバのいずれで演奏しても、ノートは気にしません。
興味深い問題です。