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
91 yazı bulundu #yazilim-tasarimi
Composition over Inheritance: Fragile Base Class, Delegation ve Davranışı Takmak
Yazılım Tasarımı SERİ 09

Composition over Inheritance: Fragile Base Class, Delegation ve Davranışı Takmak

Inheritance, subclass'ı base class'ın implementation detaylarına bağlar; base class'taki zararsız bir değişiklik subclass'ı sessizce bozabilir, composition ve delegation ise yalnız sözleşmeye bağımlı kalır. Fragile base class'ı gerçek çıktıyla göstermek, iki eksende büyüyen davranışlarda class patlaması ve inheritance'ın doğru olduğu yerler: Collection<T> hook'ları ve sealed.

7 Kas 2026 13 dk 3
DRY, KISS ve YAGNI: Tekrar, Basitlik ve "Şimdilik Gerekmiyor"
Yazılım Tasarımı SERİ 08

DRY, KISS ve YAGNI: Tekrar, Basitlik ve "Şimdilik Gerekmiyor"

DRY kodun değil bilginin tek kaynağı olmasıdır; farklı nedenlerle değişen iki kuralı aynı göründükleri için birleştirmek DRY değil, yanlış bir abstraction'dır. Metz'in wrong abstraction'dan geri dönüşü, rule of three, KISS'i CA1502 ile ölçmek ve Fowler'ın YAGNI için saydığı dört maliyet.

7 Kas 2026 12 dk 3
Dependency Inversion Principle: DIP, DI ve IoC Arasındaki Fark ve Composition Root
Yazılım Tasarımı SERİ 07

Dependency Inversion Principle: DIP, DI ve IoC Arasındaki Fark ve Composition Root

DIP, compile-time bağımlılığın detaydan abstraction'a doğru akmasını ve abstraction'ın onu kullanan tarafa ait olmasını ister; DI yalnızca bağımlılığı dışarıdan verme tekniğidir, IoC ise akışın framework'e geçmesidir. Interface'in hangi project'te durduğu, Program.cs'in composition root olarak kullanılması ve service locator'ın neden DIP'i boşa çıkardığı.

7 Kas 2026 12 dk 5
Interface Segregation Principle: Şişman Interface'ler ve Role Interface'ler
Yazılım Tasarımı SERİ 06

Interface Segregation Principle: Şişman Interface'ler ve Role Interface'ler

ISP, hiçbir client'ın kullanmadığı method'lara bağımlı olmaya zorlanmaması, interface'in class'a göre değil client'a göre (role interface) kesilmesidir. 14 method'luk IOrderRepository'ye eklenen tek method'un üç dosyayı kırması, okuma/yazma/rapor rollerine bölmek ve DI'da forwarding, .NET 10'da hâlâ ayrı duran IReadOnlyList<T> ile IList<T>, tek method'luk interface enflasyonu ve default interface method ile ISP'yi delmenin bedeli.

7 Kas 2026 12 dk 4
Liskov Substitution Principle: Behavioral Subtyping ve .NET'teki NotSupportedException'lar
Yazılım Tasarımı SERİ 05

Liskov Substitution Principle: Behavioral Subtyping ve .NET'teki NotSupportedException'lar

LSP, bir subtype'ın derleyiciyi değil base type'ın contract'ını da karşılamasını ister: precondition güçlenmez, postcondition zayıflamaz, invariant ve history constraint korunur. Bookstore stok modülünde üç gerçek ihlal, T[] ve ReadOnlyCollection'ın IList<T>.Add'de fırlattığı NotSupportedException, Stream.CanSeek ile capability query ve contract'ı abstract bir xUnit test class'ıyla bütün implementation'lara karşı doğrulamak.

7 Kas 2026 15 dk 4
Open/Closed Principle: Değiştirmeden Genişletmek ve Spekülatif Genellik Tuzağı
Yazılım Tasarımı SERİ 04

Open/Closed Principle: Değiştirmeden Genişletmek ve Spekülatif Genellik Tuzağı

OCP, yeni bir davranışı mevcut ve çalışan kodu açmadan, yeni bir implementation olarak ekleyebilmektir; ama her kod yalnızca belirli bir değişim eksenine karşı kapatılabilir. Büyüyen bildirim switch'ini INotificationChannel ve .NET 8 keyed services ile kapatmak, HttpClient'ın DelegatingHandler zinciri, Func ile hafif extension point'ler ve spekülatif genelliğin bedeli.

7 Kas 2026 12 dk 2
Single Responsibility Principle: "Tek İş" Değil, Tek Actor
Yazılım Tasarımı SERİ 03

Single Responsibility Principle: "Tek İş" Değil, Tek Actor

SRP "bir class tek şey yapar" demek değildir; Martin'in tanımıyla bir module tek bir actor'a, yani aynı değişikliği isteyen tek bir kişi ya da gruba karşı sorumlu olmalıdır. Muhasebenin bir değişikliğinin İK raporunu bozduğu Employee örneği, veriyi paylaşıp davranışı ayırmak, Facade, .NET'teki Stream/StreamWriter/Encoding ayrımı ve fragmentation tuzağı.

7 Kas 2026 13 dk 5
Coupling ve Cohesion: İyi Tasarımın İki Ölçüsü, Connascence ve Law of Demeter
Yazılım Tasarımı SERİ 02

Coupling ve Cohesion: İyi Tasarımın İki Ölçüsü, Connascence ve Law of Demeter

İyi tasarım, parçalar arası bağın (coupling) zayıf, parçanın içindeki bütünlüğün (cohesion) yüksek olmasıdır; connascence bu bağı türüne göre derecelendirir, Law of Demeter ise object'lerin birbirinin içine uzanmasını sınırlar. Coupling türleri ve cohesion seviyeleri, altı parametreli constructor'da connascence of position, TimeSpan(10) tuzağı ve Tell, Don't Ask ile cüzdan bakiyesini korumak.

7 Kas 2026 15 dk 4
Design Principles Neden Var? Değişim, Bağımlılık ve SOLID'in Kısa Tarihi
Yazılım Tasarımı SERİ 01

Design Principles Neden Var? Değişim, Bağımlılık ve SOLID'in Kısa Tarihi

Design principle'lar, değişimi pahalı yapan plansız bağımlılıkları adlandırmak ve onlara sınır çizmek için var: rigidity, fragility, immobility ve viscosity'nin ortak kökü bağımlılıktır. Parnas'ın information hiding'inden Feathers'ın SOLID kısaltmasına uzanan tarih ve serinin Bookstore sipariş-bildirim örneği.

7 Kas 2026 13 dk 7
Toplu Import ve Validation Raporu: Excel/CSV Yükle, Staging Tablosu, Satır Bazlı Hata Dosyası
Yazılım Tasarımı SERİ 22

Toplu Import ve Validation Raporu: Excel/CSV Yükle, Staging Tablosu, Satır Bazlı Hata Dosyası

Büyük ve kirli bir Excel/CSV dosyasını güvenle içeri almanın yolu, dosyayı metin kolonlu bir staging tablosuna SqlBulkCopy ile yüklemek, kuralları set-based SQL ile her satıra uygulamak, kullanıcıya satır bazlı hata dosyası vermek ve commit'i onayla ayrı bir adımda yapmaktır. Bu yazı 202 Accepted + durum endpoint'i, dosya hash'iyle idempotency ve CSV injection'a karşı escape ile 20.000 satırlık bir importu gerçek çıktılarla gösteriyor.

7 Kas 2026 19 dk 8
Pagination Stratejileri Derinlemesine: Offset, Keyset ve Opaque Cursor Token
Yazılım Tasarımı SERİ 21

Pagination Stratejileri Derinlemesine: Offset, Keyset ve Opaque Cursor Token

Büyük ve değişen tablolarda keyset pagination, offset'in derinlikle artan maliyetini ve sayfa kaymasını ortadan kaldırır: 2 milyon satırlık testte 5000. sayfa offset ile 375, keyset ile 6 logical read okudu. Bu yazı SQL Server'da tie-breaker'lı keyset koşulunu, HMAC ile imzalı opaque cursor'ı, önceki sayfayı ve nullable sıralama kolonu tuzağını gerçek ölçümlerle gösteriyor.

7 Kas 2026 17 dk 5
Optimistic Concurrency Uçtan Uca: rowversion'dan ETag'e, If-Match ve 412 ile Çakışma Ekranı
Yazılım Tasarımı SERİ 20

Optimistic Concurrency Uçtan Uca: rowversion'dan ETag'e, If-Match ve 412 ile Çakışma Ekranı

Optimistic concurrency'yi web'de uçtan uca kurmak için rowversion'ı ETag olarak dışarı açmak, güncellemede If-Match'i zorunlu tutmak (yoksa 428), uyuşmazlıkta 412 ile güncel değerleri dönmek ve istemcide field bazlı three-way merge yapmak gerekir. Bu yazı EF Core Concurrency yazısının devamı olarak HTTP ve Angular tarafını gerçek çıktılarla gösteriyor.

7 Kas 2026 15 dk 7
Blog Haritası