Menu
Coddy logo textTech

Kompozisyon vs Kalıtım

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

Kalıtım, bir "is-a" ilişkisi oluşturur: bir Dog bir Animal'dır. Peki bir sınıf, olmadığı bir şeyin işlevselliğine ihtiyaç duyarsa ne olur? İşte burada composition devreye girer ve bunun yerine bir "has-a" ilişkisi kurar.

Kompozisyon ile bir sınıf, diğer sınıfları genişletmek yerine alanlar olarak bu sınıfların örneklerini içerir:

// Kalıtım yaklaşımı: Car bir Engine'dir (mantıklı değil)
class Car extends Engine { }

// Kompozisyon yaklaşımı: Car bir Engine'e sahiptir (mantıklı)
class Car {
    private Engine engine;
    
    public Car(Engine engine) {
        this.engine = engine;
    }
    
    public void start() {
        engine.ignite();
    }
}

Composition çeşitli avantajlar sunar. Çalışma zamanında, örneğin motorları değiştirerek oluşturulan nesneyi değiştirebilirsiniz.

Ayrıca birden çok sınıftaki davranışları da birleştirebilirsin; kalıtım Java’da buna izin vermez. Oluşturulan sınıf yalnızca seçtiği yöntemleri dışa sunarak daha iyi kapsülleme sağlar.

Pratik bir kılavuz: Gerçek bir "is-a" ilişkisi olduğunda ve alt sınıf gerçekten üst sınıfın özelleştirilmiş bir sürümünü temsil ettiğinde kalıtımı kullanın.

Başka bir tür olmadan başka bir sınıfın işlevselliğini kullanmanız gerektiğinde bileşimi kullanın. Birçok deneyimli geliştirici şu ilkeyi benimser: "kalıtım yerine bileşimi tercih edin"; çünkü bu, daha esnek ve bakımı daha kolay kodlar sağlar.

challenge icon

Görev

Kolay

"has-a" ilişkisini göstermek için composition kullanarak bir bilgisayar sistemi oluşturalım. Bir Computer sınıfının bileşenlerinden kalıtım alması (ki bu mantıklı olmazdı) yerine, bilgisayarınız çalışmak için ihtiyaç duyduğu parçaları içerecek.

Kodunuzu üç dosyaya ayıracaksınız:

  • Processor.java: Bir CPU'yu temsil eden bir sınıf oluşturun. Bir Processor'ın iki private alanı vardır: brand (String) ve speedGHz (double). Her iki alanı başlatmak için bir constructor ve her biri için getter metotları ekleyin. Bir String döndüren process() metodu ekleyin: [brand] processing at [speedGHz] GHz
  • Memory.java: RAM'i temsil eden bir sınıf oluşturun. Bir Memory'nin iki private alanı vardır: type (String, "DDR4" veya "DDR5" gibi) ve sizeGB (int). Bir constructor, getter'lar ve şunu döndüren bir load() metodu ekleyin: Loading [sizeGB]GB [type] memory
  • Computer.java: Composition'ın gücünü gösterdiği yer burası! Computer sınıfınız private alanlar olarak bir Processor'a ve bir Memory'ye sahip olmalı. Bunları extend etmez; onları içerir. Her iki bileşeni kabul eden bir constructor ekleyin. Bileşenlerini kullanarak bilgisayarın başlatılmasını gösteren çok satırlı bir String döndüren bir boot() metodu ekleyin:
    Booting computer...
    [processor.process() result]
    [memory.load() result]
    System ready!
    Ayrıca şunu döndüren bir getSpecs() metodu ekleyin: Specs: [processor brand] CPU, [memory sizeGB]GB [memory type]
  • Main.java: Composition ile oluşturduğunuz sisteminizi hayata geçirin! Dört girdi alacaksınız: işlemci markası (String), işlemci hızı (double), bellek türü (String) ve bellek boyutu (int).

    Bu değerlerle bir Processor ve bir Memory oluşturun, ardından bunları bir Computer içinde birleştirin. boot() çağrısının sonucunu yazdırın, ardından getSpecs() çağrısının sonucunu yazdırın.

Dört girdiyi şu sırayla alacaksınız: işlemci markası, işlemci hızı (GHz), bellek türü ve bellek boyutu (GB).

Computer'ın kendisi olmaya çalışmak yerine işi bileşenlerine devrettiğine dikkat edin. Composition'ın gücü budur! Computer, kendisine verdiğiniz herhangi bir Processor'ı veya Memory'yi kullanabilir; bu da tasarımı esnek ve gerçekçi kılar.

Kendin dene

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Girdileri oku
        String processorBrand = scanner.nextLine();
        double processorSpeed = Double.parseDouble(scanner.nextLine());
        String memoryType = scanner.nextLine();
        int memorySize = Integer.parseInt(scanner.nextLine());
        
        // TODO: Marka ve hız ile bir Processor oluştur
        
        // TODO: Tür ve boyut ile bir Memory oluştur
        
        // TODO: Processor ve Memory'yi birleştirerek bir Computer oluştur
        
        // TODO: boot() sonucunu yazdır
        
        // TODO: getSpecs() 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