Clean Architecture: Yazılımın Omurgasını Yeniden Keşfetmek

Clean Architecture: Yazılımın Omurgasını Yeniden Keşfetmek

🧱 Clean Architecture: Yazılımın Omurgasını Yeniden Keşfetmek

“Bir mimarinin en büyük amacı, değişime karşı dayanıklı olmaktır.”
— Robert C. Martin (Uncle Bob)


🧭 1️⃣ Giriş: Mimari Nedir, Neden Vardır?

Birçok geliştirici için “mimari” sadece katmanlardan ibaret görünür:
Controller → Service → Repository → Database.
Ama bu bir katman dizisi değildir — bu sadece bir akıştır.

Gerçek anlamda mimari;

  • Zamana karşı direnen,
  • Teknolojiden bağımsız kalabilen,
  • Davranışı (iş mantığını) veriden (altyapıdan) ayıran bir yapıdır.

Yani Clean Architecture’ın amacı:

“Kodun yönünü tersine çevirmek.”


🧩 2️⃣ Tarihsel Gelişim

Clean Architecture bir anda ortaya çıkmadı.
Aslında yazılım mimarisi evriminin ürünüdür.

Dönem Mimari Yaklaşım Temel Fikir Zayıf Noktası
1980s Layered Architecture UI – Business – Data Sıkı bağımlılıklar
1990s N-Tier Architecture Sunucu katmanları ayrımı Teknik odaklı, domain kayboldu
2000s Hexagonal (Ports & Adapters) Domain merkeze alındı Uygulaması karmaşık
2010s Onion Architecture Domain & Core merkezde Infrastructure soyutlandı
2012+ Clean Architecture Tüm kavramların birleşimi Öğrenme eğrisi yüksek

Clean Architecture, Onion ve Hexagonal mimarinin birleşimidir, ama bir adım ötesine geçer:
Yönelim sadece bağımlılıkların yönünü değil, sorumlulukların sınırını da tanımlar.


🧠 3️⃣ Clean Architecture’ın Kalbi: Dependency Rule

“Hiçbir şey, merkezdeki katmanlara bağımlı olamaz.
Bağımlılıklar her zaman içeriye akar.”

Yani:

  • Domain (iş mantığı) hiçbir şeye bağlı değildir.
  • Application sadece domain arabirimlerini kullanır.
  • Infrastructure ve UI bağımlıdır, ama dışta kalır.

Bu yön, zamanla kırılmayan kodun temelidir.


⚙️ 4️⃣ Katmanlar ve Sorumlulukları

Katman Açıklama Örnek Dosyalar
Entities (Domain) İş kuralları, saf modeller, aggregate’ler Order, User, Quiz, ValueObjects
Use Cases (Application) Domain’i kullanan iş senaryoları CreateOrderHandler, ScheduleQuizCommand
Interface Adapters Use Case’leri dış dünyaya bağlar Controllers, Presenters, Gateways
Frameworks & Drivers (Infrastructure) Veritabanı, API, Message Broker EFCoreRepository, RedisScheduler, KafkaBus

Bu yapı sadece bir dizayn deseni değil —
bağımlılık akışının garantisidir.


🧱 5️⃣ Bağımlılık Kuralları: Gerçek Yönler

Infrastructure  →  Application  →  Domain
Presentation    →  Application  →  Domain

Ters bağımlılık prensibi:

  • Domain, Application dışındaki hiçbir şeye dokunmaz.
  • Application, sadece abstraction kullanır.
  • Infrastructure, bu abstraction’ları uygular.

Örnek:

// Application katmanında
public interface IOrderRepository
{
    Task SaveAsync(Order order);
    Task<Order> GetByIdAsync(Guid id);
}
// Infrastructure katmanında
public class EfOrderRepository : IOrderRepository
{
    private readonly AppDbContext _context;
    public Task SaveAsync(Order order) => _context.Orders.AddAsync(order);
}

Domain “OrderRepository”nin var olduğunu bilir, ama nasıl olduğunu bilmez.
Infrastructure ise nasıl kısmını çözer, ama neden kısmını bilmez.


🧩 6️⃣ Clean Architecture ≠ Katmanlı Mimari

Birçok kişi Clean Architecture’ı klasik “3 katmanlı” modelle karıştırır.
Ancak fark katmanların yönünde değil, bağımlılık akışındadır.

Özellik 3-Tier Clean Architecture
Bağımlılıklar Yukarıdan aşağı Dıştan içe
Odak Teknoloji Domain
Test edilebilirlik Zor Kolay
Değişime direnç Düşük Yüksek
UI değişimi Riskli Kolay
DB değişimi Riskli Kolay

🧠 7️⃣ SOLID ve Clean Architecture

Clean Architecture sadece katmanlardan ibaret değildir;
SOLID prensiplerinin mimari seviyedeki yansımasıdır.

SOLID Prensibi Mimari Karşılığı
S – Single Responsibility Her katman tek bir amaca hizmet eder
O – Open/Closed Use Case’ler yeni özelliklere açık, değişime kapalı
L – Liskov Substitution Interface Adapters soyutlamaları güvenli
I – Interface Segregation Her modül kendi abstraction’ını kullanır
D – Dependency Inversion Tüm bağımlılıklar Domain/Application’a değil, abstraction’lara yönelir

🔍 8️⃣ Clean Architecture + DDD = Kusursuz Uyum

Domain Driven Design (DDD), Clean Architecture’ın doğal partneridir.
Çünkü ikisi de “iş mantığı merkezdedir” der.

DDD Kavramı Clean Architecture Katmanı
Entity / Value Object Domain
Aggregate / Domain Service Domain
Application Service / Command Handler Application
Repository Interface Adapter / Infrastructure
Domain Event Application / Messaging

Yani Clean Architecture, DDD’nin teknik kabını oluşturur.


🧩 9️⃣ Clean Architecture’ın Gerçek Hayatta Önemi

1️⃣ Framework bağımlılığını azaltır

Hiçbir iş kuralı Entity Framework veya ASP.NET Core’a bağımlı değildir.
Yarın farklı ORM veya web framework’üne geçebilirsin.

2️⃣ Test edilebilirliği arttırır

Domain + Application katmanları saf C# sınıflarıdır.
Test etmek için veritabanına ihtiyaç yoktur.

3️⃣ Değişime dayanıklıdır

UI’yi Blazor’dan React’a, veritabanını PostgreSQL’den MongoDB’ye çevirebilirsin —
iş mantığın etkilenmez.

4️⃣ Takım ölçeklenebilirliğini kolaylaştırır

Her ekip farklı katman veya modül üzerinde bağımsız çalışabilir.
(Özellikle modüler monolith mimarilerde mükemmel çalışır.)


⚙️ 10️⃣ Clean Architecture ve Infrastructure

Infrastructure “gereklidir” ama “önemsizdir”.
Çünkü teknoloji gelir geçer; iş mantığı kalır.

Infrastructure sadece uygulama için gereklidir, domain için değil.

Örnek:

  • EFCore, Redis, Kafka, Elasticsearch, SMTP, HTTP Client, gRPC...
  • Tümü Infrastructure’dadır.
  • Domain ve Application bu araçları sadece abstraction olarak bilir.

🧱 11️⃣ Clean Architecture’ın Anti-Pattern’leri

Anti-pattern Açıklama Neden Tehlikeli
Fat Controller Controller içinde iş mantığı Presentation sızar
Fat Service Application Service her şeyi yapar Use Case sınırları bulanık
Domain bağımlı EF Core attribute’ları [Table], [ForeignKey] Domain’de Persistence sızması
Static helper’lar Global state yaratır Test edilemezlik
Doğrudan ILogger kullanımı (ör. hot path) Async pattern kırılır Performans düşer

🚀 12️⃣ Clean Architecture’ın Evrimi: Modern Yaklaşımlar

Bugün Clean Architecture artık statik bir model değil,
dinamik bir yaklaşıma dönüşmüş durumda.

Yaklaşım Ne ekler
CQRS Command ve Query ayrımı
Event Sourcing Uygulama durumunu event’lerle tutmak
Modular Monolith Domain sınırlarını modüllerle belirlemek
Feature Flags / Configurable Pipelines Davranış değişimini koddan bağımsız hale getirmek
Cross-cutting Observability (BufferedLogger) Performans kaybı olmadan gözlemlenebilirlik

Clean Architecture artık sadece “katman” değil, bir düşünme biçimi.


🧩 13️⃣ Sonuç: Gerçek Temizlik

Clean Architecture sana şunu öğretir:

“Kodun değil, bağımlılığın temiz olmalı.”

Bir mimari:

  • Veritabanı değişse bile sağlam kalıyorsa,
  • UI framework’ü değişse bile iş kuralları korunuyorsa,
  • Logging stratejisi değiştiğinde bile business logic etkilenmiyorsa,
    o zaman gerçekten temizdir.

📚 14️⃣ Özet: Clean Architecture Öz Kimliği

Alan Tanım
Amaç Değişime dayanıklı yazılım üretmek
Köken Onion + Hexagonal + DDD birleşimi
Prensip Bağımlılıklar merkeze akar
Odak Domain iş kuralları
Yarar Framework bağımsızlık, test edilebilirlik, uzun ömür
Uygulama Alanı API, Monolith, Microservice, Serverless hepsi

🔮 15️⃣ Epilog: Clean ≠ Pretty

Clean Architecture, “güzel” kodla ilgili değildir.
“Dayanıklı”, “bağımsız” ve “uzun ömürlü” kodla ilgilidir.

Ve tıpkı iyi bir bina gibi,
güzelliği dıştan değil, taşıyıcı kolonlarından gelir.


“Architecture is about intent and isolation, not about folders.”
— DotNet Senior Developer (C#)


admin

Leave a Reply

Your email address will not be published. Required fields are marked *