SOLID Prensipleri Uygulamak: Refactoring Rehberi

SOLID, yazılımın bakımını ve genişletilmesini kolay kılan beş tasarım ilkesidir. Bir e-ticaret sisteminde ödeme işlemini ele alarak, her prensip nasıl uygulanır görelim.

İlk sorun: Bir Payment sınıfı, tüm ödeme yöntemlerini içeriyor ve her yeni yöntem eklendiğinde değişiyor. Bu, Single Responsibility (Tek Sorumluluk) ilkesini ihlal eder.

1// Kötü tasarım
2public class Payment
3{
4public void ProcessCreditCard(string cardNumber, decimal amount)
5{
6// Kredi kartı işlemi
7}
8
9public void ProcessPayPal(string email, decimal amount)
10{
11// PayPal işlemi
12}
13
14public void ProcessBitcoin(string wallet, decimal amount)
15{
16// Bitcoin işlemi
17}
18}

Bu sınıf üç farklı sorumluluk taşıyor. Refactor edelim. Önce bir arayüz tanımlayıp (Dependency Inversion), her ödeme yöntemi kendi sınıfında yaşasın.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1// İyi tasarım
2public interface IPaymentProcessor
3{
4void Process(decimal amount);
5}
6
7public class CreditCardProcessor: IPaymentProcessor
8{
9private string _cardNumber;
10
11public CreditCardProcessor(string cardNumber)
12{
13_cardNumber = cardNumber;
14}
15
16public void Process(decimal amount)
17{
18Console.WriteLine($"Kredi kartı ile {amount} TL işlendi: {_cardNumber}");
19}
20}
21
22public class PayPalProcessor: IPaymentProcessor
23{
24private string _email;
25
26public PayPalProcessor(string email)
27{
28_email = email;
29}
30
31public void Process(decimal amount)
32{
33Console.WriteLine($"PayPal ile {amount} TL işlendi: {_email}");
34}
35}
36
37public class Order
38{
39private IPaymentProcessor _processor;
40
41public Order(IPaymentProcessor processor)
42{
43_processor = processor;
44}
45
46public void Checkout(decimal amount)
47{
48_processor.Process(amount);
49}
50}
51
52// Kullanım
53var creditCard = new CreditCardProcessor("1234-5678-9012-3456");
54var order = new Order(creditCard);
55order.Checkout(150);
56
57var paypal = new PayPalProcessor("user@example.com");
58var order2 = new Order(paypal);
59order2.Checkout(200);

Beklenen çıktı:

1Kredi kartı ile 150 TL işlendi: 1234-5678-9012-3456
2PayPal ile 200 TL işlendi: user@example.com

Bu refactoring üç prensibi birden uyguladı. Her sınıf tek bir sorumluluk taşıyor (S). Yeni bir ödeme yöntemi eklemek çok kolay, sadece IPaymentProcessor'ı implemente et ve Order'ı değiştirme (O - Open/Closed). Sınıflar arayüze bağlı, somut uygulamaya değil (D - Dependency Inversion).

Sık yapılan hata: Arayüzü çok büyük yapmak. Her işlem için ayrı arayüz düşün. Bir başka hata da, sınıfları hemen test etmeyi unutmak, SOLID tasarımı unit testleri çok kolay hale getirir.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz