Mert Özen Her Satırda Daha İleri

Blog

Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.

Seriler
55 yazı bulundu #yazilim-mimarisi
Always-Valid Domain Model: Invariant'ları Constructor, Factory ve Guard'larla Korumak
Yazılım Mimarisi SERİ 08

Always-Valid Domain Model: Invariant'ları Constructor, Factory ve Guard'larla Korumak

Always-valid domain model, invariant'ların kaydetmeden önce kontrol edilmesi değil, ihlal edilmesinin imkânsız olmasıdır: private constructor, static factory ve guard clause'lar geçersiz state'e giden her yolu kapatır. Bookstore'un Order'ında en az bir satır, kitap başına 10 adet, tek para birimi ve tek kupon kurallarını; required/init ve C# 14 field'ın sınırlarını, domain exception ile Result ayrımını ve input validation ile invariant farkını gerçek çıktılarla işliyoruz.

7 Kas 2026 12 dk 6
Entity ve Value Object: Identity, Equality ve C# record ile Immutable Modeller
Yazılım Mimarisi SERİ 07

Entity ve Value Object: Identity, Equality ve C# record ile Immutable Modeller

Entity'yi zaman içinde süren kimliği, value object'i ise yalnızca değeri tanımlar: iki Money aynı tutar ve para birimindeyse aynıdır, iki Order ise Id'leri aynıysa. C# record ve readonly record struct ile Money, Isbn ve strongly typed id'ler yazıyor, EF Core 10'un owned type yerine önerdiği complex type'larla map'liyor ve record'daki collection, struct default'u ve with tuzaklarını gerçek çıktılarla gösteriyoruz.

7 Kas 2026 14 dk 8
EventStorming ile Domain'i Keşfetmek: Big Picture'dan Aggregate'lere
Yazılım Mimarisi SERİ 06

EventStorming ile Domain'i Keşfetmek: Big Picture'dan Aggregate'lere

EventStorming, domain'de olan biteni geçmiş zamanlı turuncu sticky'lerle bir timeline'a dizerek domain expert ile developer'ları aynı dilde buluşturan bir workshop formatıdır. Bookstore'un sipariş akışını Big Picture, Process Modeling ve Software Design seviyelerinden geçirip hot spot'ları, pivotal event'leri, policy'leri ve duvardan çıkan aggregate adaylarını koda döküyoruz.

7 Kas 2026 12 dk 6
Context Mapping: Anti-Corruption Layer, Open Host Service ve Bounded Context'ler Arası İlişkiler
Yazılım Mimarisi SERİ 05

Context Mapping: Anti-Corruption Layer, Open Host Service ve Bounded Context'ler Arası İlişkiler

Context map, bounded context'ler arasındaki ilişkileri hem teknik hem organizasyonel olarak adlandırır: upstream/downstream, Partnership, Shared Kernel, Customer/Supplier, Conformist, Anti-Corruption Layer, Open Host Service, Published Language, Separate Ways ve Big Ball of Mud. Bookstore'un context map'i, eski kargo sisteminin SOAP/XML modelini Shipping'e çeviren test'li bir ACL, versiyonlu bir Published Language ve Shared Kernel'in Common.dll'e dönüşme tuzağı.

7 Kas 2026 13 dk 3
Bounded Context: Aynı Kelimenin Farklı Anlamları ve Model Sınırları
Yazılım Mimarisi SERİ 04

Bounded Context: Aynı Kelimenin Farklı Anlamları ve Model Sınırları

Bounded context, bir modelin ve dilinin geçerli olduğu açıkça çizilmiş sınırdır; "kitap" Catalog'da satıştaki eser, Inventory'de depodaki nüsha, Ordering'de satın alınan satır, Shipping'de koli olduğu için tek bir dev Book class'ı yerine dört model gerekir. Evans'ın tanımı, .NET'in Timer'larıyla CS0104, bounded context ile subdomain ve microservice farkı, boyutlandırma, Ordering için Bounded Context Canvas ve EF Core'da context başına schema.

7 Kas 2026 12 dk 8
Subdomain'ler: Core, Supporting ve Generic Ayrımıyla Yatırımı Doğru Yere Yapmak
Yazılım Mimarisi SERİ 03

Subdomain'ler: Core, Supporting ve Generic Ayrımıyla Yatırımı Doğru Yere Yapmak

Core subdomain şirketi rakiplerinden ayıran, karmaşık ve sık değişen parçadır ve en iyi ekiple zengin modelle yazılır; supporting basit tutulur, generic ise karmaşık olsa da satın alınır. Evans'ın Core Domain ve Generic Subdomains pattern'leri, Khononov'un ölçütleri, Bookstore'un sınıflaması, aynı uygulamada domain model, transaction script ve ince gateway, .NET'in kriptografiyi işletim sistemine bırakması ve subdomain ile bounded context farkı.

7 Kas 2026 11 dk 4
Ubiquitous Language: Domain Expert'le Aynı Dili Konuşan Kod
Yazılım Mimarisi SERİ 02

Ubiquitous Language: Domain Expert'le Aynı Dili Konuşan Kod

Ubiquitous language, bir bounded context içinde domain uzmanının ve developer'ların konuştuğu, class ve method adlarına birebir yansıyan tek ve kesin dildir: Status = 4 yerine order.Cancel(reason) ve RequestReturn. Belirsiz kelimeleri (ürün, durum, iade) ayrıştırmak, Türkçe konuşup İngilizce kod yazan ekip için çeviri sütunlu glossary, reflection ile glossary kontrolü ve HttpStatusCode'un RFC 9110 ile değişen dili.

7 Kas 2026 12 dk 6
Domain-Driven Design Nedir? Ne Zaman Değer, Ne Zaman Gereksiz?
Yazılım Mimarisi SERİ 01

Domain-Driven Design Nedir? Ne Zaman Değer, Ne Zaman Gereksiz?

DDD, karmaşıklığın teknolojide değil iş kurallarında olduğunu kabul edip modeli domain uzmanıyla birlikte koda taşıyan bir yaklaşımdır; kuralları sık değişen core domain'de değer üretir, CRUD ekranlarında ve kısa ömürlü MVP'lerde gereksizdir. Kampanya indirimi hatasıyla CRUD ve domain modelinin farkı, strategic ve tactical design ayrımı, eShop'un Ordering.Domain'i ve serinin yol haritası.

7 Kas 2026 12 dk 6
Vertical Slice Ne Zaman? Clean Architecture ve Modular Monolith ile Birlikte Kullanmak
Yazılım Mimarisi SERİ 06

Vertical Slice Ne Zaman? Clean Architecture ve Modular Monolith ile Birlikte Kullanmak

Vertical slice'lar sık feature eklenen, karmaşıklığı use case'e göre değişen API'lerde iyi çalışır; refactoring disiplini olmayan ekiplerde ve zengin, paylaşılan domain'lerde tek başına yetmez, en iyi sonucu Clean bir domain çekirdeği ve modular monolith sınırlarıyla birlikte verir. Bookstore'u module'lere ayırıp sınırı internal ve ArchUnitNET ile koruyor, FastEndpoints ile REPR'ı değerlendiriyor ve layered bir projeyi slice'lara kademeli taşıma planını çıkarıyoruz.

7 Kas 2026 11 dk 4
Vertical Slice'ları Test Etmek: Slice Başına Integration Test ve Gerektiğinde Unit Test
Yazılım Mimarisi SERİ 05

Vertical Slice'ları Test Etmek: Slice Başına Integration Test ve Gerektiğinde Unit Test

Bir slice'ın doğal test birimi HTTP isteğinden gerçek veritabanına kadar olan yoldur; domain kuralları ise saf unit test'le, ucuzca test edilir. WebApplicationFactory, Testcontainers ile gerçek SQL Server ve Respawn ile slice başına test kuruyor, sıfırlama olmadan test'lerin nasıl birbirini kırdığını ve InMemory provider'ın aynı arama sorgusunda hem yanlış geçip hem yanlış kaldığını gerçek çıktılarla gösteriyoruz.

7 Kas 2026 11 dk 3
Slice'lar Arası Paylaşım: Duplication mı Abstraction mı, Domain Logic Nereye?
Yazılım Mimarisi SERİ 04

Slice'lar Arası Paylaşım: Duplication mı Abstraction mı, Domain Logic Nereye?

Slice'lar arasında domain model, cross-cutting işler ve altyapı paylaşılır; request/response tipleri, sorgular ve iş akışı paylaşılmaz, invariant'lar ise ikinci kopyayı beklemeden entity'ye taşınır. Bookstore'da request'e konmuş bir kuralın 7 adetlik siparişe izin verdiğini, bir slice'ın başka bir slice'ı çağırınca ödemesi reddedilmiş siparişi kaydettiğini gerçek çıktılarla görüyor ve bunu ArchUnitNET slice test'iyle engelliyoruz.

7 Kas 2026 11 dk 4
Mediator'lı Slice: MediatR, Mediator (Source Generator) ve Wolverine Karşılaştırması
Yazılım Mimarisi SERİ 03

Mediator'lı Slice: MediatR, Mediator (Source Generator) ve Wolverine Karşılaştırması

Slice'larda mediator'ın asıl getirisi giriş noktasından bağımsız bir pipeline'dır; Kasım 2026 itibarıyla MediatR 14.3 RPL 1.5 ya da ticari lisanslı, Mediator 3.0.2 ve Wolverine 6.62 MIT lisanslı. Aynı PlaceOrder slice'ını üç araçla ve mediator'sız bir endpoint filter'la yazıp dispatch maliyetini, ilk istek süresini, Native AOT davranışını ve her aracın gerçek kurulum tuzaklarını karşılaştırıyoruz.

7 Kas 2026 15 dk 4
Blog Haritası