Merhaba arkadaşlar,
Daha sonra her biri için ayrı ayrı sayfalar oluşturarak detaylandıracağım Solid Prensiplerine (İlkelerine) değinmek istiyorum.
Bu yazıdaki içeriklerin çoğu Wikipedia’dan alınmış ve Laravel bağlamında ekstra açıklamalar eklenmiştir.
Tek Bir Sorumluluk İlkesi (Single Responsibility)
Bir sınıfın (veya kod biriminin) tek sorumluluğu olmalıdır.
Açık/Kapalı İlkesi (Open–Closed)
Bir sınıf genişletmeye açık ama değişikliğe kapalı olmalıdır.
Bir sınıfı genişletebilir veya interface’i implemente edebilirsiniz ancak bir sınıfı doğrudan değiştiremezsiniz. Bunun anlamı, bir sınıfı doğrudan değiştirmek yerine bir sınıfı genişletmeli ve bu yeni genişlemeyi kullanmalısınız demektir.
Ek olarak, sınıf nitelik ve metodlarının uygun bir şekilde private veya protected olarak ayarlanması, böylece bunların dış kaynaklı kodlarla değiştirilememesi demektir.
Liskov İkame İlkesi (Liskov Substitution)
Bir programdaki nesneler yerine, bu nesnelerin alt tiplerinin olguları o programın doğruluğunu değiştirmeksizin konabilmelidir.
PHP’de, bu çoğu keresinde kodunuz için implemente edilecek interface’ler oluşturmanız anlamına gelir. Daha sonra interface’lerin implementasyonlarını değiştirebilirsiniz (geçiş yapabilirsiniz, yani buradaki değiştirme bir interface’in bir implementasyonunun içinin değiştirilmesi değildir, bir interface’in bir implementasyonu yerine o interface’in başka bir implementasyonunun koyulmasıdır). Bunun yapılması, implementasyonla etkileşen uygulama kodunuzda değişiklik yapma zorunluğu olmaksızın mümkün olmalıdır. Interface belirli metodların mevcut olacağını garanti altına alan bir sözleşme olarak hizmet eder.
Interface Ayrımı İlkesi (Interface Segregation)
İşe özgü birçok interface genel amaçlı bir tek interface’den daha iyidir.
Genel olarak, tüm durumlarda çalışmaya kalkışan genel amaçlı bir sınıf oluşturmak yerine, bir interface oluşturmak ve onu birçok kez implemente etmek tercih edilir.
Bağımlılığın Tersine Çevrilmesi İlkesi (Dependency Inversion)
Somut sınıflar yerine soyutlamalara bağlı olunmalıdır.
Sınıf bağımlılıklarını somut bir sınıf yerine bir interface olarak tanımlamalısınız. Bu size bağımlılığı kullanan sınıfta değişiklik yapmak zorunda kalmaksızın o interface’in başka bir implementasyonuna geçiş yapma imkanı verecektir.