Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
JavaScript OOP, programı birlikte çalışan nesneler üzerinden tasarlama yaklaşımıdır. Nesneler verileri özelliklerde, bu verilerle ilgili davranışları ise metotlarda tutar. JavaScript özünde prototip tabanlıdır; class, constructor, extends ve super gibi yapılar bu model üzerinde daha okunabilir bir yazım biçimi sağlar.

OOP özellikle bir uygulamada aynı türden birçok varlık bulunuyorsa yararlıdır. Örneğin kullanıcı, sepet, ürün veya ödeme gibi kavramların her biri kendi verisini ve bu veri üzerinde çalışan işlemleri taşıyabilir. Böylece tüm işlemleri tek bir uzun fonksiyon veya dağınık global değişkenler içinde tutmak yerine sorumlulukları ayırırsınız.

JavaScript'te OOP'nin temel parçaları​


Sınıf: Benzer nesnelerin nasıl oluşturulacağını tanımlar. Sınıf doğrudan gerçek kullanıcı değildir; kullanıcı nesneleri üretmek için kullanılan bir şablondur.

Nesne: Sınıftan oluşturulan veya doğrudan nesne söz dizimiyle tanımlanan somut değerdir.

Özellik: Nesnenin tuttuğu veridir. Örneğin bir kullanıcının adı veya bakiyesi.

Metot: Nesnenin gerçekleştirdiği işlemdir. Örneğin para yatırma veya ürün ekleme.

Kapsülleme: Veriye doğrudan erişimi sınırlandırıp değişiklikleri kontrollü metotlar üzerinden yapmaktır. JavaScript'te sınıf alanlarının başına # koyarak gerçek özel alan oluşturabilirsiniz.

Kalıtım: Bir sınıfın başka bir sınıfın davranışlarını genişletmesidir. extends ve super bunun için kullanılır. Ancak yalnızca ortak ve gerçekten anlamlı bir ilişki varsa tercih edilmelidir.

Çok biçimlilik: Farklı nesnelerin aynı metot adını kendi davranışlarına göre uygulayabilmesidir. Örneğin farklı bildirim türleri aynı gonder() metoduna sahip olabilir.

İhtiyaçUygun yaklaşımNeden
Tek bir basit veri grubuNesne söz dizimiGereksiz yapı oluşturmaz
Aynı davranışa sahip çok sayıda varlıkclassÜretimi ve ortak metotları düzenler
Dışarıdan korunması gereken durumÖzel alan ve metotDeğişiklikleri kurallı hale getirir
Birden fazla bağımsız yeteneği birleştirmeKompozisyonKarmaşık kalıtım zincirlerini önler


Çalışan bir OOP örneği​


Aşağıdaki örnek, kullanıcı bakiyesini dışarıdan doğrudan değiştirilemeyecek şekilde tutar. Dosyayı banka.js adıyla kaydedip Node.js ile çalıştırabilirsiniz.

JavaScript:
class BankaHesabi {
  #bakiye = 0;

  constructor(sahip) {
    this.sahip = sahip;
  }

  paraYatir(tutar) {
    if (!Number.isFinite(tutar) || tutar <= 0) {
      throw new Error("Tutar sonlu ve sıfırdan büyük bir sayı olmalı.");
    }

    this.#bakiye += tutar;
  }

  bakiyeGoster() {
    return this.#bakiye;
  }
}

const hesap = new BankaHesabi("Ayşe");
hesap.paraYatir(500);

console.log(hesap.sahip);
console.log(hesap.bakiyeGoster());

Çalıştırma adımı şöyledir:

  1. Kodda BankaHesabi sınıfı bir hesap şablonu olarak tanımlanır.
  2. new BankaHesabi("Ayşe") ifadesi bu sınıftan bir nesne üretir.
  3. paraYatir(500) metodu bakiyeyi kontrollü biçimde değiştirir.
  4. Dosyayı node banka.js komutuyla çalıştırın. Beklenen çıktı sırasıyla Ayşe ve 500 değerleridir.
  5. Negatif, sıfır, NaN, sonsuz veya metin türünde tutar verirseniz hata alınır; bu, doğrulama koşulunun çalıştığını gösterir. hesap.#bakiye yazarsanız da alan özel olduğu için doğrudan okunamaz.

Burada #bakiye yalnızca sınıfın içinden kullanılabilir. Dış kodun bakiyeyi istediği değere ayarlayamaması, nesnenin kendi kurallarını korumasını sağlar. Gerçek uygulamada para hesapları için kayan nokta hassasiyeti, para birimi ve işlem güvenilirliği gibi ek kurallar ayrıca tasarlanmalıdır; bu küçük örnek yalnızca OOP yapısını gösterir.

Hangi yaklaşımı seçmelisiniz?​


JavaScript'te her veri için sınıf yazmak gerekmez. Basit ve tek kullanımlık bir veri grubu için nesne söz dizimi veya düz fonksiyonlar daha anlaşılır olabilir. Aynı kurallara sahip çok sayıda nesne, gizlenmesi gereken durum veya nesnenin davranışları varsa sınıf kullanmak mantıklıdır.

Kalıtımı varsayılan çözüm olarak kullanmayın. Bir nesne başka bir nesnenin gerçekten özel türüyse extends anlamlıdır; yalnızca kod tekrarını azaltmak için kullanılıyorsa ortak yardımcı fonksiyon veya kompozisyon daha kolay sürdürülebilir olabilir.

Sık yapılan hatalar​


Her şeyi sınıfa koymak: Küçük bir işlem için sınıf kullanmak kodu gereksiz büyütebilir.

Alanları herkese açık bırakmak: Değişmesi gereken değerleri doğrudan dışarı açmak, geçersiz durumların oluşmasına neden olabilir. Değişiklikleri doğrulayan metotlar kullanın.

Kalıtım zincirini büyütmek: Çok katmanlı sınıflarda davranışın nereden geldiğini izlemek zorlaşır. Önce kompozisyonu değerlendirin.

Metot çağrısında this bağlamını unutmak: Bir metodu nesneden ayırıp geri çağrı olarak verirseniz this beklediğiniz nesneyi göstermeyebilir. Gerektiğinde bind, ok fonksiyonu veya uygun bir sarmalayıcı kullanın.

Sık sorulan sorular​

Özel alanı olan nesneyi JSON’a çevirmek bütün veriyi saklar mı?​

Hayır. # ile tanımlanan özel alanlar normal dış özellikler değildir; JSON.stringify bunları doğrudan içermez. Veriyi saklamanız gerekiyorsa hangi alanların dışarı çıkacağını belirleyen açık bir temsil tasarlayın. Örnekte yalnız sahip bilgisinin görünmesi, bakiyenin de otomatik yedeklendiği anlamına gelmez.

OOP kodunu test etmeye nereden başlanır?​

Kurucu, normal metot sonucu ve geçersiz girdileri ayrı sınayın. Örnekte 500 yatırınca sonuç 500 olmalı; "500" gibi bir metin ise kabul edilmemelidir. # alanına sınıf dışından doğrudan erişim sözdizimi hatasıdır; böyle bir satırı çalışan örneğin içine eklemek tüm betiğin ayrıştırılmasını durdurabilir.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic