SOLID: Yazılım Tasarımında 5 Önemli Prensip

7

Kübra Yılmaz

 8 dk. ·  28 Ağu

42kraft
İÇİNDEKİLER
BU YAZIYI PAYLAŞIN

Yazılım geliştirme sürecinde SOLID prensipleri, kodun kalitesini ve sürdürülebilirliğini sağlamak için büyük önem taşır. Bu prensipler, yazılım tasarımında esneklik, okunabilirlik ve bakım kolaylığı sağlamak amacıyla geliştirilmiş beş temel ilkeyi içerir. Bu blog yazısında, SOLID prensiplerinin ne olduğunu, her bir prensibin neyi ifade ettiğini ve yazılım projelerinizde nasıl uygulanabileceğini detaylı bir şekilde ele alacağız. Yazılım geliştirme süreçlerinizi daha etkili ve verimli hale getirmek için SOLID prensiplerinin gücünü keşfetmeye hazır mısınız?

SOLID Nedir?

SOLID prensipleri, yazılım mühendisliği alanında kaliteli ve sürdürülebilir kod yazma konusunda rehberlik eden beş temel ilkedir. Bu prensipler, yazılım tasarımında esneklik, okunabilirlik ve bakım kolaylığı sağlamak amacıyla geliştirilmiştir. Robert C. Martin tarafından ortaya atılan SOLID prensipleri, nesne yönelimli programlamanın temel taşlarından biri haline gelmiştir. SOLID, beş ayrı ilkenin baş harflerinden oluşan bir akronimdir:

  • Single Responsibility Principle (Tek Sorumluluk Prensibi)
  • Open/Closed Principle (Açık/Kapalı Prensibi)
  • Liskov Substitution Principle (Liskov Yerine Geçme Prensibi)
  • Interface Segregation Principle (Arayüz Ayrımı Prensibi)
  • Dependency Inversion Principle (Bağımlılığı Tersine Çevirme Prensibi)

Bu prensipler, yazılım geliştiricilerin daha modüler, esnek ve bakımı kolay kod yazmalarına yardımcı olur. Her bir prensip, yazılım projelerinin uzun ömürlü olmasını ve değişen gereksinimlere hızlıca uyum sağlamasını sağlar. Nesne yönelimli programlamada (OOP), SOLID prensiplerinin kullanımı özellikle önemlidir. OOP, nesneler ve sınıflar aracılığıyla kodun modüler ve yeniden kullanılabilir olmasını sağlar. SOLID prensiplerinin derinlemesine anlaşılması ve uygulanması, yazılım projelerinizin başarısını artırmak için kritik öneme sahiptir.

SOLID Prensipleri ve Bağlantı (Coupling) Kavramı

Yazılım geliştirme sürecinde, bağlantı (coupling) kavramı büyük önem taşır. Bağlantı, bir sınıfın veya modülün diğer sınıflara veya modüllere ne kadar bağımlı olduğunu ifade eder. İki tür bağlantı vardır: sıkı bağlantı (tight coupling) ve gevşek bağlantı (loose coupling).

Sıkı Bağlantı (Tight Coupling)

Sıkı bağlantı, bir sınıfın başka bir sınıfa veya modüle çok fazla bağımlı olduğu durumu ifade eder. Bu durumda, bir sınıfta yapılan değişiklikler diğer sınıfları da etkileyebilir, bu da kodun bakımını zorlaştırır ve hatalara yol açabilir. Sıkı bağlantı, yazılımın esnekliğini ve yeniden kullanılabilirliğini azaltır.

Gevşek Bağlantı (Loose Coupling)

Gevşek bağlantı, bir sınıfın başka bir sınıfa veya modüle minimal düzeyde bağımlı olduğu durumu ifade eder. Bu, sınıflar arasındaki bağımlılıkların azaltılması anlamına gelir. Gevşek bağlantı, kodun daha esnek, test edilebilir ve bakımının kolay olmasını sağlar. Yazılım geliştirme sürecinde gevşek bağlantının sağlanması, kodun sürdürülebilirliği açısından kritik öneme sahiptir.

SOLID Prensipleri

S: Single Responsibility Principle (Tek Sorumluluk Prensibi)

Tek Sorumluluk Prensibi, bir sınıfın veya nesnenin yalnızca bir tek sorumluluğu olması gerektiğini savunur. Bu, her sınıfın yalnızca bir amaca hizmet etmesi anlamına gelir. Sorumlulukların ayrılması, kodun daha okunabilir, test edilebilir ve bakımının kolay olmasını sağlar.

Örnek:
 Single Responsibility Principle
Single Responsibility Principle

Bu örnekte, User sınıfı sadece kullanıcı bilgilerini depolar. UserRepository sınıfı, kullanıcıyı veri tabanına kaydetme işlemlerinden sorumludur. EmailService sınıfı ise e-posta gönderme işlemlerini yönetir. Böylece her sınıfın tek bir sorumluluğu vardır ve bu sorumluluklar net bir şekilde ayrılmıştır.

O: Open/Closed Principle (Açık/Kapalı Prensibi)

Açık/Kapalı Prensibi, bir sınıfın veya nesnenin genişletilmeye açık, ancak değiştirilmeye kapalı olması gerektiğini belirtir. Bu prensip, mevcut kodu değiştirmeden yeni özellikler ekleyebilmenizi sağlar. Bu da yazılımın daha sağlam ve güvenilir olmasına yardımcı olur.

Örnek:
Open/Closed Principle
Open/Closed Principle

Bu örnekte, Shape sınıfı genişletilmeye açıktır. Yeni şekiller eklemek için Shape sınıfından türeyen yeni sınıflar oluşturabiliriz. Mevcut Rectangle ve Circle sınıflarını değiştirmeye gerek kalmadan, yeni bir şekil ekleyebiliriz. Örneğin, Triangle sınıfı oluşturup Shape sınıfını miras alarak kolayca genişletebiliriz.

L: Liskov Substitution Principle (Liskov Yerine Geçme Prensibi)

Liskov Yerine Geçme Prensibi, bir alt sınıfın, üst sınıfın yerine geçebilmesi gerektiğini belirtir. Bu, alt sınıfların üst sınıfların beklediği şekilde davranması gerektiği anlamına gelir. Eğer bir alt sınıf, üst sınıfın beklenen davranışlarını değiştirmiyorsa, bu prensip sağlanmış olur.

Örnek:
Liskov Substitution Principle
Liskov Substitution Principle

Bu örnekte, Sparrow sınıfı Bird sınıfının yerine geçebilir, çünkü Fly metodunu doğru bir şekilde uygular. Ancak, Ostrich sınıfı uçamadığı için Fly metodunu override etmeyerek, Liskov Yerine Geçme Prensibini ihlal etmez. Bu durumda, Ostrich sınıfı Bird sınıfından türememeli, çünkü Fly metodu Bird sınıfının temel bir davranışıdır ve tüm türetilmiş sınıfların bunu desteklemesi beklenir.

I: Interface Segregation Principle (Arayüz Ayrımı Prensibi)

Arayüz Ayrımı Prensibi, büyük arayüzlerin daha küçük ve spesifik arayüzlere bölünmesini önerir. Bu, bir sınıfın kullanmadığı yöntemleri içeren büyük arayüzleri implement etmesini önler. Küçük ve spesifik arayüzler, yazılımın esnekliğini ve bakımını kolaylaştırır.

Örnek:
Interface Segregation Principle
Interface Segregation Principle

Bu örnekte, IWorker ve IEater arayüzleri ayrı olarak tanımlanmıştır. Robot sınıfı sadece IWorker arayüzünü implement ederken, Human sınıfı her iki arayüzü de implement eder. Bu sayede, Robot sınıfı gereksiz Eat metodunu implement etmek zorunda kalmaz.

D: Dependency Inversion Principle (Bağımlılığı Tersine Çevirme Prensibi)

Bağımlılığı Tersine Çevirme Prensibi, üst düzey modüllerin alt düzey modüllere bağımlı olmaması gerektiğini savunur. Bunun yerine, her iki modül de soyutlamalara bağımlı olmalıdır. Bu, değişikliklerin kod tabanını daha az etkilemesini sağlar ve yazılımın test edilebilirliğini artırır.

Örnek:
Dependency Inversion Principle
Dependency Inversion Principle

Bu örnekte, Notification sınıfı doğrudan EmailSender veya SmsSender sınıflarına bağımlı değildir. Bunun yerine, IMessageSender arayüzüne bağımlıdır. Böylece, farklı mesaj gönderme yöntemlerini kolayca değiştirebiliriz. Örneğin, bir PushNotificationSender sınıfı ekleyerek, Notification sınıfını değiştirmeden yeni bir mesaj gönderme yöntemi ekleyebiliriz.

Bu blogda, prensipleri açıklarken C# dilini kullandım. PHP örneklerini görmek için ise buradaki bloga göz atabilirsiniz.

Özetle; Yazılım geliştirmede SOLID prensipleri, kodun esnek, modüler ve bakımı kolay olmasını sağlayan temel taşlardır. Bu prensipler, sıkı bağlantıyı azaltarak yazılımın daha sürdürülebilir ve test edilebilir hale gelmesini sağlar. Her bir SOLID prensibi, yazılım projelerinizin kalitesini artırmak ve karmaşıklığı yönetmek için kritik öneme sahiptir. SOLID prensiplerini benimseyerek, daha güvenilir ve etkili yazılım çözümleri üretebilir, projelerinizde uzun vadeli başarıyı garantileyebilirsiniz.

Daha fazlası için blog sayfamızı ziyaret edebilirsiniz.

42kraft


# İlginizi çekebilecek diğer içerikler
İlginizi çekebilecek diğer içerikler