Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
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.
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.
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ı.
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ğı.
Strategy Pattern Derinlemesine: Keyed Services, IEnumerable<IStrategy> ve Func ile Runtime Seçim
Strategy'yi yazmak kolay, zor olan doğru strategy'yi runtime'da seçmek: keyed services tek bir key'le, IEnumerable<IStrategy> ve CanHandle object'in birden fazla özelliğine bakarak, Dictionary<string, Func<>> ise bağımlılığı olmayan formüllerde en az törenle seçer. Kayıt sırasının sessizce fiyat değiştirmesi, keyed kayıtların GetServices'te görünmemesi ve BCL'deki IComparer ile StringComparer örnekleri.