関連付けと依存関係の違いは?


91

UMLクラス図では、関連付け関係と依存関係の違いは何ですか?

私の知る限り、関連付けは依存関係よりも強い関係ですが、それがどのように強いかはわかりません。

どんな例でも大歓迎です:)

回答:


50

依存関係と関連付けの違いは何ですか?

一般に、関連付けを使用して、クラスのフィールドのようなものを表します。リンクは常にそこにあり、いつでも顧客に注文を求めることができます。実際にはフィールドである必要はありません。よりインターフェイスの観点からモデリングしている場合は、注文の顧客を返すメソッドの存在を示すことができます。

UML Distilledの第3版(現在はリリース済み)から引用すると、「一方の要素(サプライヤー)の定義を変更すると、もう一方の要素(クライアント)も変更される可能性がある場合、2つの要素間に依存関係が存在します」。これは非常にあいまいで一般的な関係であるため、UMLにはさまざまな形式の依存関係に対する多くのステレオタイプがあります。コード用語では、パラメータータイプの命名や一時変数でのオブジェクトの作成などは、依存関係を意味します。

..。


6
マーティンがあなたにとってとても良いのに、なぜ答えるのですか?!+1
Randolpho

5
私にはまだ明確ではありませんが、私が理解したことの1つは、依存関係が関連付けよりもいくらか「弱い」ということです。少なくとも私の見解では、依存関係は依存関係よりも強い言葉ですが、関連付けは依存関係のサブセットのようです。それが混乱の原因だったのかもしれません。
フェリペ

その記事はそれをよく言っています。実際、それは私の考えと一致しています。したがって、ここからいくつかのポイントを引き出します。(1) UML図へのすべての依存関係を表示する必要はありません。多すぎます。あなたは非常に選択的であり、あなたが伝えているものが何であれ重要なものだけを示す必要があります。(2) 2つのクラス間に関連がある場合、依存関係もあります。一般化と同様に、関連付けはそれを意味します。 依存関係を推測するのは明らかですが、他のUML関係のややスーパーセットの関係です
Mahesha999 2014年

1
あなたの説明は実際の例からは程遠いので、ソフトウェアエンジニアでさえ明確な理解を与えませんでした。
softninja 2018年

@ softninja:あなたが理解していなかったことを意味します。他の誰もがそれを受け入れられると思っているようです。ああ、反対票をありがとう。
ミッチウィート

73

協会は、ほとんど常に1つの目的は、フィールド/プロパティ/属性(専門用語が異なる)など、他のオブジェクトを持っていることを意味します。

依存典型的には(常にではない)オブジェクトは、メソッドパラメータとして別のオブジェクトを受け入れるインスタンス化、または他のオブジェクトを使用することを意味します。依存性は非常によって暗示される団体


これは、私が一般的に問題を決定する方法に最も近いものです。他のクラスが私のクラスの状態または動作に実質的な方法で貢献している場合、それは関連付けです。したがって、戦略クラスは、独自の内部状態がない場合でも関連付けになります。他のクラスが単に私のクラスにサービスを提供する場合、それは依存関係です。
ひどいおたまじゃくし

49

OOP用語で:

アソシエーション-> A-Cオブジェクト(メンバー変数として)

依存関係-> AはBを参照します(メソッドパラメーターまたは戻り値の型として)

public class A {
    private C c;
    public void myMethod(B b) {
        b.callMethod();
    }
}

より詳細な回答もあります


1
@Naruto_UzumakiAggregationは全体的な関係です。たとえば、プレイリストと曲。アソシエーション、
ディペンデンシー

UML蒸留することにより、本Martin Fowler氏:「クラスでは、依存関係は、様々な理由のために存在する:一つのクラスは別のメッセージを送信し、一つのクラスは、そのデータの一部として別のものを持っている。一つのクラスは、操作のパラメータとして、別の言及」
アフマドAbdelghany

24

依存関係は、String(JavaではC#、stringはオブジェクトであるため)をパラメーターとして受け取るメソッドを定義する場合と同様であり、クラスはStringクラスに依存します。

関連付けは、クラスの属性として文字列を宣言する場合と似ています。次に、コードは文字列クラスに関連付けられます。

String name = null //: is a association.

「関連付けは、クラスの属性として文字列を宣言するときのようなものです。その後、コードは文字列クラスに関連付けられます。」その場合、関連付けと構成の違いは何ですか?
ディーン

16

依存関係-クラスの変更は、その依存クラスの変更に影響します。例-CircleはShape(インターフェース)に依存しています。Shapeを変更すると、Circleにも影響します。したがって、CircleはShapeに依存しています。

アソシエーション-2つのオブジェクト間に特定の関係があることを意味します

(1対1、1対多、多対多)

関連付けには2つのタイプがあります-

  1. 組成
  2. 集約

    1)構成-2つのオブジェクト間のより強い関連または関係。別のクラスA内にクラスBのオブジェクトを作成しています

 public class A {
       B b;
       public void setB(){
         this.b= new B();
        }
     }

クラスAを削除すると、Bは存在しなくなります(BオブジェクトはA内にのみ作成されます)。

別の例-Body&Liver.LiverはBodyの外に存在できません。

2)集約-2つのオブジェクト間の弱いタイプの関連付け

public class A {       
             B b;
             public void setB(B b_ref){
                 this.b= b_ref;   
                /* object B is passed as an argument of a method */
              }
   }

クラスAを削除しても、Bは外部に存在します(Bは外部で作成され、クラスAに渡されます)

この別の例-Man&Car。人は車を持っていますが、人と車は独立して存在します。


依存関係はローカルスコープであり、関連はクラススコープです。
dimpiax 2018年

10

ここで:「アソシエーションvs.ディペンデンシーvs.アグリゲーションvs.コンポジション」では、UMLクラス図とコードスニペットを備えた素晴らしいベードメカムがあります。著者は私たちに関係のリストを与えます:1つの場所での関連、依存、集約、構成。


1
私はこの定義が好きです。関連付けは次のとおりです。私(別のクラスを参照するクラス)はオブジェクトへの参照を保持しているだけで、それを使用せず、そのクラスのメンバーは私には興味がありません。依存関係は次のとおりです。私はいくつかのメンバーを使用しているため、参照されるクラスが変更されると、私に影響を与える可能性があります。それが正しければ、それは理解しやすかったです!
robsch 2014

1
私があなたのコメントを読んだときに頭に浮かんだ最初の質問:関連付けの場合-なぜオブジェクトへの参照を保持し、それを使用しないのですか?参照が単なるフィールドであり、クライアントが参照について知りたい場合にのみ返されるという意味ですか?
H.Rabiee 2017

3

依存関係は非常に一般的であり、複雑さを軽減することは、依存関係を可能な限り減らすことです。

関連付けは、強力な(静的な)依存関係です。集約と構成はさらに強力です。


-1

アソシエーションとは、あるオブジェクトが別のオブジェクトへのリンクを持ち、リレーショナルオブジェクトメソッドを使用しない場合です。たとえばルビーの場合

class User
  has_one :profile
end

user = User.first
profile = user.profile
profile.sign_out

これは、ユーザーからプロファイルオブジェクトを取得できるが、ユーザーは自分の内部でプロファイルのメソッドを使用しないことを意味します(プロファイルのインターフェイスに依存しません)。

依存関係とは、ユーザーが別のオブジェクトにリンクし、そのオブジェクトのメソッドを自分の内部で呼び出すことを意味します

class User
  has_one :profile

  def personal_info
    profile.info
  end
end

ここで、プロファイルのinfoメソッドが変更または名前変更される場合は、依存ユーザークラスも変更する必要があります。


この情報をどこから入手したかを教えてください。UML仕様には、関連付けの一方の側がもう一方の側のメソッドを使用しないという規則はないと思います。一般に、関連付けは依存関係よりも強い関係です。
Geert Bellekens

@GeertBellekens私が理解しているように、依存関係は、サプライヤークラスの変更にはクライアントクラスの変更が必要であることを示す必要があります。プログラミングでは、これはサプライヤーのインターフェースを使用している場合のみです(または別の理由を表示してください)。あなたの観点からは、この矢印に違いはありません。それらはコードの実装を指しているのではなく、単に概念的なものです。
stopanko

それはあなたの個人的な理解ですが、UML仕様でどのように記述されているかではありません。UML2.5§7.8.4.1から:依存関係は、単一のモデル要素またはモデル要素のセットが仕様または実装のために他のモデル要素を必要とすることを意味する関係です。これは、clientElementの完全なセマンティクスが、意味的または構造的にサプライヤ要素の定義に依存していることを意味します。
Geert Bellekens
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.