Nesne Yönelimli Programlama (OOP) Temelleri: JS ile Adım Adım Örnek
Programlama Paradigmaları
Nesne Yönelimli Programlama (OOP) Temelleri: JS ile Adım Adım Örnek

Giriş
Nesne Yönelimli Programlama (OOP), yazılım geliştirmede gerçek dünyadaki nesneleri ve ilişkilerini modellemeyi amaçlayan bir yaklaşımdır. OOP; kodu daha düzenli, tekrar kullanılabilir ve bakım yapılabilir hâle getirmek için sık kullanılan bir paradigmadır. Genel kavramlar ve temel tanımlar için bakınız: Soft Ajans ve Uzaktan Eğitim.
OOP'nin temel kavramları
OOP'nin temel taşları genellikle şu başlıklar altında toplanır: sınıflar ve nesneler, kapsülleme (encapsulation), kalıtım (inheritance), polimorfizm (polymorphism) ve soyutlama (abstraction). Bu kavramların kısa tanımları aşağıdadır.
Sınıflar ve nesneler
Sınıf (class), aynı türdeki nesnelerin özelliklerini (fields) ve davranışlarını (methods) tanımlayan bir şablondur. Nesne (object) ise bu sınıftan oluşturulan somut örnektir. Örneğin bir "Araba" sınıfı marka, model gibi özelliklere ve hızlanma gibi davranışlara sahip olabilir; bu tanım bir sınıf olurken, belirli bir marka ve modele sahip değeri bir nesnedir (kaynak).
Kapsülleme (Encapsulation)
Kapsülleme, veri (özellikler) ve bu veriye erişimi sağlayan fonksiyonların (metodların) bir arada tutulması ve bazı verilerin dışarıdan doğrudan erişime kapatılmasıdır. Bu, nesnenin iç durumunu korur ve yanlış kullanımı önlemeye yardımcı olur.
Kalıtım (Inheritance)
Kalıtım, bir sınıfın (alt sınıf) başka bir sınıftan (üst sınıf) özellik ve davranış devralmasını sağlar. Bu sayede tekrar eden kod azaltılır ve ilişkiler daha net tanımlanır.
Polimorfizm (Polymorphism)
Polimorfizm, aynı isimli metodların farklı sınıflarda farklı davranışlar göstermesidir. Örneğin bir "hızlan" metodu hem benzinli hem elektrikli araçlarda farklı şekilde uygulanabilir.
Soyutlama (Abstraction)
Soyutlama, karmaşıklığı gizleyip yalnızca gerekli ayrıntıları sunma prensibidir. Bir sınıf, dışarıya yalnızca kullanılması gereken metodları sunar; iç hesaplama detayları saklanır (kaynak).
JavaScript'te OOP: Prototip ve Sınıf Yaklaşımları
JavaScript, prototip tabanlı bir miras modeline sahiptir; ES6 ile gelen class sözdizimi ise geliştiriciler için daha tanıdık bir yapı sunar. ES6 sınıfları, prototip mekanizmasının üstünde çalışan bir sözdizimsel kolaylıktır ve aynı OOP kavramlarını uygulamaya yardımcı olur (JavaScript OOP açıklaması).
Örnek 1 — Nesne Literali (Basit)
Basit durumlar için nesne literali kullanılabilir. Bu yaklaşım küçük yapılar için uygundur.
const car = {
brand: 'Toyota',
model: 'Corolla',
speed: 0,
accelerate(amount) { this.speed += amount; },
brake(amount) { this.speed = Math.max(0, this.speed - amount); }
};
console.log(car.brand); // 'Toyota'
Açıklama: Bu yapı sınıf tanımı değildir; doğrudan tek bir nesne oluşturur. Küçük uygulamalar veya yapılandırılmamış veriler için uygundur.
Örnek 2 — Constructor Function ve Prototype
ES6 öncesi yaygın yol constructor fonksiyonları ve prototype kullanımıdır. Bu yöntem hafıza verimliliği sağlar çünkü metodlar prototype üzerinde paylaşılır.
function Car(brand, model) {
this.brand = brand;
this.model = model;
this.speed = 0;
}
Car.prototype.accelerate = function(amount) { this.speed += amount; };
Car.prototype.brake = function(amount) { this.speed = Math.max(0, this.speed - amount); };
const myCar = new Car('Honda', 'Civic');
myCar.accelerate(20);
Açıklama: Bu yaklaşım, aynı metodların farklı nesneler tarafından paylaşılmasını sağlar; prototype mekanizması JavaScript'in temel özelliğidir.
Örnek 3 — ES6 Class ve Kalıtım
ES6 sınıf sözdizimi okunabilirliği artırır ve kalıtım ile kolayca çalışır.
class Car {
constructor(brand, model) {
this.brand = brand;
this.model = model;
this.speed = 0;
}
accelerate(amount) { this.speed += amount; }
brake(amount) { this.speed = Math.max(0, this.speed - amount); }
toString() { return `${this.brand} ${this.model} - ${this.speed} km/h`; }
}
class ElectricCar extends Car {
constructor(brand, model, batteryLevel = 100) {
super(brand, model);
this.batteryLevel = batteryLevel;
}
accelerate(amount) {
super.accelerate(amount);
this.batteryLevel = Math.max(0, this.batteryLevel - amount * 0.1);
}
charge(amount) { this.batteryLevel = Math.min(100, this.batteryLevel + amount); }
}
const tesla = new ElectricCar('Tesla', 'Model S');
tesla.accelerate(50);
console.log(tesla.toString());
Açıklama: ElectricCar, Car'dan türetilmiştir ve accelerate metodunu kendi ihtiyacına göre değiştirerek polimorfizm uygular. Bu örnek, kalıtım ve metod ezme (override) kavramını gösterir.
Örnek 4 — Kapsülleme: Özel Alanlar
Modern JavaScript, özel alanlar (private fields) için # sözdizimini destekler. Bu, nesnenin iç durumunu dışarıdan doğrudan değiştirmeyi engeller.
class Car {
#speed = 0;
constructor(brand, model) { this.brand = brand; this.model = model; }
accelerate(amount) { this.#speed += amount; }
getSpeed() { return this.#speed; }
}
const car = new Car('Ford', 'Fiesta');
car.accelerate(30);
console.log(car.getSpeed());
Not: Özel alan sözdizimi modern JavaScript sürümlerinde çalışır; hedeflediğiniz çalışma ortamının destek durumunu kontrol edin.
Pratik: Bir problemi OOP ile modelleme adımları
- Sorunu ve alanı tanımlayın: Hangi varlıklar (nesneler) var?
- Her varlığın özelliklerini (veri) ve davranışlarını (metodlar) listeleyin.
- Sınıfları, alt sınıfları ve aralarındaki ilişkileri belirleyin (örneğin "Araba" ve "ElektrikliAraba").
- Kapsülleme ihtiyacını değerlendirin: hangi veriler dışarıdan erişilmemeli?
- Polimorfizm gereksinimlerini kontrol edin: ortak arayüzlere farklı davranışlar mı lazım?
- Küçük adımlarla kodlayın, birimleri test edin ve gerektiğinde refaktör yapın.
Kontrol listesi (Checklist)
- Sınıflar net mi? (Tek bir sorumluluk ilkesi)
- Kod tekrarları azaltıldı mı (DRY)?
- Gizli (private) veriler dış erişimden korunuyor mu?
- Benzer davranışlar ortak üst sınıfa taşındı mı?
- Metodların birim testleri var mı?
Yaygın hatalar ve ipuçları
- Sınıfları çok büyük tutmayın; küçük, tek sorumluluklu sınıflar oluşturun.
- Her şeyi sınıf haline getirmek zorunda değilsiniz; basit veri yapıları bazen daha uygundur.
- Mutasyona dikkat edin: Paylaşılan durum (shared state) beklenmedik hatalara yol açabilir.
- ES6 sınıfları prototip mekanizmasının üstünde çalışır; performans açısından farkları bilin.
Sonuç ve ileri okuma
OOP, karmaşık sistemleri modellemek için güçlü bir araçtır. JavaScript hem prototip tabanlı miras hem de ES6 sınıf sözdizimi ile OOP kavramlarını uygular. Temel kavramlar ve uygulama örnekleri için şunları inceleyebilirsiniz: Soft Ajans, Uzaktan Eğitim ve JavaScript özel örnekleri için bu kaynak: Medium.
Bu makaledeki kod örnekleri eğitim amaçlıdır; kendi projelerinize uygulamadan önce çalışma ortamınızda test etmeniz önerilir.