Menu
Coddy logo textTech

Derin Kalıtımın Sınırları

Coddy'nin JavaScript Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 48 / 56.

Kalıtım yararlı olsa da, çok derin kalıtım hiyerarşileri (ebeveyn → çocuk → torun → torunun çocuğu) oluşturmak sorunlara yol açabilir. Zincir ne kadar derinleşirse, kodu anlamak, sürdürmek ve değiştirmek o kadar zorlaşır.

Derin bir kalıtım zinciriyle neler olduğuna bakalım:

// Temel sınıf
class Vehicle {
  constructor(type) {
    this.type = type;
    this.isRunning = false;
  }
  
  start() {
    this.isRunning = true;
    console.log(`${this.type} started`);
  }
}

// İlk kalıtım seviyesi
class Car extends Vehicle {
  constructor(make, model) {
    super("Car");
    this.make = make;
    this.model = model;
    this.wheels = 4;
  }
  
  honk() {
    console.log("Beep beep!");
  }
}

// İkinci kalıtım seviyesi
class SportsCar extends Car {
  constructor(make, model, topSpeed) {
    super(make, model);
    this.topSpeed = topSpeed;
  }
  
  race() {
    this.start();
    console.log(`Racing at ${this.topSpeed} mph!`);
  }
}

Bu örnekte, SportsCar kalıtımda iki seviye derinliktedir. Bu durum birkaç soruna yol açabilir:

  1. Vehicle üzerinde yapılan değişiklikler beklenmedik bir şekilde SportsCar'ı bozabilir
  1. Kalıtım zinciri büyüdükçe, metotların ve özelliklerin nereden geldiğini takip etmek zorlaşır
  1. Yeterince esnek olmayabilecek "is-a" ilişkilerine zorlanırsınız
challenge icon

Görev

Robotu işlevsel hale getirmek için Robot.js dosyasını tamamlayın. Şu anda robot inşa edilmiş durumda ancak hiçbir şey yapamıyor.

Robot.js dosyasında yapılması gerekenler:

  1. Robot constructor'ı içinde speaker ve mover bileşenlerini oluşturun
  2. Bileşenleri metotlar içinde kullanın:
    1. greet() içinde: this.speaker.speak("Hello!"); metodunu çağırın
    2. walkForward() içinde: this.mover.move("forward"); metodunu çağırın

Bunu neden yapıyoruz: Bu bir composition (bileşim) örneğidir - robot, daha küçük bileşenlerin birleştirilmesiyle inşa edilir. Robot, bu yetenekleri miras almak yerine bir speaker'a (konuşmak için) ve bir mover'a (hareket etmek için) sahiptir (has-a ilişkisi).

Kopya kağıdı

Derin kalıtım hiyerarşileri (ebeveyn → çocuk → torun) bakım sorunlarına ve esneklik kaybına yol açabilir. Zincir ne kadar derinleşirse, kodu anlamak ve değiştirmek o kadar zorlaşır.

Derin bir kalıtım zinciri örneği:

class Vehicle {
  constructor(type) {
    this.type = type;
    this.isRunning = false;
  }
  
  start() {
    this.isRunning = true;
    console.log(`${this.type} started`);
  }
}

class Car extends Vehicle {
  constructor(make, model) {
    super("Car");
    this.make = make;
    this.model = model;
  }
}

class SportsCar extends Car {
  constructor(make, model, topSpeed) {
    super(make, model);
    this.topSpeed = topSpeed;
  }
}

Derin kalıtım ile ilgili sorunlar:

  • Temel sınıflarda yapılan değişiklikler, alt sınıfları beklenmedik şekilde bozabilir
  • Metotların ve özelliklerin nereden geldiğini takip etmek zordur
  • Esneklikten yoksun, katı "is-a" (bir ...-dır) ilişkilerini zorunlu kılar

Alternatif olarak kompozisyon (composition): Kalıtım yerine, nesnelerin bileşenlerle have-a (bir ...-ya sahiptir) ilişkisi kurduğu ve işlevsellik oluşturmak için daha küçük parçaları birleştirdiği kompozisyonu kullanın.

Kendin dene

import { Robot } from './Robot.js';

const myRobot = new Robot('Robo');

myRobot.greet();     // Şunu çıktı olarak vermeli: Saying: "Hello!"
myRobot.walkForward(); // Şunu çıktı olarak vermeli: Moving forward
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