Java ve İlişkiler

Nesne yönelimli programlama dersinin asistanlığını yapıyorum. Bu bağlamda sorular geliyor. En son Nesne Yönelimli Programlama'da Association, Composition ve Aggregation kavramları soruldu. Bu kavramları kodumuzda kullanıp kullanmadığımızı nasıl anlarız? Bu soruyu ortada bırakmak şartıyla, bu kavramların tanımlarını yapmaya çalışayım.

Association (Birliktelik): İki sınıf arasındaki yapısal ilişkiye verilen isim. Herhangi bir dereceye sahip olacak şekilde aralarında ilişki bulunan sınıflar bu birlikteliğe sahip olurlar. UML gösteriminde düz bir çizgi ile temsil edilmektedir. Bu ilişki bize o iki sınıf arasında mesaj alışverişini sağlayan bir kanalın olduğunu anlatır. Burada Java'da mesaj alışverişinin metot çağrımlarıyla gerçekleştiğini hatırlatmak gerekir. Birliktelikler genellikle referanslar ile gerçekleştirilir.

Aggregation (Münasebet): "Sahip olma" ("possession") ilişkisini temsil eden özel bir birlikteliktir. Dairesel olmama koşulu vardır. Bunun anlamı nesne kendisiyle münasebet kuramaz. Bu yüzden münasebet çizge değil, ağaç yapısı oluşturur. Aggregation "has-a" ilişkisidir. Her iki nesne de kendi bağımsız varoluşlarına sahiptir.

Composition (Oluşum): Sahiplik ("ownership") modellemesi için kullanılan özel bir birliktelik türüdür. Aggregation'a benzer ama tek farkı Bütün-Parça ilişkisini temsil etmesi ve parçanın kendi bağımsız varlığına sahip olmayışıdır. Bütünün varlığını temsil eden nesne ayrıca parçanın da yaşamından sorumludur. Oluşum "contains-a" ilişkisi olarak anlaşılmalıdır. Münasebete benzer olarak oluşum da Ağaç yapısı oluşturur, çizge değil ve dairesel olamaz.

Aggregation-Composition arasındaki farklar

  • Aggregation "has-a" (var) ilişkisidir, Composition "contains-a" (içerir) veya "bütün-parça" ilişkisi
  • Aggregation'da iki nesne de kendi bağımsız varoluşlarına devam ederler, Composition'da parça'nın ömrü bütün nesnesiyle temsil edilir.
  • Composition'ın daha güçlü ilişki olmasına karşın Aggregation daha gevşek bir ilişkidir.
  • UML'de Aggregation işi boş köşegen ve düz çizgi, composition dolu köşegen ve düz çizgi ile gösterilir.
  • Composition ilişkisindeki "parça"nın sadece bir "bütün"ü olabilir. Aggregation kapsanan tarafta 0..* derecesine sahip olabilir.
Bir bağlantıda Araba örneği üzerinden Composition ve Aggregation arasındaki farkı şöyle anlatıyordu:
Bir örnek Arabadır. Araba Parçalarından oluşur. Bu parçalara sahiptir. Eğer bir Parça yoksa araba bozuktur. Araba Parçalarıyla Composition oluşturur.

Ayrıca Arabanın Yolcuları vardır. Yolcular Arabanın Parçası değildir. Eğer bir Yolcu yoksa Araba bozuk değildir. Araba Yolcularına sahip değildir. Araba'da değillerse başka bir yerdedirler. İlişki geçicidir. Yolcular gelir ve gider. Araba ve Yolcular arasında Aggregation ilişkisi vardır.


Her iki ilişki aslında compositiondır. Arabanın hem Parçaları hem de Yolcuları vardır. Farklılık süresindedir. Parçalarla olan ilişki daimidir, Yolcularla olan ilişki geçicidir.

Kaynaklar:
http://faq.javaranch.com/view?AssociationVsAggregationVsComposition
http://ootips.org/uml-hasa.html
http://www.javaworld.com/javaworld/jw-06-2001/jw-0608-java101.html
http://geekexplains.blogspot.com/2008/07/composition-vs-aggregation-whats.html
http://www.bilgisayarkavramlari.com/2008/12/20/birliktelik-munasebet-ve-olusum-association-aggregation-and-composition/
http://stackoverflow.com/questions/1384426/distinguishing-between-delegation-composition-and-aggregation-java-oo-design
http://www.coderanch.com/t/468736/Java-General/java/Aggregation-Java

4 yorum:

Unknown dedi ki...

Yararlı ve aydıntlatıcı olmuş. Teşekkürler hocam.

Cagdas dedi ki...

Örnek kod var mı diyecektim ki zaten verdiğiniz linklerde varmış. Çok teşekkürler.

Abdulkadir Selcukoglu dedi ki...

Emeginize saglik... Cok yararli oldu..

Adsız dedi ki...

en iyi açıklama diyebilirim. eline sağlık