CB DIGITAL
Tüm Makalelere Dön
Yazılım Mimari
3 Mart 2026
5 dakika okuma süresi

DDD (Domain Driven Design) ile Karmaşık Sistemleri Modelleme

Cengiz Bozdemir
Cengiz BozdemirKurumsal Yazılım Mimarı
DDD (Domain Driven Design) ile Karmaşık Sistemleri Modelleme

DDD (Domain Driven Design) ile Karmaşık Sistemleri Modelleme: Stratejik ve Taktiksel Bir Yaklaşım

Günümüz yazılım dünyasında sistemler, yalnızca veri depolayan ve bu verileri kullanıcıya sunan basit yapılar olmaktan çıkmıştır. Modern işletmelerin ihtiyaçları, karmaşık iş kuralları, çok katmanlı operasyonel süreçler ve sürekli değişen pazar dinamikleri ile şekillenmektedir. Bu karmaşıklığı yönetmek için geliştirilen en etkili metodolojilerden biri olan Domain Driven Design (Etki Alanı Odaklı Tasarım), yazılım geliştirme sürecini teknoloji merkezinden çıkarıp iş mantığı (domain) merkezine yerleştirir. Eric Evans tarafından 2003 yılında literatüre kazandırılan bu yaklaşım, özellikle büyük ölçekli ve kurumsal projelerde sürdürülebilirliği sağlamak adına vazgeçilmez bir rehber niteliğindedir.

DDD, yazılımın karmaşıklığını iki ana koldan ele alır: Strategic Design (Stratejik Tasarım) ve Tactical Design (Taktiksel Tasarım). Stratejik tasarım, büyük resmi görmemizi ve sistemi mantıksal parçalara bölmemizi sağlarken; taktiksel tasarım, bu parçaların içindeki kod yapısının nasıl kurgulanacağına odaklanır. Bu makalede, karmaşık sistemleri modellerken DDD prensiplerini nasıl uygulayacağımızı derinlemesine inceleyeceğiz.

Stratejik Tasarım: Karmaşıklığı Parçala ve Yönet

Karmaşık bir sistemi tek bir blok olarak ele almak, zamanla "Big Ball of Mud" (Büyük Çamur Yığını) olarak adlandırılan, bakımı imkansız yapılara yol açar. DDD’nin stratejik tasarımı, bu kaosu önlemek için bize üç temel araç sunar: Ubiquitous Language, Bounded Context ve Context Mapping.

Ubiquitous Language (Ortak Dil), DDD'nin kalbidir. Yazılım geliştiriciler ile iş birimi uzmanlarının (domain experts) aynı dili konuşmasını savunur. Eğer bir iş analisti "sipariş iptali" terimini kullanıyorsa, bu terim sadece dökümanlarda değil, kodun içindeki sınıflarda, metotlarda ve veritabanı şemalarında da aynen yer almalıdır. Bu, çeviri hatalarını minimize eder ve teknik ekibin iş süreçlerini tam anlamıyla içselleştirmesini sağlar.

Bounded Context (Sınırlandırılmış Bağlam), bir modelin geçerli olduğu sınırları çizer. Büyük bir e-ticaret sistemini düşünelim. "Ürün" kavramı, stok yönetimi bağlamında ağırlık ve raf numarası ile tanımlanırken; satış bağlamında fiyat ve kampanya bilgileriyle tanımlanır. Bu iki farklı bakış açısını tek bir devasa "Product" sınıfında toplamak yerine, her bağlam için ayrı modeller oluşturmak karmaşıklığı radikal bir şekilde azaltır. Her Bounded Context, kendi Ubiquitous Language yapısına sahip bağımsız bir dünyadır.

Context Mapping ise bu farklı bağlamların birbiriyle nasıl etkileşime gireceğini belirler. İki sistem arasında bir "Customer/Supplier" (Müşteri/Tedarikçi) ilişkisi mi var, yoksa bir "Shared Kernel" (Paylaşılan Çekirdek) mi kullanılıyor? Bu haritalama, ekipler arası iletişimi ve veri akışını standardize eder.

Taktiksel Tasarım: Modelin İnşası

Stratejik sınırlar çizildikten sonra, bu sınırların içindeki iş mantığını kod seviyesinde nasıl modelleyeceğimize karar vermemiz gerekir. Taktiksel tasarım desenleri, Domain Model'in bütünlüğünü ve tutarlılığını korumak için kullanılır.

Entities (Varlıklar): Kimliği olan nesnelerdir. Bir kullanıcının adı veya adresi değişse bile o kullanıcı hala aynı kişidir. Bu tür nesneler, ömürleri boyunca takip edilen benzersiz bir kimliğe (ID) sahiptir. Entity tasarımı yapırken, nesnenin sadece veri taşıyıcısı (Anemic Model) olmamasına, aynı zamanda kendi davranışlarını (metotlarını) barındırmasına dikkat edilmelidir.

Value Objects (Değer Nesneleri): Kimliği olmayan, sadece taşıdıkları değerlerle tanımlanan nesnelerdir. Örneğin, bir "Para Birimi" veya "Adres" yapısı değer nesnesidir. İki adresin tüm alanları aynıysa, bunlar aynı kabul edilir. Value Objects değiştirilemez (immutable) olmalıdır; bir değer değişecekse nesne tamamen yeniden oluşturulur. Bu yaklaşım, yan etkileri (side effects) azaltır ve sistemin test edilebilirliğini artırır.

Aggregates ve Aggregate Roots: DDD'nin en kritik kavramlarından biridir. Aggregate, bir bütün olarak ele alınan ilişkili nesneler kümesidir. Her aggregate'in bir Aggregate Root'u (Kök Varlık) vardır. Dış dünya, aggregate içindeki nesnelere sadece bu kök üzerinden erişebilir. Örneğin, bir "Sipariş" (Order) bir aggregate köküdür; "Sipariş Satırları" (OrderItems) ise bu aggregate'in parçasıdır. Sipariş satırına doğrudan müdahale edilemez; tüm işlemler Order nesnesi üzerinden geçmelidir. Bu, veri tutarlılığını (invariants) korumak için hayati önem taşır.

Domain Services: Bazen bir iş mantığı tek bir nesneye ait değildir. Birden fazla nesneyi içeren karmaşık hesaplamalar veya süreçler için Domain Services kullanılır. Ancak burada dikkat edilmesi gereken, iş mantığının tamamen servislere kaydırılıp nesnelerin içinin boşaltılmamasıdır.

Domain Events (Etki Alanı Olayları): Sistemde iş açısından önemli bir durum gerçekleştiğinde (örneğin "Sipariş Onaylandı"), bu durumu diğer sistemlere veya bağlamlara duyurmak için kullanılır. Domain Events, sistemler arasındaki bağımlılığı (coupling) azaltır ve asenkron süreçlerin yönetilmesini sağlar.

Karmaşık Sistemlerde Veri Tutarlılığı ve Altyapı

DDD uygularken karşılaşılan en büyük zorluklardan biri, teknik altyapı ile iş mantığını birbirinden ayırmaktır. Hexagonal Architecture (Altıgen Mimari) veya Clean Architecture gibi yaklaşımlar, DDD ile mükemmel bir uyum içindedir. Bu mimarilerde, Domain Layer (Etki Alanı Katmanı) merkeze yerleştirilir ve veritabanı, API veya dosya sistemi gibi dış bileşenlerden tamamen izole edilir.

Repositories (Depolar): Nesnelerin kalıcılığını (persistence) sağlamak için kullanılır. Ancak repository, veritabanı sorgularının yazıldığı yer değil, Aggregate'lere erişim sağlayan bir arayüzdür. Gerçek veritabanı işlemleri altyapı katmanında (Infrastructure Layer) çözülür. Bu sayede, iş mantığı veritabanı teknolojisinden (SQL, NoSQL vb.) bağımsız kalır.

Factories (Fabrikalar): Karmaşık Aggregate veya Entity nesnelerinin oluşturulma sürecini yönetir. Nesne oluşturma mantığı çok karmaşıksa, bu sorumluluk nesnenin kendisinden alınıp bir fabrikaya devredilir.

DDD'nin Avantajları ve Zorlukları

Domain Driven Design kullanmanın en büyük avantajı, yazılımın iş ihtiyaçlarına olan adaptasyon hızıdır. İş birimi ile aynı dilin konuşulması, gereksinimlerin koda dökülme sürecindeki hataları minimize eder. Ayrıca, Bounded Context yapısı sayesinde sistem modüler bir hale gelir; bu da mikroservis mimarisine geçişi inanılmaz derecede kolaylaştırır. Her bağlam, kendi teknolojisiyle geliştirilebilir ve ölçeklenebilir.

Öte yandan, DDD her proje için uygun değildir. Basit CRUD (Create, Read, Update, Delete) işlemleri yapan bir sistemde DDD uygulamak, gereksiz bir karmaşıklık ve maliyet (over-engineering) yaratır. DDD, öğrenme eğrisi dik bir metodolojidir ve hem teknik ekibin hem de iş biriminin bu sürece yoğun mesai harcamasını gerektirir.

Sonuç: Karmaşıklıkla Başa Çıkma Sanatı

DDD (Domain Driven Design), sadece bir yazılım geliştirme tekniği değil, bir organizasyonel kültür ve modelleme disiplinidir. Karmaşık sistemleri yönetilebilir parçalara ayırmak, iş mantığını kodun merkezine koymak ve tüm paydaşlar arasında ortak bir dil oluşturmak, modern yazılım mühendisliğinin temel taşlarıdır. Eğer üzerinde çalıştığınız sistem, iş kuralları açısından yoğun ve sürekli genişleyen bir yapıdaysa, DDD prensiplerini benimsemek projenizin geleceğini kurtarabilir.

Unutulmamalıdır ki; en iyi yazılım, en gelişmiş framework'ü kullanan değil, iş problemlerini en doğru şekilde modelleyen ve değişime en kolay uyum sağlayan yazılımdır. Strategic Design ile sınırları belirlemek ve Tactical Design ile bu sınırların içini sağlamlaştırmak, sürdürülebilir bir dijital ekosistem kurmanın anahtarıdır.

#yazılım mimarisi#ddd#domain driven design#mikroservisler#yazılım geliştirme
Cengiz Bozdemir

Cengiz Bozdemir

Kurumsal Yazılım Mimarı & Full-Stack Geliştirici

İşletmeniz veya girişiminiz için yüksek performanslı sistemler, özel yazılımlar ve yapay zeka otomasyonları inşa ediyorum.

KURUMSAL YAZILIM MİMARİSİ18+ YILLIK TECRÜBEPHP 8.3 & LARAVELFLUTTER & MOBİL ÇÖZÜMLERNEXT.JS & REACT UYGULAMALARIYAPAY ZEKA & OTOMASYONE-TİCARET & PAZARYERİ ENTEGRASYONUCENGİZ BOZDEMİRCBDIGITALKURUMSAL YAZILIM MİMARİSİ18+ YILLIK TECRÜBEPHP 8.3 & LARAVELFLUTTER & MOBİL ÇÖZÜMLERNEXT.JS & REACT UYGULAMALARIYAPAY ZEKA & OTOMASYONE-TİCARET & PAZARYERİ ENTEGRASYONUCENGİZ BOZDEMİRCBDIGITALKURUMSAL YAZILIM MİMARİSİ18+ YILLIK TECRÜBEPHP 8.3 & LARAVELFLUTTER & MOBİL ÇÖZÜMLERNEXT.JS & REACT UYGULAMALARIYAPAY ZEKA & OTOMASYONE-TİCARET & PAZARYERİ ENTEGRASYONUCENGİZ BOZDEMİRCBDIGITALKURUMSAL YAZILIM MİMARİSİ18+ YILLIK TECRÜBEPHP 8.3 & LARAVELFLUTTER & MOBİL ÇÖZÜMLERNEXT.JS & REACT UYGULAMALARIYAPAY ZEKA & OTOMASYONE-TİCARET & PAZARYERİ ENTEGRASYONUCENGİZ BOZDEMİRCBDIGITAL
© 2026 CB DIGITAL Tüm hakları saklıdır.