“Behavior Delegation” Kavramı
“Behavior delegation“, JavaScript’te bir nesnenin başka bir nesnedeki davranışları ve özellikleri kullanabilmesini sağlayan yöntemdir.
“Behavior Delegation” Nedir?
Nesne yönelimli programlamada kullanılan bir teknik olan “behavior delegation”, bir nesnenin bir işlevini ya da görevini başka bir nesneye “devretmesi” üzerine kurulmuştur. Peki bu ne anlama geliyor?
Diyelim ki bir otomobil üretiyoruz ve bu otomobilin içerisinde direksiyon sistemi, fren sistemi, motor yönetimi gibi birçok farklı parça ve sistem bulunsun. Otomobilin kendisi, bu tüm işlevleri tek başına yürütmek yerine, bu işlevleri ilgili parçalarına veya sistemlere devreder. Direksiyonu çevirdiğimizde, otomobilin bu işlevi direksiyon sistemine devrettiğini ve bu sistemin hareketi gerçekleştirdiğini söyleyebiliriz.
Programlamada da benzer bir durum söz konusudur. Bir nesne, tüm işlevleri tek başına yürütmek yerine, bu işlevleri başka nesnelere devredebilir. Haliyle, kodun daha temiz, organize ve tekrar kullanılabilir olmasının önünü açar. Ayrıca, bir işlevde yapılacak değişiklikler sadece o işlevi yürüten nesneyi etkiler, bu da potansiyel hataların ve karmaşıklığın önüne geçer.
JavaScript’te “Behavior Delegation” Kullanımı
“Behavior delegation”, birçok programlama dilinde farklı şekillerde ve isimlerde karşımıza çıkar. Ancak bu kavram, prototip tabanlı bir yapıya sahip olduğu için en belirgin olarak JavaScript’te karşımıza çıkar.
Bu yapı sayesinde, bir nesne, başka bir nesnenin metodlarına ve özelliklerine doğrudan erişebilir hale gelir. Eğer bir nesne üzerinde belirli bir metodu çağırmaya çalışırsak ve bu metod o nesnede tanımlı değilse, JavaScript otomatik olarak bu metodu nesnenin prototipinde aramaya başlar ve bu süreç, temel Object prototipine ulaşana kadar devam eder.
Örnek üzerinden incelersek daha da anlaşılır olacaktır diye düşünüyorum.
//
const araba = {
marka: "",
model: "",
bilgi() {
console.log(`Bu araba ${this.marka} marka ve ${this.model} modeldir.`);
}
};
const sporAraba = Object.create(araba);
sporAraba.marka = "Ferrari";
sporAraba.model = "F8";
sporAraba.bilgi(); // Bu araba Ferrari marka ve F8 modeldir.
Yukarıdaki örneğimizde, araba
adında bir nesne tanımladık ve içerisinde marka
ve model
adlı özellikler ile bilgi
adlı bir metot ekledik.
Ardından, Object.create()
fonksiyonu kullanarak araba
nesnesinin prototipine bağlı olan sporAraba
adında yeni bir nesne oluşturduk. Bu sayede, sporAraba
nesnesi araba
nesnesindeki özelliklere ve metotlara erişebildik.
Oluşturduğumuz sporAraba
nesnesine marka
ve model
değerlerini atayıp ardıdan bilgi()
metodunu çağırdık. Her ne kadar, bilgi()
metodu aslında sporAraba
nesnesinde tanımlanmamış olsa da “behavior delegation” sayesinde bu metoda erişebildik.
Eğer “behavior delegation” gibi bir şey olmasaydı, doğrudan nesneler arasında paylaşılan özelliklere ve metotlara erişmek mümkün olmazdı. Bu durumda, her bir nesne için aynı özellikleri ve metotları tekrar tekrar yazmamız gerekecekti. Örneğimiz üzerinden gösterirsek:
const araba = {
marka: "",
model: "",
bilgi() {
console.log(`Bu araba ${this.marka} marka ve ${this.model} modeldir.`);
}
};
const sporAraba = {
marka: "Ferrari",
model: "F8",
bilgi() {
console.log(`Bu araba ${this.marka} marka ve ${this.model} modeldir.`);
}
};
sporAraba.bilgi(); // Bu araba Ferrari marka ve F8 modeldir.
Tahmin edeceğiniz üzere bu durum, hem kod tekrarına yol açmakta hem de modülerlik ve verimlilik açısından dezavantaj oluşturmaktadır.