İlişki ve bağımlılık arasındaki fark?


91

Bir UML sınıf diyagramında, bir ilişki ilişkisi ile bir bağımlılık ilişkisi arasındaki fark nedir?

Bildiğim kadarıyla, bir dernek bağımlılıktan daha güçlü bir ilişkidir, ancak ne kadar güçlü olduğundan emin değilim.

Herhangi bir örnek memnuniyetle karşılanır :)

Yanıtlar:


50

Bağımlılık ve çağrışım arasındaki fark nedir? :

Genel olarak, bir sınıftaki bir alan gibi bir şeyi temsil etmek için bir ilişkilendirme kullanırsınız. Bağlantı her zaman oradadır, çünkü her zaman müşterisi için sipariş isteyebilirsiniz. Aslında bir alan olması gerekmez, daha arayüz perspektifinden modelleme yapıyorsanız, sadece siparişin müşterisini döndürecek bir yöntemin varlığını gösterebilir.

UML Distilled'in 3. baskısından alıntı yapacak olursak (şimdi yeni çıktı) "bir elemanın (tedarikçi) tanımındaki değişiklikler diğerinde (müşteri) değişikliklere neden olabilirse, iki eleman arasında bir bağımlılık vardır". Bu çok belirsiz ve genel bir ilişkidir, bu nedenle UML'nin farklı bağımlılık biçimleri için bir dizi stereotipi vardır. Kod terimleriyle, bir parametre türünü adlandırmak ve geçici bir değişkende bir nesne oluşturmak gibi şeyler bir bağımlılık anlamına gelir.

...


6
Martin bunu sizin için çok daha iyi yaptığında neden cevap veresiniz ?! +1
Randolpho

5
Henüz benim için çok net değil, ama anladığım bir şey, bağımlılıkların derneklerden biraz 'daha zayıf' olduğuydu. Görünüşe göre, dernekler, en azından benim görüşüme göre, bağımlılık çağrışımdan daha güçlü bir sözcük olsa da, bağımlılıkların bir alt kümesi . Bu kafa karışıklığının kaynağı olabilir.
Felipe

Bu makale bunu iyi söylüyor. Aslında düşüncelerimle örtüşüyor. Buradan bazı noktalara değinelim: (1) Bir UML diyagramına her bağımlılığı göstermek istemezsiniz - çok fazla vardır. Çok seçici olmanız ve sadece iletişim kurduğunuz şey için önemli olanları göstermeniz gerekir. (2) İki sınıf arasında ilişki varsa, bir de bağımlılık vardır. İlişkilendirme, bir genelleme gibi onu ima eder. Bağımlılık sonucuna
varmak

1
Açıklamanız gerçek dünya örneklerinden çok uzak, bu nedenle yazılım mühendislerine bile net bir anlayış vermedi.
softninja

@ softninja: Anlamadığınızı söylüyorsunuz. Görünüşe göre herkes bunu kabul edilebilir buluyor. Oh ve olumsuz oy için teşekkürler.
Mitch Wheat

74

Bir ilişkilendirme hemen hemen her zaman bir nesnenin diğer nesneye alan / özellik / öznitelik olarak sahip olduğu anlamına gelir (terminoloji farklıdır).

Bir bağımlılık genellikle (ama her zaman değil) bir amacı, yöntem parametresi, başlatır gibi bir başka nesne kabul ya da başka bir nesneyi kullanan ifade eder. Bir bağımlılık çok bir ima edilmektedir birlikte .


Bu, meseleye genel olarak karar verme şeklimle en yakın olanı. Diğer sınıf, sınıfımın durumuna veya davranışına önemli bir şekilde katkıda bulunursa, o zaman bu bir ilişkilendirmedir. Bu nedenle strateji sınıfları, kendi iç durumları olmasa bile ilişkilendirmeler olacaktır. Diğer sınıf sadece sınıfıma bir hizmet sağlıyorsa, bu bir bağımlılıktır.
Terrible Kurbağa yavrusu

49

OOP açısından:

İlişkilendirme -> A'nın bir C nesnesi vardır (üye değişkeni olarak)

Bağımlılık -> A referansları B (bir yöntem parametresi veya dönüş türü olarak)

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

Bir de bulunmaktadır daha detaylı cevap .


1
@Naruto_Uzumaki Aggregation, bir bütün-parça ilişkisidir. Örneğin bir Çalma Listesi ve Şarkı. İlişkilendirme, Bağımlılık ve Toplama arasındaki daha geniş bir farklılaşma için lütfen diğer
yanıtımı

Gönderen UML Damıtmalı kitabından Martin Fowler : "sınıfları ile, bağımlılıklar çeşitli nedenlerle vardır: Bir sınıfın diğerini bir mesaj gönderir; bir sınıf verilerinin bir parçası olarak başka sahiptir, biri sınıf bir operasyon parametre olarak başka bahseder"
Ahmed Abdelghany

24

Bağımlılık, bir String'i (Java'da, C #, dize, içlerinde bir nesne olduğu için) parametre olarak alan bir yöntemi tanımladığınızda olduğu gibidir, o zaman sınıfınız String sınıfına bağımlıdır.

İlişkilendirme, bir dizeyi sınıfınızda bir öznitelik olarak bildirdiğiniz zamanki gibidir. daha sonra kodunuz dize sınıfıyla ilişkilendirilir.

String name = null //: is a association.

"İlişkilendirme, bir dizeyi sınıfınızda bir öznitelik olarak bildirmeniz gibidir. Daha sonra kodunuz dize sınıfıyla ilişkilendirilir." Durum böyleyse, ilişkilendirme ve kompozisyon arasındaki fark nedir?
Dean P

16

Bağımlılık - Bir sınıftaki bir değişiklik, bağımlı sınıftaki değişikliği etkiler. Örnek- Circle, Shape'e (bir arayüz) bağlıdır. Şekli değiştirirseniz, Circle da etkiler. Yani Circle'ın Shape'e bağımlılığı vardır.

İlişkilendirme - 2 nesne arasında belirli bir ilişki olduğu anlamına gelir

(bir-bir, bir-çok, çok-çok)

İlişkilendirme 2 çeşittir-

  1. Kompozisyon
  2. Toplama

    1) Kompozisyon - 2 nesne arasındaki daha güçlü İlişki veya ilişki. Başka bir A sınıfı içinde B sınıfı bir nesne oluşturuyorsunuz

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

A sınıfını silersek, B mevcut olmayacaktır (B nesnesi yalnızca A içinde oluşturulur).

Başka bir örnek -Beden ve Karaciğer. Karaciğer, Vücut dışında var olamaz.

2) Agregasyon - zayıf tipi Derneği 2 nesneler arasında.

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 sınıfını silseniz bile, B dışarıda olacaktır (B dışarıda yaratılır ve Sınıf A'ya geçer)

Bunun başka bir örneği - Man & Car. İnsanın bir Arabası vardır ama İnsan ve Araba bağımsız olarak var olur.


Bağımlılık, İlişkilendirmenin sınıf kapsamı olduğu yerel kapsamdır.
dimpiax

10

Burada: "İlişkilendirme, Bağımlılık, Birleştirme ve Bileşim" , uml sınıfı diyagramları ve kod parçacıkları içeren harika bir vade mecumunuz var. Yazar bize bir ilişki listesi veriyor: Tek bir yerde İlişkilendirme, Bağımlılık, Toplama, Kompozisyon.


1
Bu tanımı beğendim. İlişkilendirme şudur: Ben (başka bir sınıfa başvuran sınıf) bir nesneye referansta bulunuyorum, onu kullanmıyorum ve o sınıfın üyeleri benim için ilginç değil. Bağımlılık şudur: Bazı üyeler kullanıyorum, bu nedenle referans verilen sınıf değişirse beni etkileyebilir. Doğru anladıysam, anlaması kolaydı!
robsch

1
Yorumunuzu okuduğumda aklıma gelen ilk soru: ilişkilendirme durumunda - neden bir nesneye atıfta bulunulsun ve kullanılmasın? Referansın sadece bir alan olduğunu, sadece bir müşteri referansı öğrenmek istediğinde döndürüleceğini mi söylüyorsunuz?
H.Rabiee

3

Bağımlılık çok geneldir ve karmaşıklığı azaltmak, bağımlılıkları olabildiğince azaltmakla ilgilidir.

Bir ilişki güçlü (statik) bir bağımlılıktır. Toplama ve Bileşim daha da güçlüdür.


-1

İlişkilendirme , bir nesnenin diğeriyle yalnızca bir bağlantısı olduğu ve ilişkisel nesne yöntemlerini kullanmadığı zamandır. Örneğin yakut için

class User
  has_one :profile
end

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

Bu, kullanıcıdan bir profil nesnesi alabileceğiniz, ancak kullanıcının kendi içinde profilin yöntemlerini kullanmadığı anlamına gelir (Profilin arayüzüne bağımlı değildir).

Bağımlılık , Kullanıcının başka bir nesneye bağlantısı olduğu ve bu nesnenin yöntemlerini kendi içinde çağırdığı anlamına gelir.

class User
  has_one :profile

  def personal_info
    profile.info
  end
end

Profilin bilgi yöntemi değiştirilecekse veya yeniden adlandırılacaksa, Bağımlı Kullanıcı sınıfımızın da değiştirilmesi gerekir.


Bu bilgiyi nereden aldığınızı belirtebilir misiniz? UML özelliklerinde, bir ilişkinin bir tarafının diğer tarafın yöntemlerini kullanmadığını söyleyen bir kural olduğunu sanmıyorum. Genel olarak bir ilişki, bir bağımlılıktan daha güçlü bir ilişkidir.
Geert Bellekens

@GeertBellekens Anladığım kadarıyla, Bağımlılığın bir tedarikçi sınıfındaki değişikliklerin bir müşteri sınıfında değişiklik gerektireceğini göstermesi gerekiyor. Programlamada bu yalnızca tedarikçinin bir arayüzünü (veya başka bir neden göster) kullandığınızda gerçekleşir. Sizin bakış açınızdan bu oklarda hiçbir fark yok. Kod uygulamasına işaret etmiyorlar ve sadece kavramsal.
stopanko

Korkarım bu sizin kişisel anlayışınız, ancak UML özelliklerinde nasıl tanımlandığı değil. UML 2.5 § 7.8.4.1'den: Bir Bağımlılık, tek bir model
Geert Bellekens
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.