# SOLID Prensipleri
Yazılım geliştirme sürecinde kaliteli, esnek ve sürdürülebilir bir kod yazmak, yazılım mühendisliği alanında en temel hedeflerden biridir. SOLID prensipleri, yazılım geliştirme sürecinde daha temiz, okunabilir ve bakımı kolay kodlar yazmayı hedefleyen bir dizi prensiptir. Bu prensipler, Robert C. Martin tarafından ortaya atılmış ve yazılım tasarımında daha iyi bir yapı sağlamak amacıyla geliştirilmiştir. Bu yazımızda, SOLID prensiplerini ayrıntılı bir şekilde ele alacağız.
1.Tek Sorumluluk Prensibi (Single Responsibility Principle — SRP)
Bu prensibe göre, bir sınıfın veya modülün yalnızca bir sorumluluğu olmalıdır. Yani, bir sınıfın değişiklik nedeni sadece bir olmalıdır. Bu prensip, kodun daha okunabilir ve bakımı daha kolay hale gelmesini sağlar.
Örnek olarak, bir kullanıcı sınıfı düşünelim. Bu sınıfın hem kullanıcı bilgilerini yönetmesi hem de veritabanı işlemlerini yapması SRP’ye aykırıdır. Bu durumu iki ayrı sınıfa bölmek, kodun daha anlaşılır ve değiştirilebilir olmasını sağlar.
User sınıfı yalnızca bir kullanıcının temel bilgilerini içerir ve kullanıcıyı veritabanına kaydetme ve e-posta gönderme işlemleri için ayrı metodlara sahiptir.
2. Açık Kapalı Prensibi (Open/Closed Principle — OCP)
Bu prensibe göre, bir yazılım birimi (sınıf, modül, fonksiyon, vb.) genişletilebilir olmalı, ancak değiştirilemez olmalıdır. Yani, yeni işlevselliği eklemek için mevcut kodu değiştirmek yerine, kodu genişletebilmeliyiz.
Örneğin, bir şekilde çeşitli ödeme yöntemleri ekleyen bir sistem düşünelim. OCP’ye uygun bir şekilde, yeni bir ödeme yöntemi eklemek için mevcut ödeme işlem koduna dokunmadan, yeni bir sınıf ekleyebiliriz.
3. Liskov Yerine Koyma Prensibi (Liskov Substitution Principle — LSP)
Bu prensibe göre, bir üst türün nesneleri, alt türün nesneleriyle yer değiştirdiğinde programın doğru çalışmaya devam etmesi gerekir. Yani, alt sınıflar, üst sınıfların yerine kullanılabilir olmalıdır.
Bu prensip, miras almayı doğru bir şekilde kullanmayı vurgular. Alt sınıfların, üst sınıfların özelliklerini ve davranışlarını sürdürmesi önemlidir.
Rectangle ve Square sınıfları, ortak bir üst sınıf olan Shape sınıfından türemektedir ve LSP’ye uymaktadır.
4.Arayüz Ayırma Prensibi (Interface Segregation Principle — ISP)
Bu prensibe göre, bir sınıfın ihtiyaç duymadığı metodları içeren bir arayüzü uygulamaması gerekir. Yani, bir sınıfın kullandığı metodları içeren özel arayüzler oluşturmalıyız.
Ayrıca bir sınıfın sadece ihtiyaç duyduğu metotları içeren arayüzlerle ilişkilendirilmesini sağlar. Böylece, sınıflar sadece kullandıkları metodları uygulamak zorunda kalır.
Human sınıfı yalnızca ihtiyaç duyduğu metotları içeren arayüzleri uygular.
5.Bağımlılıkların Ters Çevrilmesi Prensibi (Dependency Inversion Principle — DIP)
Bu prensibe göre, üst seviye modüller, alt seviye modüllere bağımlı olmamalıdır. Her ikisi de soyuta bağlı olmalıdır. Soyutlamalar ise detaylara bağlı olmamalı, detaylar soyuta bağlı olmalıdır.
Bu prensip, kodun daha esnek ve değiştirilebilir olmasını sağlar. Yani, alt seviye modüllerin değişmesi üst seviye modülleri etkilememelidir.
Notification sınıfı, MessageService arayüzü üzerinden bağımlılığı tersine çevirir ve bu sayede daha esnek bir tasarım elde ederiz.
Sonuç :
SOLID prensipleri, yazılım mühendisliği dünyasında temel taşlar olarak kabul edilir ve bu prensiplere uygun yazılmış kodlar, uzun vadeli bakım ve geliştirme süreçlerinde avantaj sağlar. Bu prensipleri anlamak ve uygulamak, yazılım geliştiricilerin daha etkili ve sürdürülebilir yazılım tasarımları oluşturmalarına yardımcı olabilir.