Sorumluluk Zinciri: Karmaşık İş Mantığı için Temiz Kod
Hadi o fonksiyondan bahsedeyim ki rüyalarımı sardı.
Her sistemin, bir noktada kimsenin dokunmak istemediği bir fonksiyonu olur. Küçük başlar: basit bir doğrulama kontrolü, buraya bir if, oraya bir if. Sonra gereksinimler yığılmaya başlar, paydaşlar "sadece bir küçük istisna" der ve aniden 500 satırlık bir canavar karşınızda duruyor — sanki bir komite yazmış gibi (zira öyle yazılmış).
İşte tam bu noktada **Sorumluluk Zinciri** (Chain of Responsibility) deseni devreye giriyor — sihirle değil, disiplinle. Bu klasik tasarım deseninin, en karmaşık iş mantığınızı nasıl çözebileceğini adım adım anlatayım.
Sorumluluk Zinciri Nedir?
Özünde Sorumluluk Zinciri, bir isteği bir dizi işleyici (handler) üzerinden geçirmekle ilgilidir; bunlardan biri isteği işleyene kadar. Müşteri hizmetleri escalation kuyruğunu düşünün — herkes sorununuzu çözmeye çalışır, çözemeyse sıradakine yönlendirir.
Kod terimleriyle: her olası senaryoyu tek bir devasa metotla halletmek yerine, odaklı ve küçük işleyiciler zincirini oluşturursunuz. Her işleyici ya isteği işler ya da zincirdeki bir sonrakine aktarır.
CoR Parladığı Gerçek Dünya Senaryoları
E-Ticaret Sipariş İşleme
Şunu hayal edin: Bir e-ticaret platformu inşa ediyorsunuz ve `processOrder()` fonksiyonunuz indirim kodları, sadakat puanları, mevsimsel kampanyalar, kurumsal hesaplar, VIP statüsü ve özel ortaklıkları yönetmek zorunda. Fonksiyon iç içe koşullarla dolup taşan yüzlerce satıra büyür.
Sorumluluk Zinciriyle ayrı işlemciler yaratırsınız:
```javascript
class DiscountCodeHandler {
handle(order) {
// İndirim mantığını uygula
return next ? next.handle(order) : order;
}
}
class LoyaltyPointsHandler {
handle(order) {
// Sadakat puanlarını uygula
return next ? next.handle(order) : order;
}
}
```
Her işleyici tek bir şeye odaklanır. Test ve bakım çocuk oyuncağı haline gelir.
İçerik Moderasyon Boru Hattı
Sosyal medya platformları karmaşık moderasyon iş akışlarıyla karşı karşıya kalır. Bir gönderi yayına almadan önce topluluk kurallarına göre kontrol edilmeli, nefret söylemi taranmalı, politik içerik için bayraklanmalı, telif ihlali incelenmeli ve yanlış bilgi değerlendirilmeli.
Hepsini tek bir moderasyon fonksiyonuna sıkıştırmak yerine bir boru hattı kurarsınız:
1. **Spam Tespit İşleyicisi** – Açıkça spam olanları süzer
2. **Nefret Söylemi İşleyicisi** – Kötüye kullanım dilini işaretler
3. **Telif İşleyicisi** – Bilinen telifli materyallerle karşılaştırır
4. **Politik İçerik İşleyicisi** – Hassas politik gönderileri yönlendirir
5. **Son İnceleme İşleyicisi** – İnsan moderatör incelemesi
Her adım ya içeriği uygun şekilde işler ya da zincirin altına geçirir.
Ödeme Yetkilendirme Akışı
Ödeme işleme birden fazla doğrulama ve onay katmanı içerir. Tek bir devasa ödeme işlemcisi yerine şu zinciri düşünün:
1. **Dolandırıcılık Tespit İşleyicisi** – Şüpheli işlemleri engeller
2. **Kredi Limiti İşleyicisi** – Yeterli bakiye olduğunu doğrular
3. **Banka Doğrulama İşleyicisi** – Hesap geçerliliğini onaylar
4. **Para Birimi Dönüşüm İşleyicisi** – Uluslararası ödemeleri yönetir
5. **Ödeme Ağ Geçidi İşleyicisi** – Gerçek işlemi gerçekleştirir
Bu yaklaşımla mevcut koda dokunmadan yeni doğrulama adımları eklemek kolaylaşır.
İlk Zincirinizi Uygulamak
İşte JavaScript ile pratik bir uygulama:
```javascript
// Temel işleyici sınıfı
class BaseHandler {
constructor() {
this.nextHandler = null;
}
setNext(handler) {
this.nextHandler = handler;
return handler;
}
handle(request) {
if (this.nextHandler) {
return this.nextHandler.handle(request);
}
return null; // Hiçbir işleyici isteği işlemedi
}
}
// Somut işleyiciler
class AuthenticationHandler extends BaseHandler {
handle(request) {
if (!request.user) {
return { error: 'Kimlik doğrulama gerekli' };
}
console.log('Kimlik doğrulama başarılı');
return super.handle(request);
}
}
class AuthorizationHandler extends BaseHandler {
handle(request) {
if (request.user.role !== 'admin') {
return { error: 'Yetersiz yetki' };
}
console.log('Yetkilendirme başarılı');
return super.handle(request);
}
}
class ValidationHandler extends BaseHandler {
handle(request) {
if (!request.data || Object.keys(request.data).length === 0) {
return { error: 'Geçersiz veri' };
}
console.log('Doğrulama başarılı');
return super.handle(request);
}
}
// Kullanım
const authHandler = new AuthenticationHandler();
const authzHandler = new AuthorizationHandler();
const validationHandler = new ValidationHandler();
authHandler.setNext(authzHandler).setNext(validationHandler);
const result = authHandler.handle({
user: { role: 'admin' },
data: { amount: 100 }
});
```
Gerçekten Önemli Avantajlar
**Bakım Kolaylığı**: Her işleyici bir işi iyi yapar. İş kuralları değiştiğinde sadece ilgili işleyiciyi değiştirirsiniz.
**Test Edilebilirlik**: Birim testleri basitleşir — her işleyiciyi izole test edersiniz, karmaşık senaryoları mocklamak yerine.
**Esneklik**: İşlem sırasını değiştirmek mi istiyorsunuz? Sadece zincir yapılandırmasını değiştirin. Koşullu yönlendirme mi? İşleyicilerinize özel mantık ekleyin.
**Hata Ayıklama**: Bir şeyler ters gittiğinde hangi işleyicinin başarısız olduğunu tam bilirsiniz, çünkü her biri kararını loglar.
Kaçınılması Gereken Yaygın Tuzaklar
İşleyicileri ne çok genel ne de çok özel yapmayın. Her birinin anlamlı bir iş kuralını temsil edeceği bir denge kurun. Ayrıca işleyicilerin zincirdeki konumlarından haberdar olmaları isteğine karşı gelin — odakları kendi sorumluluklarında kalsın, zincirin çalışmasını güvenin.
Unutmayın: Sorumluluk Zinciri tüm koşullu mantığınızı değiştirmek için değil. Birden fazla farklı işlem adımının sırayla gerçekleşmesi gereken karmaşık iş akışlarını organize etmek içindir.
CoR'ü Benimseyen Araçlar ve Framework'ler
Birçok modern framework zaten bu desenin varyasyonlarını uygular:
- **Express.js middleware** ([expressjs.com](https://expressjs.com)) zincir benzeri bir yaklaşım kullanır
- **ASP.NET Core middleware pipeline** benzer prensipleri takip eder
- **Java Servlet Filters** zincir işlemeyi uygular
Framework'ünüz CoR'ü açıkça kullanmasa bile, bu deseni anlamak daha iyi middleware ve interceptor mimarileri tasarlamanıza yardımcı olur.
Sorumluluk Zincirini KULLANMAMANIZ Gereken Durumlar
CoR sihirli bir çözüm değil. Şu durumlardan kaçının:
- İşlem adımları sıkı sıkıya bağlıysa ve her zaman birlikte çalışıyorsa
- Performans kritikse ve metod çağırma maliyetini minimize etmeniz gerekiyorsa
- İşlem sırası önemli değilse veya sabitse
- Üçten az farklı işlem adımınız varsa
Kendi Kod Tabanınızda Çalıştırmak
Projenize Sorumluluk Zinciri eklemeye hazır mısınız? Küçük başlayın:
1. Herkesin dokunmaktan kaçındığı karmaşık bir fonksiyon belirleyin
2. Mantıksal işlem adımlarına ayırın
3. Her adım için ayrı işleyici sınıfları oluşturun
4. Onları bir zincirde birleştirin
5. Diğer alanlara genişletmeden önce kapsamlı test edin
Yatırım, azalmış hata ayıklama süresi ve daha temiz kod incelemeleriyle hızla kendini amorti eder.
SSS
**S: Zincirdeki hataları nasıl yönetirim?**
C: Her işleyici ya isteği başarıyla işlemeli ya da uygun bir istisna fırlatmalıdır. Zincirin sonuna, işlenmeyen istekleri yakalayacak bir hata işleyici eklemeyi düşünün.
**S: İşleyiciler istek geçerken değiştirebilir mi?**
C: Elbette! Bu yaygın bir pratiktir. Her işleyici, sonraki işleyiciler için istek verilerini zenginleştirebilir, doğrulayabilir veya dönüştürebilir.
**S: Asenkron işleme nasıl olur?**
C: Modern uygulamalar genelde async/await kalıplarını destekler. Sadece her işleyicinin zincirdeki sonrakini düzgün bir şekilde beklemesini sağlayın.
**S: Bu Strategy pattern ile nasıl karşılaştırılır?**
C: Strategy birden fazla algoritmadan birini seçerken, Sorumluluk Zinciri isteği işleyen birini bulana kadar birden fazla işleyiciyi sırayla dener.
Sorumluluk Zincirinin güzelliği sadelikindedir. Her mimari sorunu çözmez, ama doğru uygulandığında bakımı imkansız spagetti kodunu, geleceğiniz sizin için minnettar olacak organize, okunabilir mantığa dönüştürür.
Tecnología
Yorumlar (0)
Henüz yorum yapılmamış. İlk yorumu siz yapın!
Yorum Yap