UML sınıf şeması notasyonları: İlişkilendirme, Toplama ve Kompozisyon arasındaki farklar


39

UML sınıf diyagramlarının bazı notasyonları hakkında kafam karıştı.

görüntü tanımını buraya girin

Birliğin ne anlama geldiğini bildiğimden eminim . Bir sınıfın örneğinin, çalışmasını gerçekleştirmek için ikinci sınıfın bir örneği hakkında bilmesi gereken iki sınıfın örnekleri arasındaki herhangi bir ilişki - bir İlişki ilişkisidir. Bir Dernek, genellikle A sınıfının B sınıfı örneğine referansı (alanı) olduğu anlamına gelir.

Ancak, Toplama ve Kompozisyon oklarının ne anlama geldiğini anlamakta sorun yaşıyorum . Kafamın bir kısmı bu gösterimlerin farklı tanımları ile karşılaştığım oldu.

Toplama gösterimindeki iki tanım :

Tanım 1: A sınıfı bir örneği her iki sınıf arasındaki bir Toplama notasyonu uygun bir koleksiyon tutan (her ne mesela bir listesi, Array) B sınıfının örnekleri.

Tanım 2: İki sınıf arasındaki bir birleştirme bağlantısı, A sınıfı bir B sınıfı örneğine referansta bulunursa ve B örneği A örneğinin yaşam döngüsüne bağlıysa uygundur . Anlamı: A sınıfı örneği silindiğinde, B sınıfı örneği de geçerli olur. B sınıfı örneği, A sınıfının örneğine zıt olarak tamamen A sınıfının örneğini içerir. B sınıfı (bu normal bir dernektir).

Kompozisyon notasyonunun ne anlama geldiği ve Toplama notasyonundan ne kadar farklı olduğu konusunda, emin değilim.

Lütfen tanımları netleştirin ve anlamama yardımcı olun. Somut örnekler memnuniyetle karşılanacaktır.


Tanım 2, Toplama yerine Kompozisyon tanımına benziyor. Tanımı 1 oldukça doğru geliyor.
jbx

Yanıtlar:


32

Üç bağlantı Birlik, Toplama ve Kompozisyon, iki sınıfın birbiriyle ne kadar yakından ilgili olduğu konusunda bir tür ölçek oluşturur.

Ölçeğin bir ucunda, iki sınıfın nesnelerinin birbirini tanıyabildiği, ancak birbirlerinin ömrünü etkilemedikleri bir Ortaklık vardır. Nesneler bağımsız olarak bulunabilir ve hangi A sınıfı nesnesi, B sınıfı hangi nesnelerin zaman içinde değişebileceğini bilir.

Ölçeğin diğer ucunda Kompozisyon vardır. Kompozisyon, B sınıfı A sınıfının ayrılmaz bir parçası olduğu için kısmen bütün bir ilişkiyi temsil eder. Bu ilişki tipik olarak, A sınıfı nesneler B sınıfı nesneye sahip olmadan mantıksal olarak var olamazlarsa kullanılır.

Toplanma ilişkisi bu iki uç arasında bir yerdedir, ancak hiç kimse tam olarak nerede olduğu konusunda hemfikir değildir, bu nedenle Topluluğun ne anlama geldiğine dair evrensel olarak kabul edilmiş bir tanım da yoktur. Bu anlamda bulduğunuz her iki tanım da doğrudur ve 10 kişiye sorarsanız, 11 farklı tanım alma riskiniz vardır.


1
Cevabınız için teşekkürler. İşte bazı şeyleri nasıl anladığımı, lütfen bunun makul bir tanım olup olmadığını söyleyin. 1- İlişkilendirme, bir A nesnesinin işlevini yerine getirmek için bir B nesnesi hakkında bilgi sahibi olması gerektiğinde yapılır. 2- Hem Toplama hem de Kompozisyon, bir 'sahiplik' ilişkisini tanımlar - A sınıfı örneği Kavramsal olarak B sınıfı örneğine sahiptir. Ancak B örneğinin ömrü A örneğinin ömründen bağımsızdır. Örneğin, çalışanların bulunduğu bir bölüm. Departman, bir çalışan örneğine sahipti, ancak bölüm olmadan yaşamaya devam edecek. Kompozisyon, Toplama gibidir, ancak
Aviv Cohn,

1
B örneğinin ömrü A örneğinin ömrüne bağlıdır. Daha güçlü bir 'sahiplik' ilişkisi. Örneğin: Bir araba ve bir tekerlek. Otomobil tekerleği 'tamamen içeriyor'. Wheel örneği, onu içeren Car örneği olmadan yaşamaya devam etmez. Bu makul bir farklılaşma mıdır?
Aviv Cohn,

@Prog: Evet, bu makul bir tanımdır. Sadece başkalarının bu tanımı paylaşmayabileceğini ve onlara toplama kullanımınızı açıklamanız gerekebileceğini unutmayın.
Bart van Ingen Schenau 09.04:

Toplama notasyonu için en yaygın tanım ne dersiniz? Kullandığım tanım? 'Bir koleksiyona sahip' tanımı var mı? Başka bir şey?
Aviv Cohn,

Aşağıdaki OMG standardına yapılan atıf öğreticidir. Dernek ve kompozisyon oldukça basittir. Toplanma titrek olanıdır. Uygulamada, testin 'kısmının' iyi çalıştığını görüyorum ('sahiplik' düşünmek için en uygun yoldur). Bir kişi bir kulübün parçası olabilir, bu yüzden bir kulüp insanları bir araya getirir (kendilerine ait değildir). Kulüp yok edildiğinde insanlar var olmaya devam ediyor.
Huliax

10

Kompozisyon ne zaman bir object Aiçerir object Bve object Aaynı zamanda oluşturmaktan da sorumludur object B.

Kompozisyon ilişkisi

B sınıfı tarafından kullanılacak A sınıfı var.

final class A
{
}

Kompozisyonun nasıl göründüğü gibi çok sayıda seçenek vardır.

Doğrudan başlatma bileşimi:

final class B
{
    private $a = new A();
}

Oluşturucu başlatma bileşimi

final class B
{
    private $a;

    public function __construct()
    {
        $this->a = new A();
    }
}

Tembel başlatma kompozisyonu

final class B
{
    private $a = null;

    public function useA()
    {
        if ($this->a === null) {
            $this->a = new A();
        }

        /* Use $this->a */
    }
}

Bunun sınıflar Ave arasında sıkı bir ilişki yarattığını görüyorsunuz B. Sınıf, Bbasitçe var olamaz A. Bu çok büyük bir ihlalidir bağımlılık enjeksiyon prensibine diyor:

Bağımlılık kullanılabilecek bir nesnedir (bir servis). Bir enjeksiyon, bir bağımlılığın, onu kullanacak olan bağımlı bir nesneye (bir müşteriye) geçmesidir. Servis müşterinin durumunun bir parçası. Bir müşterinin hizmeti oluşturmasına veya bulmasına izin vermek yerine, servisi müşteriye geçirmek, modelin temel gereksinimidir.

Kompozisyon bazen new DateTimephp veya new std::vector<int>C ++ ile arama gibi anlamlıdır . Ancak çoğu zaman, kod tasarımınızın yanlış olduğu bir uyarıdır.

class AÖnbelleğe almak için kullanılan özel bir nesnenin olacağı bir durumda, class Buygulamanın kullanılmasıyla her zaman önbelleklenir class Ave dinamik olarak değiştirmeyi kontrol edemezsiniz; bu kötüdür.

Ayrıca, tembel başlatma kompozisyonunu kullandıysanız , yani bir çalışmanızın object B, useA()yöntem denilen ve yaratmanın object Abaşarısız olacağı anlamına gelir object B, aniden işe yaramazsınız.


Öte yandan, bir araya getirme, DI ilkesini izleyen bir ilişki biçimidir . object Bkullanımına ihtiyaç object A, o zaman zaten oluşturulmuş örneğini geçmelidir object Aiçin object Bve oluşturulması gerektiğini object Agüzünde şey ilk etapta devredilecek.

Kısacası, Toplama bağımlılık enjeksiyon prensibi için UML temsilidir , yapıcı enjeksiyon, ayarlayıcı enjeksiyon veya genel özellikli enjeksiyon.

Bunların hepsi Toplamalar

En sıkı yapıcı enjeksiyonu ( object Bonsuz yapılamaz object A).

final class B
{
    private $a;

    public function __construct(A $a)
    {
        $this->a = $a;
    }
}

Daha gevşek ( object Aiçinde kullanabilir veya kullanmıyor olabilirsiniz object B, ancak yaparsanız önce onu ayarlamanız gerekir).

Setter ile:

final class B
{
    private $a;

    public function setA(A $a)
    {
        $this->a = $a;
    }
}

Genel mülk aracılığıyla:

final class B
{
    public $a;
}

Kompozisyon üzerinde Toplama kullanımını haklılaştırmanın gerçekten harika bir yolu yoktur, eğer kullanıyorsanız hepsi sınıfların somut uygulamaları ise, ancak bir kez arayüzleri enjekte etmeye başladığınızda veya C ++ özet sınıfları durumunda, birdenbire toplanmanın tek yolu bu olacaktır. sözleşmesini yerine getirmek.


1
Kod örnekleri görmek gerçekten yardımcı oluyor! Kodsuz İngilizce açıklamaların hepsi çok belirsiz ve öznel görünüyor.
Niko Bellic

1

Ek olarak, mevcut UML standardının bir kısmı:

11.5.4 Dernekler - Anlambilim - Gösterim

[...] İkili bir Birliğin aggregation = AggregationKind :: shared veya aggregation = AggregationKind :: composite ile bir ucu olabilir. Bir ucu agregasyon = olduğunda AggregationKind :: ortak bir çukur elmas agregasyon = AggregationKind işaretli sona :: paylaşılan ters Derneği hattının sonundaki bir terminal süsleme olarak ilave edilir. Elmas, Dernekler için kullanılan elmas göstergesinden belirgin şekilde daha küçük olacaktır. Topluluğa sahip bir Dernek = AggregationKind :: composite aynı şekilde karşılık gelen uçta bir elmasa sahiptir, ancak elmasın doldurulmasında farklıdır . […]

9.5.4 Sınıflandırma - Özellikler - Gösterim

[…] Bazen bir Mülkiyet, bir vakanın bir dizi vakayı bir arada gruplamak için kullanıldığı durumları modellemek için kullanılır; buna toplama denir. Bu tür koşulları temsil etmek için, bir Özellik, AggregationKind türünde bir toplama özelliğine sahiptir; tüm grubu temsil eden örnek Mülk sahibi tarafından sınıflandırılır ve gruplandırılmış bireyleri temsil eden örnekler Mülkiyet türüne göre sınıflandırılır. AggregationKind, aşağıdaki hazır değerleri içeren bir numaralandırmadır:

  • none : Mülkiyetin toplama anlambilgisi olmadığını gösterir.
  • Paylaşılan : Mülkiyetin toplama anlambilimi paylaştığını belirtir. Paylaşılan toplamanın kesin anlambilimi, uygulama alanına ve modelleyiciye göre değişir.
  • Kompozit : Mülkiyetin kompozit bir şekilde toplandığını, yani kompozit nesnenin oluşan nesnelerin varlığı ve depolanmasından sorumlu olduğunu belirtir (bkz. 11.2.3'te parçaların tanımına bakınız). Kompozit toplama, bir kerede en fazla bir kompozit nesneye dahil edilmesi için bir parça nesnesi gerektiren güçlü bir toplama şeklidir. Bileşik bir nesne silinirse, nesne olan tüm parça örnekleri onunla silinir.

[...]


0

Stackoverflow hakkında zaten bir cevap gönderdim .

Temel olarak, bir toplama basit bir ilişkiden daha güçlüdür, ancak birleştirilmiş nesneler basit bir ilişkide olduğu gibi birbirleri olmadan "yaşamaya" devam edebilirler.

Bir bileşim, bir toplamadan daha güçlüdür, çünkü birleştirilmiş sınıf diğer sınıflar tarafından birleştirilemez. "Yaşam" kabına bağlıdır.

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.