SOLID Prensipleri: Temiz Kodun 5 Altın Kuralı
Eğer yazılımla ilgileniyorsanız, çok büyük ihtimalle “Daha temiz kod yazmalıyım” diye düşünmüşsünüzdür. SOLID prensipleri tam da bu noktada devreye giriyor! Bu yazıda, SOLID prensiplerini basit, eğlenceli ve unutulmaz bir şekilde açıklayacağız. Hazırsanız, başlıyoruz!
SOLID Nedir?
SOLID, beş temel prensibin bir araya gelmesiyle oluşurmuş bir kısaltmadır. Ama endişelenmeyin; karışık gibi görünse de basit örneklerle kolayca anlayabilirsiniz.
İşte SOLID prensipleri:
- 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ık Ters Çevirme Prensibi)
1. Single Responsibility Principle (SRP)
Bir sınıfın ya da fonksiyonun tek bir görevi olmalıdır. Düşünün ki bir robotunuz var ve bu robot hem çay yapıyor hem de temizlik yapıyor. Çay yaparken dökülen çayı temizlemeye mi başlayacak? Aman tanrım, kargaşa kaçınılmaz!
Eğlenceli Örnek:
Bir kedi robota ihtiyacımız var.
- SRP’ye uygun robot: Sadece miyavlar.
- SRP’ye uymayan robot: Miyavlama, çay yapma ve temizlik bir arada!
class CatRobot {
meow() {
console.log("Miyav!");
}
}
const myCat = new CatRobot();
myCat.meow();
Gördünüz gibi, robot sadece bir iş yapıyor ve kafalar karışmıyor.
2. Open/Closed Principle (OCP)
Kodunuz geliştime açık, değişime kapalı olmalıdır. Bir düşünün; kahve makinenize bir tuş eklemek istiyorsunuz, ama bunun için tüm cihazı yeniden yapılandırmak zorundasınız. Zor değil mi?
Eğlenceli Örnek: Bir çeşit kahve makinesi:
- OCP’ye uygun makine: Yeni kahve türleri eklenebilir.
- OCP’ye uymayan makine: Yeni bir kahve türü istiyorsanız, makineyi çöpe atın!
class CoffeeMaker {
brew(coffeeType) {
console.log(`${coffeeType} yapılıyor!`);
}
}
const myCoffeeMaker = new CoffeeMaker();
myCoffeeMaker.brew("Latte"); // Latte yapılıyor!
Yeni kahve türü eklemek için sadece brew
metotuna yeni bir parametre geçmek yeterli.
3. Liskov Substitution Principle (LSP)
Bir sınıfın bir üst sınıfın yerine kullanılabilmesi gerekir. Yani, bir kod parçası üst sınıfla çalışıyorsa, alt sınıfla da sorunsuz çalışmalıdır. Mesela, bir araba düşünün; ister spor araba olsun ister kamyon, temel özellikler aynı olmalıdır. (Direksiyon döner, frenler çalışır, vb.)
Eğlenceli Örnek: Bir oyuncak arabamız var:
- LSP’ye uygun: Araba yerine oyuncak araba kullanabiliriz, çünkü aynı özelliklere sahip.
- LSP’ye uymayan: Oyuncak araba uçmaya çalışıyor!
class Car {
drive() {
console.log("Araba sürülüyor.");
}
}
class ToyCar extends Car {
drive() {
console.log("Oyuncak araba sürülüyor.");
}
}
const myCar = new Car();
const myToyCar = new ToyCar();
myCar.drive(); // Araba sürülüyor.
myToyCar.drive(); // Oyuncak araba sürülüyor.
4. Interface Segregation Principle (ISP)
Bir sınıf, sadece kullandığı metotları içermelidir. Mesela, bir televizyon uzaktan kumandaya ihtiyaç duyar ama tost makinesinde kumanda gerekmez. İkisini birleştirirsek kaos olur!
Eğlenceli Örnek:
Bir televizyon kumandası yapıyoruz:
- ISP’ye uygun: Televizyon, kendi ihtiyacı olan tuşlarla gelir.
- ISP’ye uymayan: Tost makinesi için “kanal değiştir” tuşu var!
class Remote {
powerOn() {
console.log("Cihaz açıldı.");
}
}
class TVRemote extends Remote {
changeChannel(channel) {
console.log(`${channel} kanalına geçildi.`);
}
}
const tvRemote = new TVRemote();
tvRemote.powerOn(); // Cihaz açıldı.
tvRemote.changeChannel(7); // 7 kanalına geçildi.
5. Dependency Inversion Principle (DIP)
Yüksek seviyeli modüller, düşük seviyeli modüllere bağlı olmamalıdır; her ikisi de soyutlamalara bağlı olmalıdır. Bir bilgisayarın elektrik kaynağına özelleşmiş bir prizle bağlı olduğunu hayal edin. Farklı bir prizle çalışamaz!
Eğlenceli Örnek:
Bir priz yapıyoruz:
- DIP’ye uygun: Elektrik kaynağı soyutlanmış.
- DIP’ye uymayan: Sadece bir priz tipiyle çalışıyor!
class PowerSource {
providePower() {
console.log("Elektrik sağlanıyor.");
}
}
class Computer {
constructor(powerSource) {
this.powerSource = powerSource;
}
turnOn() {
this.powerSource.providePower();
console.log("Bilgisayar açıldı.");
}
}
const powerSource = new PowerSource();
const myComputer = new Computer(powerSource);
myComputer.turnOn();
Son Söz
SOLID prensipleri, temiz ve bakımı kolay yazılım geliştirmenin anahtarlardır. Her bir prensibi hayatınızdaki eğlenceli örneklerle anlamaya çalışırsanız, yazılım öğrenme yolculuğunuz çok daha kolay ve keyifli hale gelir.
Unutmayın, kod yazmak bir sanattır ve SOLID prensipleri bu sanatın en önemli fırçalarından biridir. Temiz kod yazın, gülümseyin ve eğlenin!