JS ILE FONKSIYONEL PROGRAMLAMA
Object Composition — 3 (Inheritance over Composition)
Inheritance over Composition, kalıtımın dil içerisine konulmuş extends, class gibi reserved keyword ile değilde başka yöntemler ile diğer objeleri kapsayacak hale gelmesidir ? Peki nasıl gerçekleştirilir ?
Bu yazıya başlamadan önce bu konu yazmış olduğum ilk 2 yazıyı okumanızı öneririm.
- Object Composition and Assembly (Nesneleri Birleştirme Yöntemleri)
- Inheritance Types (Farklı Kalıtım Türleri)
Bu yazıda bildiğimiz Class ve extends yöntemi ile kalıtım yönteminin neden sorunlar çıkardığını bunun yerine Inheritance over Composition nasıl yapacağımızı analiz edeceğiz. Aşağıdaki video bunu çok iyi bir şekilde örneklemiş o yüzden bu videodaki örnek üzerinden anlatıyor olacağız.
Yukarıdaki videoda gerçek bir yazılım geliştirme yapısını küçük bir örnekle simule eden bir çalışma yapmış bunu gerçekleştirken öncelikle OOP Class Inheritance ile nasıl yapılacağını yorumlamış;
Burada bu adımların projenize aynı anda değilde belli zaman aralıkları ile eklendiğini düşünün
- Önce sistemde havlayan bir köpek olsun.
- Sonra sistemde miyavlayan bir kedi olsun isteniyor,
- Daha sonrasında kedi ve köpek kaka yapsın, gidiyor 2 nesneye bu poop() metodlarını ekliyor
- poop() dublicate oldu bunu engellemek için bir parent sınıf oluşturup (Animal), içerisine poop taşıyıp, bunun altına nesnelerimizi hiyerarşik olarsak taşıdık.
Zaman içerisinde sistem biraz daha gelişti bu durumda, hayvanların kakalarını temizleyecek bir temizleme robotu oluşturduğu durumu yaptığını varsayalım.
- Temizleme Robotu (Cleaning Robotun) sürüşü ve temizleme özelliği olsun.
- Katil Robot (Murder Robotun) sürüşü ve öldürme özelliği olsun istendi..
- Burada robotun sürüş yetenekleri ortak ozaman Robot parent sınıfı altında bu drive() fonksiyonu taşıyarak gerçekleşir.
Peki zaman ilerledi sistem güzel bir şekilde işledi, ilerde müşterinin veya yöneticilerin isteği ile Havlayan, Katil, Köpek Robot olsun isteniyor. Bu durumda bizim kurduğumuz hireyarşik yapıya uymuyor
- 1nci resimde kill() ve bark() Robot ve Animal içerisinde dağılmış durumda.
- 2nci resimde bu köpek robotun poop() özelliği olmasın isteniyor.
- 3üncü resimde Bu durumda 2 parent nesneden türediği bir GameObject ve bunun bark özelliği olsun dedik ama buda çok mantıklı değil çünkü en üste aldığımız bark() havlama bir çok alt sınıf için uygun değil.
- Bu durumda 4ncü resmi oluşturuyoruz ama bark() fonksiyonalitesi dublicate etti. DRY felsefesine ters.
Bizim hiyerarşik yapıdan çok davranışları ekleme yapılmasına ihtiyacımız var. Bu durumda Concatenative inheritance (Birleştirici Kalıtım) Object.assign ile arada istediğimiz davranışı oluşturup kalıtımı çok daha esnek hale getirebiliriz.
Bir önceki yazımda Kalıtım Türlerinde bahsettiğimiz fonksiyonlar üzerinden dinamik yapı oluşturmaları bizr çok büyük esneklikler sağlacaktır. Burada bahsi geçilen Composition Over Inheritance, kalıtımı bu yönde kullanmaya çalışılmasıdır.
Not: Composition over inheritance yöntemi UI kütüphanelerinde sıkça kullanılan bir method’dur, İster JQuery bakın, ister backbone hepsinin altyapsında extends yerine Composition Over Inheritance tercih ettiğini göreceksiniz.
React bu gidişatını Class Component → Hooks APIsi yönünde geçişi ile gerçekleştirdi.
Bu konuda da aşağıdaki resim yukarıda anlattığım duruma benzer bir ihtiyacın Component dünyasındaki yansıması olarak görebilirsiniz.
Referanslar
Okumaya Devam Et 😃
Bu yazının devamı veya yazı grubundaki diğer yazılara erişmek için bu linke tıklayabilirsiniz.