派生的情報

2003年12月25日

UMLにおける派生情報の表現方法

長方形を表すクラスがあり、その高さ、幅、面積を知りたいとします。面積が高さおよび幅から派生できることを示すにはどうすればよいでしょうか。

一般的な方法は、高さと幅を属性として表示し、面積を演算として表示することです。人々は、高さおよび幅のフィールドと面積を計算するメソッドを使用するため、この方法を採用しています。

UMLには、派生プロパティ用の記法(名前の前に「/」を付ける)もあります。そのため、面積に対してこれを使用できます。

これらのアプローチはどちらとも合理的なものであり、チームによって異なる方法を使用しています。属性をフィールドにのみ使用するチームもあります。そのようなチームは、派生記法を使用しないか、派生情報をフィールドにキャッシュする場合にのみ派生記法を使用します。フィールドと同じ命名規則に従って派生値を作成する場合に派生マーカーを使用するチームもあります(getArea() 演算を使用する場合や、C#やRubyなどの言語でプロパティを使用する場合など)。

私は、これについて少し異なる方法で考えることを好みます。オブジェクトの重要なプロパティの1つは、それらがカプセル化されていることです。長方形クラスのユーザーである場合、円周がどのように計算されているかを知る必要はありませんし、知ろうとも思いません。実装者は高さと円周を格納して幅を計算している可能性がありますが、私はそれを知るべきではありません。そのため、実装のフィールドと派生情報の両方に対して同一の命名規則を使用し、クラス図のすべてのプロパティとしてそれらすべてを表すことになります。

それは、私が派生マーカーを使用しないことを意味するのでしょうか。実際には、そうではありません。円周を派生としてマークすることはできますが、それは3つの値の間に制約があることを示しているだけであり、何が計算されるか、何が格納されるかを指定していません。同様の議論で、三角形に3つの辺のプロパティがある場合に、そのうちの1つを派生としてマークすることが合理的であると言います。

実際、どのアプローチを採用するかはあまり重要ではなく、チーム内で一貫したスタイルに従うことが重要です。また、人によって異なることを行う人がいることを覚えておくことも重要です。そのため、外部の図を見たときに、そのことを理解する必要があります(解釈の不一致のため、私は本よりも派生をあまり使用しません)。UMLは思っているよりも厳密ではないケースの1つです。