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önemMimari YaklaşımTemel FikirZayıf Noktası
1980sLayered ArchitectureUI – Business – DataSıkı bağımlılıklar
1990sN-Tier ArchitectureSunucu katmanları ayrımıTeknik odaklı, domain kayboldu
2000sHexagonal (Ports & Adapters)Domain merkeze alındıUygulaması karmaşık
2010sOnion ArchitectureDomain & Core merkezdeInfrastructure soyutlandı
2012+Clean ArchitectureTü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ı

KatmanAçıklamaÖrnek Dosyalar
Entities (Domain)İş kuralları, saf modeller, aggregate’lerOrder, User, Quiz, ValueObjects
Use Cases (Application)Domain’i kullanan iş senaryolarıCreateOrderHandler, ScheduleQuizCommand
Interface AdaptersUse Case’leri dış dünyaya bağlarControllers, Presenters, Gateways
Frameworks & Drivers (Infrastructure)Veritabanı, API, Message BrokerEFCoreRepository, 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.

Özellik3-TierClean Architecture
BağımlılıklarYukarıdan aşağıDıştan içe
OdakTeknolojiDomain
Test edilebilirlikZorKolay
Değişime dirençDüşükYüksek
UI değişimiRiskliKolay
DB değişimiRiskliKolay

🧠 7️⃣ SOLID ve Clean Architecture

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

SOLID PrensibiMimari Karşılığı
S – Single ResponsibilityHer katman tek bir amaca hizmet eder
O – Open/ClosedUse Case’ler yeni özelliklere açık, değişime kapalı
L – Liskov SubstitutionInterface Adapters soyutlamaları güvenli
I – Interface SegregationHer modül kendi abstraction’ını kullanır
D – Dependency InversionTü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 ObjectDomain
Aggregate / Domain ServiceDomain
Application Service / Command HandlerApplication
RepositoryInterface Adapter / Infrastructure
Domain EventApplication / 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-patternAçıklamaNeden Tehlikeli
Fat ControllerController içinde iş mantığıPresentation sızar
Fat ServiceApplication Service her şeyi yaparUse Case sınırları bulanık
Domain bağımlı EF Core attribute’ları[Table], [ForeignKey] Domain’dePersistence sızması
Static helper’larGlobal state yaratırTest edilemezlik
Doğrudan ILogger kullanımı (ör. hot path)Async pattern kırılırPerformans 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şımNe ekler
CQRSCommand ve Query ayrımı
Event SourcingUygulama durumunu event’lerle tutmak
Modular MonolithDomain sınırlarını modüllerle belirlemek
Feature Flags / Configurable PipelinesDavranış 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

AlanTanım
AmaçDeğişime dayanıklı yazılım üretmek
KökenOnion + Hexagonal + DDD birleşimi
PrensipBağımlılıklar merkeze akar
OdakDomain iş kuralları
YararFramework 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 *