UML Sınıf Diyagramı İlişkileri
Bu yazıda temel uml sınıf diyagramlarının ilişkileri konusunda bilgilendirileceksiniz.



Öncelikle aşağıdaki resmi inceleyelim:








Yukarıdaki resimde uml sınıf diyagramı ilişkilerini ve gösterimlerini görmektesiniz. Yukarıdaki ilişkilerin okunuşları aşağıdaki gibidir:

Association : class A ile class B biraradalar.
Dependency : class A class B'yi kullanır.
Aggregation : class A class B'ye sahiptir.
Composition : class A class B'yi barındırır.
Inheritance : class B Class A'dır (ya da class A, class B tarafından extend edilmiştir).
Realization : class B Class A'yı realize eder (ya da class A, class B tarafından realize edilir).




Dependency
Bir sınıf bir başka sınıfın nesnesini local değişken olarak kullanıyorsa buna dependency denir. Aşağıdaki kod bir dependency örneğidir:

public class A {
 
    public void doSomething(B b) { // Dependency line 1
        b.getSomething(); // Dependency line 2
    }
}


Bildiğiniz üzere bir methodun parametresi o methodun aynı zamanda local bir değişkenidir. Dolayısıyla yukarıdaki örneğe bakacak olursanız A sınıfı B sınıfının nesnesini local olarak alıp kullanmaktadır. Bu yüzden bu iki sınıf arasındaki ilişkiye dependency denmektedir. Dependency için aşağıdaki örnek de verilebilir:

class A {
    void foo(){
        B b= new B();
        b.bar();
    }
}

class B {
    void bar(){
    }
}


Yukarıdaki örnek de yine B sınıfının nesnesinin local olarak alınması ve kullanılmasını göstermektedir.



Association
Association ortada bir sahibin olmadığı ilişkilere denir. Mesela öğretmen ve öğrenci örneğini ele alalım. Birden fazla öğrenci tek bir öğretmen ile ilişkilendirilebilir. Tek bir öğrenci birden fazla öğretmen ile ilişkilendirilebilir. Dikkat edin, ortada sahip statüsünde bir sınıf(class) yoktur, fakat senaryoya göre diyelim ki birarada kullanılıyorlar. O zaman bu ilişkiye association denir. Kodlama açısından öğrenciye A, öğretmene B dersek association şu şekilde ifade edilebilir:

class A {
    B _b;
    
    public void doSomething(B b) { 
        _b = b;
    }
}
class B { 
    //... 
}



Yukarıda görüldüğü üzere A sınıfı kendi methodunun parametresi aracılığıyla B sınıfının nesnesini field'ına atamaktadır. Association'ı dependency'ye göre kıyaslarsak association'da instance variable(field) kullanımı söz konusu iken dependency ilişkisinde herhangi bir field kullanımı söz konusu değildir. Dolayısıyla diyebiliriz ki dependency ilişkisi association'a göre daha zayıftır.





Yukarıdaki resimde yer alan association yönlü(directed) bir association'dır. Örnekte role diye adlandırılan bir string gözünüze çarpmış olmalı: -oduncAlan Bu string ilişkinin cereyan ediş şeklini, yani bir anlamda olayın rolünü temsil eder. Bu string'in dahil olduğu UML class diyagramının java kod karşılığı aşağıdaki gibidir:

public class Kitap{
   private String baslik;
   private String ISBN;
   private Date tarih;
   private Uye oduncAlan;

   public Book(){
      //...
   }

   public Date iadeTarihiniAl(){
      //...
   }
}


5.satıra bakacak olursanız kritik nokta orasıdır. Rol değişkeni Uye sınıfında değil, Kitap sınıfında yer almaktadır.

Resimdeki örnekte 0..1 yazısını görmüş olmalısınız. Bu yazı ilişkinin multiplicity'sini, yani çokluğunu ifade eder. 0..1 dendiği için denir ki Kitap nesnesi sıfır ya da bir tane üye ile ilişkilidir. Eğer ki bu multiplicity'yi 0..1 değil de mesela * yaparsak sayısız anlamına gelir ki o zaman Kitap nesnesi sayısız üye ile ilişkilidir demiş oluruz. Bu sayısızlığı kod ile ifade etmenin yolu dizi tanımlaması yapmaktan geçer. Şöyle ki;

private Uye oduncAlan[];




Aggregation
Bilirsiniz, bazen bazı nesneler başka nesnelerden oluşur. Örneğin uçak nesnesini ele alalım. Uçak nesnesi kanatlardan, motordan, iniş takımlarından, yakıt deposundan meydana gelen bir nesnedir. Veyahut bir firmadaki takımı düşünecek olursak takım nesnesi birçok personel nesnelerinden oluşabilir. İşte nesnelerin bu şekildeki parça-bütün ilişkisine aggregation denmektedir. Kodlama açısından aggregation'ı tanımlayacak olursak şunu diyebiliriz: Bir sınıfın instance variable'ı(field'ı) başka bir sınıfın nesnesiyse ve herhangi bir methodun parametresi aracılığıyla bu instance variable initialize ediliyorsa buna "aggregation" denir. Aggregation association'a göre daha güçlüdür. Dolayısıyla aggregation'a güçlü association da denir.

public class A {
 
    private B _b;
 
    public void setB(B b) {
       _b = b; 
    }

}


Yukarıda görüldüğü üzere A sınıfı field'ı olan _b'yi setB() methodunun parametresi ile initialize etmiştir.

Burada akla şu soru gelmelidir: Association ile Aggregation kodlama açısından aynı olmadı mı? Eğer association'ın yazısına geri dönecek olursanız aynı olduğunu görebilirsiniz. Fakat işin temelinde ayrıştıkları noktalar var. Neler olduğunu merak ediyorsanız bu yazıyı tamamladıktan sonra bu yazıyı okuyarak farkını öğrenebilirsiniz.



Composition
Aggregation'ının daha güçlü haline Composition denmektedir. Composition'da da parça-bütün ilişkisi vardır, fakat parça ve bütün nesnelerinin ömürleri birbirine sıkı sıkıya bağlıdır. Birinin ölmesi/yok olması/silinmesi diğerini de öldürür/yok eder/siler. Aggregation'da birbirine kenetlenmiş bir ömür bağı yoktur. Compostion'a kod açısından bakılacak olursa bir sınıfın instance variable'ı başka bir sınıfın nesnesi ise ve tanımlanırken aynı zamanda direk initialize edilmişse buna "composition" denir.

public class A {
 
    private B _b = new B(); // _b field'ı direk initialize edilmekte

}


Aşağıdaki her iki kod da yukarıdaki koddan görünüşte farklı görünen fakat uml ilişkisi açısından yine composition olan kodlardır.

public class A {
 
    private B _b;
 
    public A() {
        _b = new B(); // _b field'ı direk initialize edilmekte
    }

}


public class A {
 
    private B _b;
 
    public void doSomethingUniqueToB() {
        if (null == _b) {
            _b = new B(); // _b field'ı direk initialize edilmekte
        }
        return _b.doSomething();
    }

}


Yani eğer bir sınıfın instance variable'ı(field'ı) local bir değişken araya girmeden direk new komutu ile initialize ediliyorsa buna "composition" denir. Eğer initialize işlemine methodun parametresi "aracılığı" girerse, yani local bir değişken araya girerse o zaman o ilişki aggregation olur. Composition ile Aggregation ilişkilerinin kodlama açısından farkı budur. Eğer bu iki ilişki arasındaki mantıksal farkı daha detaylı öğrenmek isterseniz bu yazıyı okuduktan sonra bu yazıyı okuyabilirsiniz.



Inheritance
Inheritance'ın koda yansıyış şekli basittir:

public class A {
 
    ...
 
}
 
public class B extends A {
 
    ....
 
}




Realization
Realization'ının da koda yansıyış şekli basittir:

public interface A {
 
    ...
 
}
 
public class B implements A {
 
    ...
 
}




Yararlanılan Kaynaklar:

Bu yazı 19.07.2015 tarihinde, saat 22:56:45'de yazılmıştır. 01.11.2018 tarihi ve 07:36:30 saatinde ise güncellenmiştir.
Yazar : Hasan Fatih ŞİMŞEK Görüntülenme Sayısı : 6401
Yorumlar
Erkan Ozvatan
Basitçe bir şekilde bu kadar güzel anlatılamazdı. Eline sağlık.
Bu yorum 16.09.2023 tarihinde, saat 08:02:21'de gönderilmiştir.
Yorum Ekle
*
* (E-posta adresiniz yayınlanmayacaktır.)
*
*

#Arşiv


#Giriş

ID :
Şifre :