Menu
Coddy logo textTech

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 çok ö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 edilir. Bir House ve onun Room nesnelerini düşünü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 sahiptir
        }
    }
}

Toplama işleminde, 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ün: oyuncular bir takım olmadan 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 ayrım: bileşimde kapsayıcı, parçalarını dahili olarak 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 ortadan kalkar.

challenge icon

Görev

Kolay

Hem toplama hem de bileşimi gösteren bir üniversite ders sistemi oluşturalım. Bir Course nesnesinin kendi Lecture nesnelerine sahip olduğunu (bileşim), buna karşılık yalnızca bağımsız olarak var olan Professor nesnelerine başvurduğunu (toplama) 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'ın iki private alanı vardır: name (String) ve department (String). Her iki alanı da başlatmak için bir constructor ve her biri için getter metotları ekle. toString() metodunu şu değeri döndürecek şekilde geçersiz kıl: Prof. [name] ([department])
  • Lecture.java: Yalnızca bir dersin içinde anlamlı olan bir konferansı temsil eden bir sınıf oluştur. Bir Lecture'ın iki private alanı vardır: topic (String) ve durationMinutes (int). Bir constructor ve getter'lar ekle. toString() metodunu şu değeri döndürecek şekilde geçersiz kıl: Lecture: [topic] ([durationMinutes] min)
  • Course.java: Her iki ilişkiyi de burada göstereceksin! Bir Course'un üç private alanı vardır: title (String), professor (Professor - toplama) ve lectures (Lecture nesnelerinden oluşan bir dizi - bileşim).

    Constructor, ders başlığını, bir Professor nesnesini (dışarıdan geçirilen - toplama) ve konferansların sayısını alır. Constructor'ın içinde Lecture dizisini oluştur ve yeni Lecture nesneleriyle doldur. i indeksindeki her konferans için, onu "Topic " + (i + 1) konusu ve 45 dakikalık süreyle oluştur. Bu dahili oluşturma, bileşimi gösterir.

    Çok satırlı bir String döndüren bir getInfo() metodu ekle:

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

    Ayrıca her konferansın toString() sonucunu kendi satırında döndüren bir listLectures() metodu ekle.

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

    İlk olarak, verilen ad ve bölümle bir Professor oluştur. Bu profesör bağımsız olarak var olur. Ardından title, professor (toplama) ve konferans sayısını alacak şekilde bir Course oluştur (ders kendi konferanslarını dahili olarak oluşturacaktır - bileşim).

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

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

Temel farka dikkat et: Professor dışarıda oluşturulur ve Course'a geçirilir (toplama: profesör başka dersler verebilir veya bu ders olmadan var olabilir). Lecture nesneleri Course constructor'ı içinde oluşturulur (bileşim). Yalnızca bu derse aittirler ve bu ders olmadan var olmazlardı).

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 - aggregation)
        
        // TODO: professor'ı geçirerek bir Course nesnesi oluştur (aggregation)
        // Course kendi lecture'larını dahili olarak oluşturacak (composition)
        
        // 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