SOLID Nedir?

Nesneye Yönelik Programlamanın 5 temel prensibidir.

1 – Single responsibility principle – Tek sorumluluk prensibi

Bir modülün (sınıf, metod, vb) değiştirilmesi için tek bir nedenin olması, yani tek sorumluluğunun olmasıdır.

Kullanıcıdan sipariş bilgilerini alıp işleyen ve kullanıcıya sipariş alındı mesajı gönderen bir uygulama geliştirdiğimizi varsayalım. Bu 3 fonksiyonu da aynı sınıfta geliştirdiğimizi durumda sipariş alma, işleme ve bildirim süreçlerindeki herhangi bir değişiklik sınıfın değiştirilmesine neden olacaktır.

Bu prensibe uygun olarak SiparisAlma, SiparisIsleme ve Bildirim sınıfları geliştirerek, değişikliğin sadece ilgili modülü etkileyecek şekilde yapılması sağlanacaktır.

2 – Open closed principle – Açık kapalı prensibi

Yazılım varlıklarının (modül, sınıf, metod, vb.) genişletmeye açık, değişikliğe kapalı olmasıdır.

Bir kitap satış sitesi geliştirdiğimizi varsayalım. Kitap listesini alfabetik sıraya göre dönen KitapSorgulama sınıfımızın kitaplariSirala metodu olsun. Alfabetik sıralamaya ek olarak fiyata göre sırlama ihtiyacı gelsin. Sıralama metoduna, sıralama türü parametresi ekleyerek gelen türe göre sıralamayı destekleyecek hale getirebiliriz.

Ancak bu çözüm yeni gelen her sıralama gereksinimi için KitapSorgulama sınıfının ve kitaplariSirala metodunun değiştirilmesi anlamına gelecektir. Açık kapalı prensibini ihlal eden bu çözüm her değişiklikte hata yapılmasını kolaylaştıracak, kodun bakımını zorlaştıracaktır.

Bu çözüm yerine strateji tasarım örüntüsünü (Strategy design pattern) kullanıp, AlfabetikSiralama, FiyataGoreSiralama gibi sınıflar yaratarak her bir sıralama geliştirmesini ilgili sınıftaki sırala metodu içinde yapabiliriz. Böylece KitapSorgulama sınıfı kendisine parametre olarak geçilen farklı sıralama sınıflarının sırala metodunu kullanacak, yeni sıralama yöntemleri için bu sınıfta bir değişiklik yapılması gerekmeyecektir.

3 – Liskov’s substitution principle – Liskov’un yerine geçme prensibi

Türetilen sınıfların, taban sınıfların yerine geçebilir olmasıdır.

Elektronik kitap satan bir internet sitesi geliştirdiğimizi ve sitemizde ücretli kitaplar ile birlikte ücretsiz kitapların da yer aldığını varsayalım. Liste fiyatı ve bu fiyat üzerine indirim hesaplayan metodu olan Kitap sınıfımız, bu sınıftan türeyen ve liste fiyatı her zamn 0 olan Ücretsiz Kitap sınıfımız olsun.

Türetilmiş Ücretsiz Kitap sınıfımızda discounted_price metodunda hata fırlatarak özel bir durumu ele aldık. Ancak Liskov’un Yerine Geçme prensibini ihlal etttik ve alışveriş sepetinin toplamını hesaplayan kodumuz, sepette ücretsiz kitap olduğunda hata fırlatır hale geldi.

Ücretsiz Kitap sınıfını indirimli fiyat hesaplama metodunu, taban sınıfta olduğu gibi değer dönecek hale getirerek, Liskov’un Yerine Geçme prensibine uyup, alışveriş sepetinde Ücretli ya da Ücretsiz Kitap olmasından bağımsız olarak toplamı hesaplayacak hale gelebiliriz.

4- Interface segregation principle – Arayüz ayırma prensibi

Bu ilkeye göre bir arayüzü kullanan istemciler, kullanmadığı metodlara bağımlı olmamalıdır. Yazılımı birbirinden bağımsız parçalara bölerek değişiklik ihtiyaçlarını ve yan etkilerini azaltmayı hedeflemektedir.

Kullanıcı işlemlerini gerçekleştiren bir modülümüz olduğunu varsayalım. Giriş, Çıkış, Kayıt olma ve Şifre sıfırlama fonksiyonlarını içeren tek bir KullaniciIslemleri arayüzü tasarlamak yerine,

Bu fonksiyonları aşağıdaki gibi GirisIslemleri, SifreIslemleri ve KayitIslemleri arayüzlerine bölmemiz Arayüz ayırma prensibine uymamızı sağlayacaktır.

5- Dependency inversion principle – Bağımlılığın ters çevrilmesi prensibi

Üst seviye modüllerin alt seviye modüllere bağımlı olamaması, bunun yerine soyutlamalara bağımlı olması ve soyutlamaların detaylara bağımlı olmaması, detayların soyutlamalara bağımlı olmasıdır.

Kullanıcılara eposta ve SMS bildirimleri gönderen bir modülü tasarladığımızı düşünelim. Bildirimleri gönderen KullaniciBilgilendirme sınıfının SMSBildirim ve EpostaBildirim sınıflarına bağımlı olduğu bu tasarım bu ilkeyi ihlal etmektedir.


SMS ve Eposta bildirimlerini Bildirim arayüzü altında soyutlarsak bu bağımlılık ortadan kalkacak ve tasarımımız bu ilkeye uygun hale gelecektir.