Sınıf Ormanında Kaybolmak: OOP Beynimizi Ne Zaman Yorar?

Nesne yönelimli programlama, yazılım tarihinin en parlak fikirlerinden biri olarak sahneye çıktı: Dünyayı nesnelerle modelleyelim, sorumlulukları dağıtalım, kodu daha anlaşılır hale getirelim. Kâğıt üzerinde şahane. Bir kahve makinesi nesnedir, bir kullanıcı nesnedir, bir ödeme işlemi nesnedir. Fakat iş büyüyüp de AbstractPaymentProcessorFactoryProvider gibi varlıklar belirmeye başlayınca, insan zihni sessizce sandalyesinden kalkar ve kapıya yönelir.

Buradaki temel sorun OOP’nin kendisi değil, onun kontrolsüz hiyerarşi üretme eğilimidir. İnsan beyni sınırsız bir RAM değildir. Çalışma belleğimiz aynı anda sınırlı sayıda kavramı aktif tutabilir. Bir geliştirici bir metodu anlamak için beş sınıf, üç arayüz, iki soyut sınıf, bir kalıtım zinciri ve bir bağımlılık enjeksiyon konteyneri arasında zıplıyorsa, artık kod okumuyordur; zihinsel engelli parkurunda koşuyordur.

Soyutlama İlaçtır, Doz Aşımı Zehirdir

Programlamada soyutlama, ayrıntıları saklayarak düşünmeyi kolaylaştırır. Ancak her soyutlama bir bedel getirir: iz sürme maliyeti. Bir davranışın nerede tanımlandığını, hangi sınıfta ezildiğini, hangi arayüzle sözleşmeye bağlandığını ve çalışma zamanında hangi implementasyonun enjekte edildiğini anlamak gerekiyorsa, soyutlama artık bilgi saklamaz; bilgiyi dağıtır. Bu dağılım, bilişsel yükü artırır.

Kalıtım burada özel bir şüphelidir. Basit kalıtım, ortak davranışı paylaşmak için kullanışlıdır. Fakat derin kalıtım hiyerarşileri, tıpkı aile soy ağacında kimin kimin kuzeni olduğunu unutmak gibi, program davranışını izlemeyi zorlaştırır. Bir nesnenin ne yaptığını anlamak için sadece o sınıfa bakmak yetmez; atalarına, arayüzlerine, override edilmiş metotlarına ve bazen de framework büyüsüne bakmak gerekir. Kod artık düz bir metin değil, çok katmanlı bir arkeolojik kazı alanıdır.

Bu noktada bilişsel yük üçe ayrılır. Birincisi, problemin kendisinden gelen doğal yük: ödeme almak, stok yönetmek, veri doğrulamak gibi. İkincisi, öğrenme ve model kurma için gerekli yapıcı yük: alan bilgisini anlamak, doğru kavramları seçmek. Üçüncüsü ise gereksiz yük: sırf mimari şık görünsün diye eklenen fabrikalar, servisler, yöneticiler, yardımcılar ve yardımcıların yardımcıları. İyi yazılım tasarımı, üçüncüyü azaltma sanatıdır.

Nesneler Değil, İlişkiler Yoruyor

Bir sınıf tek başına genellikle masumdur. Zihni yoran şey sınıflar arasındaki yoğun ilişkiler ağıdır. Her nesne başka bir nesneye bağlıysa, her davranış dolaylıysa, her karar bir strateji sınıfına devredildiyse, geliştirici sistemin zihinsel haritasını oluşturmakta zorlanır. Bu harita olmadan hata ayıklama, karanlık odada lego aramaya benzer: Hem bulamazsınız hem de ayağınızı acıtırsınız.

Çözüm OOP’yi yakıp yıkmak değildir. Çözüm, onu insan zihnine saygılı kullanmaktır. Önce kompozisyonu kalıtıma tercih etmek gerekir. Derin soyağaçları yerine küçük, açık sorumluluklara sahip bileşenler daha okunabilirdir. İkinci olarak, soyutlamayı ihtiyaç doğmadan üretmemek gerekir. Bugün tek implementasyonu olan bir arayüz, yarının esnekliği değil; bugünün bilişsel vergisi olabilir. Üçüncü olarak, isimlendirme mimarinin omurgasıdır. Yanlış isim, yanlış harita demektir.

Ayrıca kodun yerelliği önemlidir. Bir davranışı anlamak için mümkün olduğunca az dosya açmak idealdir. Eğer basit bir iş akışı için editörde sekiz sekme açılıyorsa, tasarımın zarafeti değil, geliştiricinin sabrı test ediliyordur. Modülerlik, parçaları görünmez kılmak değil, sınırları anlaşılır kılmaktır.

Modern yazılımın en büyük yanılgılarından biri, karmaşıklığı yok ettiğini sanıp onu sadece başka yere taşımasıdır. OOP doğru kullanıldığında güçlü bir düşünme aracıdır; yanlış kullanıldığında ise insan beyninin sınırlı çalışma belleğine karşı açılmış bürokratik bir savaştır. İyi mimar, sınıf sayısını artıran kişi değil, zihinsel yükü azaltan kişidir.

Sonuç basit ama rahatsız edicidir: Kod makineye çalışsın diye yazılır, fakat insana anlaşılsın diye tasarlanır. Makine kalıtım zincirinden yorulmaz; insan yorulur. Ve yazılım projelerini uzun vadede ayakta tutan şey işlemcinin sabrı değil, geliştiricinin zihinsel berraklığıdır.

Mantık ve Diyalektik

diyalektikİnsanların, uzun bir toplumsal evrim sürecinin ürünü olan mantıksal düşünme yetenekleri, biçimsel mantığın icadından, binlerce değil, milyonlarca yıl önce gelir. Locke bu düşünceyi daha 17. yüzyılda dile getirmişti: “Tanrı insanları güçbelâ iki bacaklı yaratıklar olarak yaratıp, sonra da onları akılcı hale getirmeyi Aristoteles’e bırakacak denli acımasız davranmıştır insanlara.” Locke’a göre mantığın berisinde, “fikirlerdeki tutarlılığı ya da tutarsızlığı algılama naif yetisi” yatmaktadır. Mantık kategorileri gökten zembille inmez. Bu biçimler insanlığın sosyo-tarihsel gelişim süreci içinde şekillenmişlerdir. Gerçekliğin, insanların zihinlerine yansımış temel genellemeleri olan bu kategoriler, her nesnenin onu diğerlerinden ayıran belli nitelikleri olduğu; her şeyin diğer şeylerle belirli ilişkiler içinde varolduğu; nesnelerin, birtakım özgül nitelikleri paylaştıkları büyük sınıflamalar oluşturdukları; kimi olguların diğerlerine sebebiyet verdikleri vb. gerçeğinden doğarlar. Bir dereceye kadar hayvanlar bile muhakeme etme ve verili bir durumdan bazı sonuçlar çıkarma yeteneğine sahiptirler. Yüksek memelilerde ve özellikle bonobo şempanzeleri üzerine yapılan son araştırmaların da çarpıcı biçimde gösterdiği gibi insansı maymunlarda bu yetenek hayli gelişmiştir. Ancak, muhakeme yeteneği insan türünün bir tekeli olmayabilirse de, akılcı düşünme yeteneğinin, en azından evrendeki küçük köşemizde şimdiye kadarki en yüksek noktasına insan zekâsının gelişiminde ulaştığına şüphe yoktur.
Devamını oku “Mantık ve Diyalektik” →