Kısaca SOLID Prensipleri Nelerdir?
Merhaba, bu yazıda Nesne Tabanlı/Yönelimli Programlamanın olmazsa olmazlarından ve her yazılımcının iyi şekilde bilmesi gereken bir konuya değineceğim. Kısaca SOLID prensipleri “İyi Kod” yazmak isteyen bir programcının dikkat etmesi gereken temel prensiplerdir. Yazılan kodun esnek, dinamik, okunabilir, karmaşıklıktan uzak, temiz ve dünya yazılım standartlarında olması bu prensiplerin uygulanmasından da geçiyor diyebiliriz. S.O.L.I.D, 5 ayrı prensibin kısaltmasıdır. Bu prensipleri aşağıda kısaca özetleyeceğim:
1- Single Responsibility( Tek Sorumluluk)
İsminden de anlaşılacağı üzere, bir nesnenin/sınıfın, arayüzün(interface), metodun ya da bir kod parçasının tek bir görevinin olması yani sorumlu olduğu işin belirli olmasıdır. Bunu örnekleyerek açıklayalım:
Matematik işlemlerini gerçekleştirmek için yazdığımız bir sınıfın metodları yalnızca matematik işlemlerini gerçekleştirmekten sorumlu olmalıdır. Eğer bu sınıf içerisinde dosyaya yazmak gibi bir işlem yaptırılıyorsa bu Single Responsibility ilkesini ihlal eder. Mantıken; görevi matematik işlemlerini gerçekleştirmek olan bu sınıfın farklı türde işler yapması da anlamsız ve yersizdir. Günlük hayattan basit bir şekilde örnek vermek gerekirse, bir makasın işi kesmektir ve yapıştırma işinden sorumlu tutulamaz ve ya bir matematik profesörünün beyin ameliyatı yapmasını istemek mantıksız olacaktır.
2- Open / Closed Principle(Açıklık-Kapalılık)
Bu prensip bir sınıfın/nesnenin geliştirilmeye açık olması, değiştirilmeye ise kapalı olması gerektiğini söyler. Yani tanımlanmış bir sınıfın daha sonra işlevinin değiştirilmesi yanlıştır. Fakat bu sınıf, yeni özellikler eklenebilir, geliştirilebilir olacak şekilde yani esnek bir yapıda geliştirilmelidir. Bu yapı OOP’nin ve SOLID prensiplerinin olmazsa olmazı arayüzler(interface) ve soyut(abstract) sınıflar ile oluşturulabilir.
3- Liskov Substitution Principle
Bu prensibe göre üst sınıflardan türetilen bir tür, türetildiği sınıfın bütün özelliklerini barındırmalıdır. Yani alt sınıfın türetildiği sınıfta, alt türün kullanmayacağı bir metod ve ya sahip olmadığı bir özellik olmamalıdır. Bu şekilde bu nesneler birbirlerinin yerine kullanıldığında bir problemle karşılaşmayız.
4- Interface Segregation Principle (Arayüz Ayrımı)
Basitçe bu prensip, sınıfların implement ettiği interface(arayüz) lerde kullanılmayacak yani gereksiz metod tanımları olmamalıdır. Interface ler olabildiğince basit ve öz bir şekilde tanımlanmalıdır. Örneğin, A class ının implement ettiği interface A nın override etmeyeceği bir metod tanımını barındırıyorsa bu kural ihlal edilmiş olur, eğer bu metod bir başka sınıfta override edilmiyorsa tanım kaldırılmalıdır. Eğer bu metod başka sınıflarda override edilerek kullanılacaksa o zaman interface parçalanmalıdır. Parçalama sonucu oluşan interfaceler de gerekli sınıflarda implement edilmelidir.
5- Dependency Inversion Principle
Bu prensip bize sınıfların birbiri ile doğrudan bağımlı olmaması gerektiğinden bahseder. Yani bir sınıf özellik olarak bir başka sınıfı barındırıyorsa bu Dependency Inversion ilkesinin ihlali demektir. Bu durumda yapılması gereken şey ise soyut bir katman ile bu bağlantının, bağımlılığın sağlanmasıdır. Yani bağımlı nesnenin bir abstract class ya da bir interface üzerinden bağımlılığı sağlanmalıdır.