İnsanoğlu kompleks yapılarla mücadele etmenin her zaman bir yolunu bulmuştur. Kimi zaman bu yapıları yok saymak, kimi zaman bu yapıların etrafından dolaşmak ve kimi zaman da bunların üzerine çok uzun süre düşünmek zorunda kalmıştır. Bu düşünceler bazen insanoğlunu uyulması gereken bir kurallar bütününe yönlendirmiştir ki bu işleri oldukça kolaylaştırmaktadır!
Yıllar 1967’yi gösterdiğinde simülasyon tasarımı için geliştirilmiş olan Simula isimli dil, nesne yönelik programlamayı (OOP) temel edinen ilk dil olarak ortaya çıkmıştı. OOP kavramının ilk ortaya çıktığı yıllar şüphesiz yazılım dünyası için bir devrim olmuştu ancak insanoğlu her zamanki gibi yine kompleks yapıların içinde boğulmaya başlamıştı! Uzun süreler bilgisayar bilimcileri bu karmaşık yapıları egale etmek için birçok yolu denediler. Nitekim abstraction, polymorphism, inheritance, dependency injection gibi pek çok soyut kavram bu karmaşıklığı gidermeyi oldukça zorlaştırmaktaydı. Ta ki Robert C. Martin isimli ABD’li yazılım mühendisi 1996 yılında devrim niteliğinde bir makale yazana dek!
“Design Principles and Design Patterns” isimli makalede OOP dillerin ne şekilde manipüle edilebileceği, soyutlamaların nasıl daha efektif kullanılabileceği gibi kavramlar yer alıyordu. Ancak bu kompleks yapıları alt etmenin çok etkili bir yolu daha tarif edilmişti! SOLID prensipleri. Bu prensipler üzerine çokça düşünülmüş ve birçok bilgisayar bilimcisi tarafından kabul görmüş bazı kurallar bütünüydü. Peki, neydi bu SOLID prensipleri?
SOLID kelimesini açtığımız zaman Single responsibility principle, Open-closed principle, Liskov substitution principle, Interface segregation principle, Dependency inversion principle kavram ve kurallarının baş harflerinden oluştuğunu görmekteyiz. Yazımın devamında bu kavramları tek tek irdeleyeceğiz. Ancak yazının uzunluğu nedeniyle iki bölümlük bir mini seri şeklinde yayınlamanın daha doğru olacağı fikrine vardım.
Single Responsibility Principle: Bu prensibe göre bir sınıf sadece bir işi yapmalıdır ve sadece bir problemi çözmelidir.
Örneğin; Bir veri tabanımız ve bu veri tabanında tutulan müşteriler ile çalışanlar tablolarımız olsun. Veri tabanımıza bir müşteri eklemek istediğimiz zaman bunu hem müşterileri hem de çalışanları veri tabanına kaydedecek bir sınıf üzerinden değil, sadece müşterileri veri tabanına kaydedebilecek bir sınıf üzerinden yapmalıyız. Yani her iki sınıfı da veri tabanına ekleyebilecek bir Service sınıfı yerine, CustomerService ve EmployeeService isimli iki farklı sınıf oluşturmalıyız. Bu durum tabi ki kodlara daha rahat erişim imkânı sağladığı gibi olası değişikliklerde de yapıların bozulmasını engelleyecektir! Öyle ki müşterileri ve çalışanları veri tabanına ekleyen tek bir yapı oluşturursak biri için gerekli ancak diğeri için gereksiz birçok fonksiyon ve değişkeni içerisinde barındırması gerekebilir ve bu karmaşık yapıya “Spagetti Code” denir. Bu kodları daha iyi anlaşılması için aşağıya ekliyorum.
Soldaki bütün halde bulunan, her fonksiyonu ve değişkeni içerisinde barındıran tek bir fonksiyon yerine sağda bulunan ve Single Reponsibility prensinibe uygun daha minimal ve tek görev yapan yapılar sürdürülebilir kodlama için daha uygun olacaktır!
Open-Closed Principle: Bir sınıf Gelişime Açık, Değişime Kapalı olmalıdır. Değişime kapalı olmak günümüzde pek hoş karşılanmasa bile, bu durum OOP dillerinde gerçekten hayat kurtaran bir kurala dönüşüyor!
Örneğin; İçerisinde sadece ücretsiz üyeleri barındıran bir veri tabanımız ve bu üyeleri veri tabanına ekleyen bir CustomerService sınıfımız olsun. Eğer sistemi ücretli üyeleri de barındıracak hale getirip geliştirmek istersek, ücretli ve ücretsiz üyeleri OOP dillerin bize sunduğu imkânlardan birisi olan Polymorphism (Çok biçimlilik) ile üst çatıda birleştirip CustomerService sınıfını değiştirmeden her ikisini birden veri tabanına ekleyebilen (Single reponsibility prensibine aykırı olmayacak şekilde!) bir yapıya dönüştürebiliriz.
Yazımızın ilk bölümünde sürdürülebilir kodlamanın temellerinden olan Single Responsibility ve Open-Closed prensiplerinden bahsettik bir sonraki bölümümüzde SOLID prensiplerine devam edecek ve yazılımcılar için bir hayli öneme sahip olan bu prensipleri benimseyerek sürdürülebilir kodlama adına büyük bir adım daha atacağız! O güne dek araştırmaya ve öğrenmeye devam etmeniz dileğiyle, yazımı okuduğunuz için teşekkür ederim.
Yazar, Deniz DEMİRKAN
Kaynakça
https://dev.to/trekhleb/s-o-l-i-d-principles-around-you-1o17
https://fi.ort.edu.uy/innovaportal/file/2032/1/design_principles.pdf
https://www.bmc.com/blogs/solid-design-principles/
https://stackify.com/solid-design-liskov-substitution-principle/
https://springframework.guru/principles-of-object-oriented-design/dependency-inversion-principle/