Rust Dünyasında Kalıtım Arayışı: Sınıfsız Bir Dilde Nesne Yönelimli Tasarım Mümkün mü?
Miras alma (inheritance) özelliği bulunmayan Rust programlama dilinde, geliştiricilerin kod tekrarını önlemek ve çok biçimlilik sağlamak için başvurduğu alternatif yöntemleri ve bu yaklaşımların sınırlılıklarını inceliyoruz.
Rust, bellek güvenliğini ve yüksek performansı hedeflerken geleneksel nesne yönelimli dillerin en temel özelliklerinden biri olan "kalıtım" (inheritance) mekanizmasını bünyesinde barındırmaz. Kalıtım; bir sınıfın, başka bir sınıfın özelliklerini ve metodlarını doğrudan devralması anlamına gelir. Rust geliştiricileri bu eksikliği gidermek için "trait" (davranış tanımlayan arayüzler) ve kompozisyon gibi alternatif yöntemleri kullanmaktadır. Ancak özellikle grafiksel kullanıcı arayüzü (GUI) kütüphaneleri geliştiren yazılımcılar, veri kalıtımının ve ortak bileşen davranışlarının eksikliğini derinden hissetmektedir. C# veya web teknolojilerindeki konforlu geliştirici deneyimi (DX - Developer Experience), Rust ekosisteminde henüz tam anlamıyla karşılık bulamamıştır.\n\nRust topluluğunda kalıtım benzeri yapılar kurmak için polimorfizm (çok biçimlilik) kavramına sıkça başvurulur. Çok biçimlilik, farklı veri tiplerinin aynı arayüz üzerinden yönetilebilmesini sağlar. Rust 1.86 sürümüyle gelen "trait upcasting" (alt arayüzden üst arayüze güvenli geçiş) özelliği, nesne yönelimli programlama (OOP) kalıplarını Rust'a uyarlamayı kolaylaştırsa da, dilin mevcut yapısı hala bazı temel engeller barındırmaktadır. Örneğin, Rust'taki "trait" yapıları doğrudan ilişkili veri (state/fields) tutamaz. Bu durum, C++ gibi dillerden gelen ve veri kalıtımına alışkın olan yazılımcıların Rust'a geçiş sürecini zorlaştırmaktadır. Geliştiriciler, veri alanlarını doğrudan paylaşmak yerine her seferinde "getter" ve "setter" metotları yazmak zorunda kalmaktadır. Bu sorunu aşmak için vtable (metotların bellekteki adreslerini tutan sanal tablo) yapılarında veri konumlarının da saklanabilmesi yönündeki teknik tartışmalar devam etmektedir.\n\nTüm bu zorluklara rağmen Rust, "generic typestate" (tür durum deseni) gibi kendine has ileri seviye tasarım şablonlarıyla nesne yönelimli programlamayı farklı bir boyuta taşımaktadır. Typestate deseni, bir nesnenin derleme zamanında sadece belirli durumlarda (state) geçerli olmasını ve hatalı durum geçişlerinin daha kod çalışmadan engellenmesini sağlar. Rust'ta doğrudan veri kalıtımı olmasa da, akıllı işaretçiler (Rc ve Weak gibi referans sayıcılı bellek yönetim araçları) ve gelişmiş tip sistemi sayesinde, güvenli ve sürdürülebilir mimariler inşa etmek mümkündür. Dilin yaratıcı kısıtlamaları, yazılımcıları daha güvenli kod yazmaya zorlarken, ekosistemin de bu doğrultuda evrilmesini tetiklemektedir.