Menu
CoddyTech

Agregasyon vs Kompozisyon

Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 48 / 87.

Hem toplama hem de bileşim, “sahiptir” ilişkilerinin biçimleridir; ancak önemli bir açıdan farklılık gösterirler: sahiplik ve yaşam döngüsü bağımlılığı.

Bileşimde, içerilen nesne kapsayıcıdan bağımsız olarak var olamaz. Kapsayıcı yok edildiğinde parçaları da yok olur. Bir House ve onun Room nesnelerini düşün: odalar ev olmadan var olmaz:

class House {
    private Room[] rooms;
    
    public House(int numRooms) {
        rooms = new Room[numRooms];
        for (int i = 0; i < numRooms; i++) {
            rooms[i] = new Room();  // House, odaları oluşturur ve onlara sahip olur
        }
    }
}

Aggregation'da, içerilen nesne bağımsız olarak var olabilir. Kapsayıcı nesneyi kullanır ancak yaşam döngüsünü kontrol etmez. Bir Team ve onun Player nesnelerini düşün: oyuncular takım olmasa da var olabilir:

class Team {
    private List<Player> players;
    
    public Team() {
        players = new ArrayList<>();
    }
    
    public void addPlayer(Player player) {
        players.add(player);  // Team mevcut oyuncuları kullanır
    }
}

Temel fark: bileşimde kapsayıcı, parçalarını kendi içinde oluşturur. Birleştirmede nesneler dışarıdan aktarılır. Bir Team silindiğinde Player nesneleri hâlâ var olur. Bir House silindiğinde, Room nesneleri de silinir.

challenge icon

Görev

Kolay

Hem aggregation hem de composition kavramlarını gösteren bir üniversite ders sistemi oluşturalım. Bir Course nesnesinin kendi Lecture nesnelerine sahip olduğunu (composition), bağımsız olarak var olan Professor nesnelerine ise yalnızca referans verdiğini (aggregation) göreceksin.

Kodunu dört dosyaya ayıracaksın:

  • Professor.java: Herhangi bir dersten bağımsız olarak var olabilen bir profesörü temsil eden bir sınıf oluştur. Bir Professor sınıfının iki özel alanı vardır: name (String) ve department (String). Her iki alanı da başlatmak için bir kurucu ve her biri için getter metotları ekle. toString() metodunu, şunu döndürecek şekilde override et: Prof. [name] ([department])
  • Lecture.java: Yalnızca bir ders kapsamında anlam ifade eden bir konferansı temsil eden bir sınıf oluştur. Bir Lecture sınıfının iki özel alanı vardır: topic (String) ve durationMinutes (int). Bir kurucu ve getter metotları ekle. toString() metodunu, şunu döndürecek şekilde override et: Lecture: [topic] ([durationMinutes] min)
  • Course.java: Her iki ilişkiyi de burada göstereceksin! Bir Course sınıfının üç özel alanı vardır: title (String), professor (Professor - aggregation) ve lectures (Lecture nesnelerinden oluşan bir dizi - composition).

    Kurucu; ders başlığını, bir Professor nesnesini (dışarıdan aktarılır - aggregation) ve konferans sayısını alır. Kurucunun içinde Lecture dizisini oluştur ve yeni Lecture nesneleriyle doldur. i indeksindeki her konferans için, konusunu "Topic " + (i + 1) ve süresini 45 dakika olarak belirleyerek oluştur. Bu nesnelerin içeride oluşturulması composition kavramını gösterir.

    Birden fazla satırdan oluşan bir String döndüren getInfo() metodunu ekle:

    Course: [title]
    Instructor: [professor.toString()]
    Lectures: [number of lectures]

    Ayrıca her konferansın toString() sonucunu ayrı bir satırda içeren bir String döndüren listLectures() metodunu da ekle.

  • Main.java: Her şeyi bir araya getir! Dört girdi alacaksın: profesörün adı (String), profesörün bölümü (String), ders başlığı (String) ve konferans sayısı (int).

    Önce, verilen ad ve bölümle bir Professor oluştur. Bu profesör bağımsız olarak var olur. Ardından başlığı, profesörü (aggregation) ve konferans sayısını aktararak bir Course oluştur (ders, kendi konferanslarını içeride oluşturacak - composition).

    getInfo() sonucunu yazdır, ardından boş bir satır yazdır ve sonra listLectures() sonucunu yazdır.

Dört girdiyi sırasıyla alacaksın: profesörün adı, bölüm, ders başlığı ve konferans sayısı.

Temel farka dikkat et: Professor dışarıda oluşturulur ve Course nesnesine aktarılır (aggregation: profesör başka dersler de verebilir veya bu ders olmadan da var olabilir). Lecture nesneleri ise Course kurucusunun içinde oluşturulur (composition). Bunlar yalnızca bu derse aittir ve bu ders olmadan var olmazlar.

Kendin dene

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Girdileri oku
        String professorName = scanner.nextLine();
        String department = scanner.nextLine();
        String courseTitle = scanner.nextLine();
        int numberOfLectures = scanner.nextInt();
        
        // TODO: Bir Professor nesnesi oluştur (bağımsız olarak var olur - agregasyon)
        
        // TODO: Profesörü ileterek bir Course nesnesi oluştur (agregasyon)
        // Course, kendi derslerini kendi içinde oluşturacak (kompozisyon)
        
        // TODO: getInfo() sonucunu yazdır
        
        // TODO: Boş bir satır yazdır
        
        // TODO: listLectures() sonucunu yazdır
        
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Java derleyicisi