上記はクラス図です。Class A には doThis(obj: Class B) があり、これは ClassB のオブジェクトを受け取り、最終的に obj.operation1() を呼び出します。
この理由だけで、クラス A とクラス B の間にリンクが存在する必要がありますか? または、それらをリンクする必要はなく、クラス A はクラス B のオブジェクトを使用して operation1() を呼び出すことができますか?
上記はクラス図です。Class A には doThis(obj: Class B) があり、これは ClassB のオブジェクトを受け取り、最終的に obj.operation1() を呼び出します。
この理由だけで、クラス A とクラス B の間にリンクが存在する必要がありますか? または、それらをリンクする必要はなく、クラス A はクラス B のオブジェクトを使用して operation1() を呼び出すことができますか?
クラス図内のリンクは、次のいずれかになります。
上記のリンクはすべてコードに反映されています。Java でいくつかの例を示します。
アソシエーション が単方向の場合 (リンクに B を指す矢印がある)、クラス A にはクラス B のフィールドがあります。
public class A {
B b;
}
関連が双方向の場合 (リンクに矢印がない場合)、クラス B にもクラス A のフィールドがあります。
public class B {
A a;
}
一般化
この場合、A は B を継承します。
public class A extends B {
//class implementation
実現
この場合、インターフェイスとそれを実装するクラスB
である必要があります。A
public class A implements B {
//class implementation
依存
この場合、クラス A はクラス B に依存しています。これはどういう意味ですか? これは、クラス A のコードにクラス B が何らかの形で存在することを意味します。したがって、クラス A と B が異なるパッケージにある場合、A のクラス ファイルにはクラス B のインポート ステートメントがあります。
import somepackage.B;
public class A {
void someMethod() {
B b = ...
}
}
具体的な図は? 特定の図では、関連付けのナビゲーション可能性が指定されていません。つまり、どのクラスが他のクラスへの参照を保持しているかが示されていません。通常、ナビゲーション可能性の明示的な仕様がない場合、双方向の関連付けが暗示されます。クラス間の双方向の関連付けを示す図は、次のように変換されます。
public class A {
B b;
public void doSomething(B obj) {
obj.operation1();
}
}
public class B {
A a;
public void operation1() {
//some code in here...
}
}
クラス A にクラス B のフィールドがなく、メソッドの引数として B のみを使用する場合、doSomething(b)
関連付けはなく、依存関係があります。したがって、関連付けリンクを依存関係リンクに置き換える必要があります。図は次のようになります。
依存関係を図から除外する必要がありますか?
2 つのクラス間のすべてのリンクを UML ダイアグラムに表示する必要はありません。UML はコミュニケーションの手段であるため、伝えられるメッセージに価値を追加しないものはすべて省略できます。より多くのクラスを含むより複雑なシナリオでは、ほとんどの場合、クラスのすべての依存関係または関連付けを表示するのではなく、重要だと思われるものだけを表示する必要があります。そうしないと、ダイアグラムがリンクでいっぱいになり、判読できなくなります。
したがって、クラス A からクラス B への依存関係が重要ではないと思われる場合は、図から省略できます (doSomething(b)
メソッドのシグネチャにも表示されるためです。通常、すべてのコンパイルを表示する必要はありません)。図の依存関係ですが、もっと重要なことがあります。
一方、この関係が伝えたいメッセージの一部である場合は、図に含める必要があります。この場合、依存関係のタイプを説明する意味のあるステレオタイプで依存関係リンクを装飾すると非常に便利です。クラス B の機能の重要な部分である場合は特に、次のようなもの<<invokes_operation1>>
がより説明的になります。operation1()
A が B への参照を保持している場合は、クラス A とクラス B をリンクする必要があります。ただし、A が「doThis」の実行中にのみ B を認識している場合、リンクは必要ありません。