web-dev-qa-db-ja.com

UML関係-破線と実線

これら2つの関係の違いは何ですか?

enter image description here

編集:また、違いを示す簡単なコード例を提供できれば、それは本当に役立ちます!

43
NPS

私は2種類の線の簡単な例を挙げようとしています。

最初の図では、実線は関連付けを示しています。

PlantUML diagram of a directed association

クラスがJavaで宣言されている場合、これはClassAへの参照を属性として格納するClassBのようになります(コンストラクターに渡される、作成されるなど)。そのため、次のようなものが表示される場合があります。

public class ClassA {
    ClassB theClassB = ...
    ...
}

2番目の図では、依存関係を示しています。

PlantUML diagram of dependency

依存関係は、関連付けよりもはるかに弱いです。 UML Distilledから引用するには:

クラスでは、さまざまな理由で依存関係が存在します。あるクラスが別のクラスにメッセージを送信します。あるクラスには、データの一部として別のクラスがあります。あるクラスは別のクラスを操作のパラメーターとして言及します。 [...] 1つの要素の変更が他の要素をどのように変更するかを示すには、常に依存関係を使用します。

繰り返しますが、Javaを使用すると、いくつかの例があります。タイプClassBの引数がメソッドに渡されるか、メソッドがタイプClassBのローカル変数を宣言します。

public class ClassA {
    ...
    public void someMethod(ClassB arg1) {...}
    ...
    public void someOtherMethod() {
        ClassB localReferenceToClassB = ...
    }
    ...
}

他の方法ClassAdependに関連付けられていない(完全なリストではない)ClassBで:

  • ClassBには、ClassAが呼び出す静的メソッドがあります
  • ClassAClassB型の例外をキャッチします
  • ClassBが変更されるたびに、ClassAも変更する必要があります(たとえば、一部のロジックは共有されます)
24
Fuhrmanator

このウェブページには、私が思うに十分なことが書かれています: http://www.classdraw.com/help.htm 次のテキストはそこから来ていますが、私が思う違いを理解するには十分なはずです。

したがって、基本的に実線は関連付けであり、破線/点線は依存関係です。

関連付けは単方向にすることもできます。この場合、1つのクラスは他のクラスと関係を認識しますが、他のクラスは認識しません。このような関連付けには、既知のクラスを指す開いた矢印が必要であり、既知のクラスのみがロール名と多重度を持つことができます。この例では、Customerクラスは購入した任意の数の製品について知っていますが、Productクラスはどの顧客についても何も知りません。多重度「0 .. *」はゼロ以上を意味します。

依存関係は、2つのクラス間の弱い関係であり、点線で表されます。この例では、LineSegmentのdraw()操作がPointクラスを使用するため、PointとLineSegmentの間に依存関係があります。 LineSegmentは、そのタイプの属性がなくても、Pointについて知る必要があることを示します。また、この例では、クラス図を使用してコンテキストで重要なものに焦点を当てる方法も示しています。通常、すべてのクラス操作についてこのような詳細な依存関係を表示する必要はありません。

私の評判は8枚しかないため、画像自体を配置することはできませんが、最初に述べたWebページでそれらを見つけることができます。

[編集]

ここにコード例はありませんが、個人的にどのように説明するかは、車とドアのように簡単です。

車にドア(またはそれ以上)がある場合、それは単なる車です

Car --- has a --> Door

しかし、ドアがある場合開くことができますドアクラスには次のような機能があります

public void openDoor(){
this.open();
}

車の上の機能を使用するには、ドアのインスタンスを作成する必要があります

Class Car(){
Door door1 = new Door();

door1.open();
}

このようにして、依存関係を作成しました。

そのため、実線はobject(1)を別のobject(2)に向けているだけですが、object(1)の使用を開始すると、依存関係になります。

これがうまくいくことを願っています;)

19

点線は、依存関係を示しています(矢印の方向)。ソースコードをクラスごとに別々のファイルとヘッダーにきちんとアセンブルしたと仮定します-ただ、コードには#include ClassB.hという行が含まれているだけです。

しかし、問題の事実は、すべてのクラス関係(一般化、実現、構成、集約、関連付けなど)がすべて依存関係を継承することです。このため、コードを文書化するときに点線の矢印を使用することはありません。可能であれば、より具体的な用語で関係を文書化することを目指します。ダイアモンド、三角形など。正確な関係がわからない場合、開始点は矢印のある実線です((暗黙の)依存関係を持つ)。

それにもかかわらず、点線の矢印表記は、UMLモデリングの他の側面で役立ちます。たとえば、ユースケース分析の要件への依存関係を示します。注:Thought Policeでは、実用的な範囲でインターフェース(純粋な仮想クラス)を使用することで、クラス間の結合と依存関係を減らすことができます。

純粋な仮想クラスは、可能な限り複数の継承とクラス間のすべての緊密なカップリングの見通しを提供します。インターフェイスクラスには、完全にダークマターで作成されているため、警察にはまったく見えないという利点があります。これを念頭に置いて、クラス間で明らかにカップリングがゼロのc ++コードを書くことができます。

5
ANC

さて、あなたは最初の答えを受け入れなかったので。私が試してみましょう。

矢印1:通常の関連付け

enter image description here

UMLにはさまざまな種類の線と矢印があります。上記は単純な関連付け矢印です。つまり、1つのクラスが他のクラスへのリンクを持つことができます。以下に、各タイプのWITHコード例を説明します。

  • 最初の例では、誰が誰を知っているか(関係の所有者)は実際には指定されていないことがわかります。動物can人間と人間を知るcan動物を知る。指定されていないため、プログラマーにとってはあまり役に立ちません。
  • 2番目の例では、アーティストcanにギターがあります。矢印があり、反対側に矢印がないため、ギターわからないアーティストであることがわかります。ギターは完全に単独で存在できるであり、誰も必要としないオブジェクトです。
  • 3番目の例では、結婚が表示されます。本当に簡単です。夫は妻を知っており、妻は夫を知っています。私たちの状況では、夫には妻が1人しかいません。

コードでこれをどのように達成するのですか?通常

class Husband{
    Wife bestWomanInTheWorld;

    public Husband(Wife theWife){
        this.bestWomanInTheWorld = theWife;
    }
}

alwaysには妻が必要なので、コンストラクタにrequired関係を設定します。アーティストcanはギターを持っているため、次のようにコンストラクタを空のままにします。

class Artist{
    List<Guitar> guitars;

    public Artist(){
    }

    public AddGuitarToCollection(Guitar newGuitar){
        Guitars.Add(newGuitar);
    }
}

だから、それがコードでこれを達成する方法です(ほとんどの場合!)。プログラミングに慣れていない場合、通常、さまざまな種類の線と矢印は必要ありません。複雑にしないでおく。

矢印2:依存関係

さて、ほとんどの場合に使用する通常の関連付けについて知っています。しかし、いつ「依存関係」矢印を使用するのでしょうか?さて、依存関係を定義しましょう(ウィキペディア):

Dependency is a weaker form of bond which indicates that one class depends on 
another because it uses it at some point in time. One class depends on 
another if the independent class is a parameter variable or local variable of 
a method of the dependent class. This is different from an association, where 
an attribute of the dependent class is an instance of the independent class. 
Sometimes the relationship between two classes is very weak. They are not 
implemented with member variables at all. Rather they might be implemented as 
member function arguments.

動作するためにclassAへの接続、関係、関連付けなどが存在する必要がある場合;それは依存関係です。例:夫必要存在する妻。車必要車(そしてドライブ)になる車輪。自動車工場必要それからオブジェクトを作成する自動車クラス。 RSSNewsItemクラス必要何かをするためのXMLReaderクラス。

どちらを使用するか?

まあ、これは私の目には唯一の有効な質問です。グーグルはあなたの質問に対する多くの有効な答えを表示するからです。クラス図で依存関係を使用しないでください。これは通常、十分に具体的ではないことを意味します。常に関連付け、実現などを目指します。関係を維持せずに他のクラスを使用する必要がある場合にのみ、実現を使用します(私の意見では)。例;ユーティリティクラス(XMLReaderなど)。

この完全な説明を読んだ後に質問がある場合は、お気軽にお問い合わせください。 :-)

5
zondvloed

あなたの質問は私に自分自身を学ぶ良い機会を与えてくれました、ここに私が見つけたものがあります-

enter image description here

アソシエーション:別のタイプの所有権(例:「A」は「B」を所有)

//@assoc  The Player(A) has some Dice(B)
class Player {
    Dice myDice;
}

依存関係:別のタイプの使用(例:「C」は「D」を使用)

//@dep    The Player(C) uses some Dice(D) when playing a game
class Player {
    rollYahtzee(Dice someDice);
}

ここに私が見つけた鮮明な参照があります- アソシエーションと依存関係

3
J-Dizzle