UMLにおけるクラス間の関係
関係は物事のつながりである.クラスの間には4つの重要な関係があります.依存、汎化、関連付け、実装です.これらの関係はコードにマッピングできます.
依存は使用関係であり、1つの物事を記述する仕様の説明の変化は、それを使用する別の物事に影響を与える可能性があります(逆は必ずしもそうではありません).UMLでは依存するものを指す破線として表される.依存には構造型がたくさんありますが、複雑にならないように、一般的には使用する必要はありません.実は他の3つの関係の汎化、関連と実現はいずれもある依存関係とみなすことができて、ただそれらは比較的に強い意味と重要な役割を持っているので、区分します.一般的にクラス関係をモデリングする際には,まず汎化,関連付け,実装モデリングを行い,残りの関係は依存と見なすことができる.
コードに対応する依存関係には、たとえば
ここでクラスAはクラスB(メソッド戻りクラス)、CおよびD(パラメータクラス)、E(メソッド内変数のクラス)に依存する.これらのクラスの変化はクラスAに影響を及ぼす可能性があるからである
汎化は一般的な事物(スーパークラスまたは親クラスと呼ばれる)と比較的特殊な事務(サブクラスと呼ばれる)の関係であり、クラスにとって一般的に継承されている.例えば、public Class A extends Bである.一般的に、汎化関係は、中空矢印を有する実線で表される.
関連付けは構造関係であり、ある物事のオブジェクトが別の物事のオブジェクトと関連していることを説明します.2つのクラスを接続する関連付けが与えられ、1つのクラスのオブジェクトから別のクラスのオブジェクトにナビゲートできます.
一般的には、関連を同じクラスまたは異なるクラスを結ぶ実線として描きます.関連付けには、方向、すなわちナビゲーションがあります.一般的に説明しない場合、ナビゲーションは双方向で、オンラインで矢印を表示する必要はありません.ほとんどの場合、ナビゲーションは一方向であり、矢印で表すことができます.
関連付けは、一般的にはコードで属性として表されます.たとえば、
AがBを指す関連があると考えられる.
BもAに関連付けられている場合、それらは双方向の関連である.
BはAの属性ではない場合もありますが、関連関係がある場合もあります.たとえば、次のようにします.
2つのクラス間の単純な関連付けは、2つの同等の地位クラス間の構造関係を表す.集約も関連関係であり、単純な関連とは異なり、全体と構成部分の関係、すなわち「has-a」関係を記述し、全体オブジェクトが学校や学生などの一部のオブジェクトを持つことを意味する.集約された全体と部分の間には、ライフサイクルに必然的な関連はありません.一部のオブジェクトは、全体のオブジェクトが作成される前に作成することも、全体のオブジェクトが破棄された後に破棄することもできます.重合は中空菱形(全体の一端)を有する実線で表される.
組み合わせられたライフサイクルを生成します.組み合わせは実心菱形の実線で表される.
コード実装の組合せと集約の主な違いは、ライフサイクルの実装にあり、構成はその部分の作成と破棄を担当する必要があります.
もう1つの違いは、グループ内の1つのオブジェクトが同じ時点で1つの構成オブジェクトにのみ属することであり、集約された1つの部分オブジェクトは、1人の学生が複数の学校で勉強することができ、1つのメニューは同じ時点でウィンドウ内のオブジェクトにしかならないなど、複数の全体オブジェクトに集約することができることである.
実装関係は比較的簡単であり、1つのクラスが別のクラスを記述して実装を保証する契約を指す.クラスにとって、クラスがインタフェースを実現したものです.
一般に,オブジェクトに直面するシステムでは,可能な限りインタフェースを用いてクラス間の結合を低減する.インタフェースは実装されていないため、jdbcのConnectionやResultSetなど、インタフェースに依存する特定の実装には依存しません.データベースベンダーによって実装が異なります.
まとめてみる
1)依存関係:関係オブジェクトが局所変数またはメソッドのパラメータに現れるか,または関係クラスの静的メソッドが呼び出される.
2)関連関係:関係オブジェクトがインスタンス変数に現れる
3)集約関係:リレーショナル・オブジェクトがインスタンス変数に表示されます.
4)リレーションの合成:リレーションシップオブジェクトがインスタンス変数に表示されます.
5)Generalization: extends
6)実装:implements
集約は、学生と選択したカリキュラムの関係は組み合わせであり、彼らの間には感念的な必然的な関係はなく、カリキュラムを削除しても、学生に影響を与えない.
組み合わせはこうです:注文と注文項目の関係は集約で、彼らの関係はとても緊密で、1つの注文を削除して、注文項目も意味がありません
組み合わせは重合の一種である
依存は使用関係であり、1つの物事を記述する仕様の説明の変化は、それを使用する別の物事に影響を与える可能性があります(逆は必ずしもそうではありません).UMLでは依存するものを指す破線として表される.依存には構造型がたくさんありますが、複雑にならないように、一般的には使用する必要はありません.実は他の3つの関係の汎化、関連と実現はいずれもある依存関係とみなすことができて、ただそれらは比較的に強い意味と重要な役割を持っているので、区分します.一般的にクラス関係をモデリングする際には,まず汎化,関連付け,実装モデリングを行い,残りの関係は依存と見なすことができる.
コードに対応する依存関係には、たとえば
public class A
{
public B getB(C c, D d)
{
E e = new E();
B b = new B(c, d, e);
}
}
ここでクラスAはクラスB(メソッド戻りクラス)、CおよびD(パラメータクラス)、E(メソッド内変数のクラス)に依存する.これらのクラスの変化はクラスAに影響を及ぼす可能性があるからである
汎化は一般的な事物(スーパークラスまたは親クラスと呼ばれる)と比較的特殊な事務(サブクラスと呼ばれる)の関係であり、クラスにとって一般的に継承されている.例えば、public Class A extends Bである.一般的に、汎化関係は、中空矢印を有する実線で表される.
関連付けは構造関係であり、ある物事のオブジェクトが別の物事のオブジェクトと関連していることを説明します.2つのクラスを接続する関連付けが与えられ、1つのクラスのオブジェクトから別のクラスのオブジェクトにナビゲートできます.
一般的には、関連を同じクラスまたは異なるクラスを結ぶ実線として描きます.関連付けには、方向、すなわちナビゲーションがあります.一般的に説明しない場合、ナビゲーションは双方向で、オンラインで矢印を表示する必要はありません.ほとんどの場合、ナビゲーションは一方向であり、矢印で表すことができます.
関連付けは、一般的にはコードで属性として表されます.たとえば、
public class A
{
private B b;
}
AがBを指す関連があると考えられる.
BもAに関連付けられている場合、それらは双方向の関連である.
BはAの属性ではない場合もありますが、関連関係がある場合もあります.たとえば、次のようにします.
public class A
{
public B[] getBs()
{...}
}
メソッドgetBsは、データベースを調べ、AとBの関連関係を見つけることができます.2つのクラス間の単純な関連付けは、2つの同等の地位クラス間の構造関係を表す.集約も関連関係であり、単純な関連とは異なり、全体と構成部分の関係、すなわち「has-a」関係を記述し、全体オブジェクトが学校や学生などの一部のオブジェクトを持つことを意味する.集約された全体と部分の間には、ライフサイクルに必然的な関連はありません.一部のオブジェクトは、全体のオブジェクトが作成される前に作成することも、全体のオブジェクトが破棄された後に破棄することもできます.重合は中空菱形(全体の一端)を有する実線で表される.
public Class Person
{...}
public Class School
{
private ArrayList students;
private void addStudent(Person person)
{
students.add(person);
}
}
の組み合わせは、集約よりも強い関連形式である.コンビネーションとは、関係が強く、全体的に部分的なライフサイクルと一致する集約関連形式を指します.たとえばWindowsのウィンドウとウィンドウのメニューがコンビネーション関係です.ライフサイクルコンシステントとは、部分的にコンビネーションが作成されると同時に作成される必要があり、コンビネーションが破棄される前または同時に破棄されると、一部のライフサイクルが超過しないことを意味します.組み合わせられたライフサイクルを生成します.組み合わせは実心菱形の実線で表される.
public Class Menu
{...}
public Class Window
{
private Menu menu;
}
コード実装の組合せと集約の主な違いは、ライフサイクルの実装にあり、構成はその部分の作成と破棄を担当する必要があります.
public Class School
{
public School()
{...}// Person , Students Person
public void destroy()
{...}// School Person ,Person
}
public Class Window
{
private Menu menu;
public Window()
{
menu = new Menu();
}// Menu ,
public void destory()
{
menu.destory();
}// Menu
}
もう1つの違いは、グループ内の1つのオブジェクトが同じ時点で1つの構成オブジェクトにのみ属することであり、集約された1つの部分オブジェクトは、1人の学生が複数の学校で勉強することができ、1つのメニューは同じ時点でウィンドウ内のオブジェクトにしかならないなど、複数の全体オブジェクトに集約することができることである.
実装関係は比較的簡単であり、1つのクラスが別のクラスを記述して実装を保証する契約を指す.クラスにとって、クラスがインタフェースを実現したものです.
public interface A
{
public void methodA();
}
public class B implements A
{
public void methodA()
{...}
...
}
一般に,オブジェクトに直面するシステムでは,可能な限りインタフェースを用いてクラス間の結合を低減する.インタフェースは実装されていないため、jdbcのConnectionやResultSetなど、インタフェースに依存する特定の実装には依存しません.データベースベンダーによって実装が異なります.
まとめてみる
1)依存関係:関係オブジェクトが局所変数またはメソッドのパラメータに現れるか,または関係クラスの静的メソッドが呼び出される.
2)関連関係:関係オブジェクトがインスタンス変数に現れる
3)集約関係:リレーショナル・オブジェクトがインスタンス変数に表示されます.
4)リレーションの合成:リレーションシップオブジェクトがインスタンス変数に表示されます.
5)Generalization: extends
6)実装:implements
集約は、学生と選択したカリキュラムの関係は組み合わせであり、彼らの間には感念的な必然的な関係はなく、カリキュラムを削除しても、学生に影響を与えない.
組み合わせはこうです:注文と注文項目の関係は集約で、彼らの関係はとても緊密で、1つの注文を削除して、注文項目も意味がありません
組み合わせは重合の一種である