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
25 yazı bulundu
Design Pattern Nedir? GoF Kataloğu, Pattern Anatomisi ve Modern Dillerde Kaybolan Pattern'ler
Yazılım Tasarımı SERİ 01

Design Pattern Nedir? GoF Kataloğu, Pattern Anatomisi ve Modern Dillerde Kaybolan Pattern'ler

Design pattern, belli bir bağlamda tekrar eden bir tasarım problemine verilmiş, adı, rolleri ve bedeli (consequences) belli bir çözümdür; ezberlenecek bir diyagram değildir. Alexander'dan GoF'a pattern fikri, GoF'un 13 bölümlük template'i, purpose × scope haritası ve Norvig'in tespitiyle C#'ta yield, event ve lambda'ya dönüşüp görünmez olan pattern'ler.

7 Kas 2026 14 dk 6
Singleton Pattern: Thread-Safe Lazy<T>, Static Field ve Neden DI Singleton Lifetime Daha İyi
Yazılım Tasarımı SERİ 02

Singleton Pattern: Thread-Safe Lazy<T>, Static Field ve Neden DI Singleton Lifetime Daha İyi

Tek instance gerekiyorsa en temiz yol klasik Singleton değil, DI container'da AddSingleton ile kaydetmektir: tek instance garantisi aynı kalır, global erişim ve gizli bağımlılık ortadan kalkar. Naif Singleton'daki race, double-checked locking'in tarihi, static readonly ve beforefieldinit, Lazy<T>'nin exception caching'i, captive dependency ve singleton içindeki paylaşılan state gerçek çıktılarla.

7 Kas 2026 14 dk 4
Factory Method ve Static Factory: Oluşturmayı Alt Class'a ya da Tek Bir Method'a Bırakmak
Yazılım Tasarımı SERİ 03

Factory Method ve Static Factory: Oluşturmayı Alt Class'a ya da Tek Bir Method'a Bırakmak

GoF Factory Method hangi ürünün oluşturulacağını alt class'a bırakır; static factory method ise constructor'ın yerine geçen, adı olan, cache'leyebilen ve gizli alt tip döndürebilen tek bir method'dur. Constructor'dan çağrılan factory method hatası ve CA2214, DbConnection.CreateDbCommand, ILoggerFactory ve IHttpClientFactory, DI'da Func<T>, ActivatorUtilities, keyed services ve IDisposable ürünlerin sahipliği gerçek çıktılarla.

7 Kas 2026 16 dk 3
Abstract Factory: Birbirine Uyumlu Object Ailelerini Birlikte Üretmek
Yazılım Tasarımı SERİ 04

Abstract Factory: Birbirine Uyumlu Object Ailelerini Birlikte Üretmek

Abstract Factory, birbiriyle uyumlu olması gereken ürünleri (blob storage, queue, secret store gibi) tek bir factory'den üreterek geçersiz kombinasyonları imkânsız kılar; bedeli, aileye yeni ürün eklemenin bütün factory'leri değiştirmesidir. Configuration ile aile seçimi, ADO.NET'in DbProviderFactory'si ve CanCreateBatch, keyed services ile tenant başına factory gerçek çıktılarla.

7 Kas 2026 15 dk 3
Builder Pattern: Fluent Builder, WebApplicationBuilder ve Object Initializer ile required'ın Yetmediği Yer
Yazılım Tasarımı SERİ 05

Builder Pattern: Fluent Builder, WebApplicationBuilder ve Object Initializer ile required'ın Yetmediği Yer

required, init ve object initializer çok parametreli constructor'ı okunur kılar ama alanlar arası kuralları, adım sırasını ve parça parça biriken değişmez sonucu çözmez; Builder bu kuralları tek bir Build() anında uygular. Record'da with'in kuralı atlaması, GoF'un director'lı Builder'ı ile fluent builder farkı, UriBuilder, connection string builder, ImmutableArray builder, HostApplicationBuilder ve step builder gerçek çıktılarla.

7 Kas 2026 16 dk 4
Prototype Pattern: record ile with, Shallow ve Deep Copy ve ICloneable'ın Neden Önerilmediği
Yazılım Tasarımı SERİ 06

Prototype Pattern: record ile with, Shallow ve Deep Copy ve ICloneable'ın Neden Önerilmediği

Prototype, yeni object'i sıfırdan kurmak yerine konfigüre edilmiş bir örneği kopyalayarak üretir; C#'ta record'ların with expression'ı bunu runtime tipini koruyarak yapar ama kopya shallow'dur. Prototype registry, copy constructor ile kontrollü deep copy, ICloneable'ın belirsiz sözleşmesi, JSON ile kopyalamanın ölçülmüş bedeli ve with'in doğrulamayı atlayan tuzakları.

7 Kas 2026 16 dk 4
Adapter Pattern: Third-Party SDK'yı Kendi Interface'ine Uydurmak
Yazılım Tasarımı SERİ 07

Adapter Pattern: Third-Party SDK'yı Kendi Interface'ine Uydurmak

Adapter, değiştiremediğin bir class'ı client'ın beklediği interface'e uydurur; C#'ta neredeyse her zaman object adapter, yani composition ile. İki hayalî ödeme SDK'sını tek IPaymentGateway'e bağlamak, callback'i TaskCompletionSource ile Task'a çevirmek, hata kodlarını domain exception'larına eşlemek ve iki adapter'ı aynı contract test ile doğrulamak.

7 Kas 2026 14 dk 3
Bridge Pattern: Abstraction ile Implementation'ı Ayrı Ayrı Büyütmek
Yazılım Tasarımı SERİ 08

Bridge Pattern: Abstraction ile Implementation'ı Ayrı Ayrı Büyütmek

Bridge, iki bağımsız değişim eksenini (mesaj tipi ve kanal gibi) tek bir inheritance hiyerarşisine sıkıştırmak yerine iki hiyerarşiye ayırıp bir referansla bağlar; class sayısı çarpım yerine toplam olur. Bookstore bildirimlerinde 3 × 3 class patlamasından 3 + 3'e geçiş, HttpClient/HttpMessageHandler ve ILogger/ILoggerProvider köprüleri ve Adapter ile farkı.

7 Kas 2026 13 dk 3
Composite Pattern: Ağaç Yapıları Tek Interface ile Gezmek
Yazılım Tasarımı SERİ 09

Composite Pattern: Ağaç Yapıları Tek Interface ile Gezmek

Composite, leaf'i ve onları içeren composite'i aynı interface arkasına koyarak client'ın tek bir item'la iç içe bir ağacı ayırt etmeden kullanmasını sağlar; recursion ağacı bilen tek yerde, composite'in içinde kalır. Bookstore'da iç içe kitap paketlerinin fiyatı, transparency ile safety tercihi, IConfiguration ve CompositeChangeToken örnekleri ve döngüsel ağacın stack overflow'u.

7 Kas 2026 12 dk 4
Decorator Pattern: Caching, Logging ve Retry'ı Koda Dokunmadan Eklemek
Yazılım Tasarımı SERİ 10

Decorator Pattern: Caching, Logging ve Retry'ı Koda Dokunmadan Eklemek

Decorator, aynı interface'i implement edip içindeki object'e iş devrederek ona runtime'da davranış ekler; decorator'ların sırası ne ölçtüğünü ve neyi koruduğunu belirleyen bir tasarım kararıdır. Bookstore kataloğuna cache, log ve retry eklemek, Stream ailesi ve leaveOpen ile sahiplik, DI'da elle registration ve Scrutor Decorate, DelegatingHandler ve default interface method'ların decorator'ı sessizce atlatması.

7 Kas 2026 13 dk 5
Facade Pattern: Karmaşık Alt Sistemi Tek Kapıdan Sunmak
Yazılım Tasarımı SERİ 11

Facade Pattern: Karmaşık Alt Sistemi Tek Kapıdan Sunmak

Facade, birden fazla subsystem'i doğru sırayla ve doğru compensation adımlarıyla kullanma bilgisini tek bir class'a toplar; subsystem'i kapatmadan client'a kolay bir giriş noktası verir. Bookstore'da stok, ödeme, fatura ve bildirimi koordine eden bir CheckoutFacade, File.ReadAllTextAsync ve GetFromJsonAsync'in arkasındaki gerçek kod, Facade'ın Service Layer, Adapter ve Mediator'dan farkı ve god facade tuzağı.

7 Kas 2026 13 dk 4
Flyweight Pattern: Paylaşılan State ile Bellek Kazanmak — string.Intern ve ArrayPool
Yazılım Tasarımı SERİ 12

Flyweight Pattern: Paylaşılan State ile Bellek Kazanmak — string.Intern ve ArrayPool

Flyweight, çok sayıda object'in tekrar eden ve değişmeyen kısmını (intrinsic state) bir factory üzerinden bir kez saklayıp paylaşır, satıra özel kısmı (extrinsic state) dışarıda tutar. Bir milyon satırlık raporda belleği 377 MB'tan 30 MB'a indiren BookInfoFactory, string.Intern'ün yan etkileri, .NET'in önceden paylaştığı Task ve array instance'ları, ArrayPool'un neden flyweight değil object pool olduğu ve BenchmarkDotNet ölçümleri.

7 Kas 2026 14 dk 3
Blog Haritası