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
521 yazı bulundu
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 6
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 5
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 9
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 7
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 9
Idempotency Key: Çift Tıklama ve Retry'da Aynı Siparişi İki Kez Oluşturmamak
Yazılım Tasarımı SERİ 19

Idempotency Key: Çift Tıklama ve Retry'da Aynı Siparişi İki Kez Oluşturmamak

Çift tıklama ve retry'da aynı siparişin iki kez oluşmasını engellemenin güvenilir yolu, istemcinin her işlem için ürettiği bir Idempotency-Key'i sunucunun kullanıcı scope'unda, request hash'iyle birlikte saklaması ve iş ile 'tamamlandı' kaydını aynı transaction'da yazmasıdır. Bu yazı IETF taslağının güncel durumunu (draft-08, RFC değil), 400/409/422 kurallarını ve ASP.NET Core endpoint filter + SQL Server uygulamasını gerçek çıktılarla gösteriyor.

7 Kas 2026 18 dk 10
Zaman ve Time Zone: UTC Instant, Yerel İş Günü, DateOnly ve TimeProvider
Yazılım Tasarımı SERİ 18

Zaman ve Time Zone: UTC Instant, Yerel İş Günü, DateOnly ve TimeProvider

Zamanı doğru saklamak için üç kavramı ayırmak gerekir: event anları UTC instant (DateTimeOffset), takvim günleri DateOnly, gelecekteki yerel event'ler wall-clock time ve IANA zone id'si olarak saklanır. Bu yazı tenant'ın gününü UTC aralığına çevirmeyi, TimeProvider ile test edilebilir saati, SQL Server'daki AT TIME ZONE tuzaklarını ve Angular'daki tarih kaymasını gerçek çıktılarla gösteriyor.

7 Kas 2026 15 dk 10
Para ve Yuvarlama: decimal, Money Value Object, KDV ve Kuruş Dağıtımı
Yazılım Tasarımı SERİ 17

Para ve Yuvarlama: decimal, Money Value Object, KDV ve Kuruş Dağıtımı

Parayı doğru modellemek için tutarı para birimiyle birlikte taşıyan bir Money value object, C# ile SQL'de aynı açık yuvarlama kuralı ve bölme yerine kuruşu kaybetmeyen Allocate gerekir. Yazı Math.Round ile SQL ROUND'un 0,125'te ayrıştığını, satır ve toplam bazında KDV'nin 1 kuruş farkını, tarihli KDV oranı tablosunu (Kasım 2026 itibarıyla %20, %10, %1), EF Core complex type mapping'ini ve JSON'da string tutarı gerçek çıktılarla gösteriyor.

7 Kas 2026 14 dk 10
Numaralandırma: Fatura ve Sipariş Numaraları, Gapless Sequence ve Yıllık Sıfırlama
Yazılım Tasarımı SERİ 16

Numaralandırma: Fatura ve Sipariş Numaraları, Gapless Sequence ve Yıllık Sıfırlama

Ardışık olması gereken fatura numarası identity, MAX + 1 ya da SEQUENCE ile değil, onay transaction'ının içinde (Series, Year) key'li bir counter tablosundan lock alan bir UPDATE ile alınmalıdır; boşluk kabul edilen sipariş numaraları için SEQUENCE yeterlidir. Yazı GİB'in 16 karakterlik belge numarası biçimini, 50 concurrent onayla boşluksuzluğu, lock süresinin throughput'a etkisini ve fatura tarihine göre yıllık sıfırlamayı gerçek çıktılarla gösteriyor.

7 Kas 2026 13 dk 9
Feature Flag'leri Kodda Tasarlamak: Toggle Türleri, Microsoft.FeatureManagement ve Flag Borcu
Yazılım Tasarımı SERİ 15

Feature Flag'leri Kodda Tasarlamak: Toggle Türleri, Microsoft.FeatureManagement ve Flag Borcu

Feature flag'i doğru tasarlamak, önce türünü (release, experiment, ops, permission) belirlemek, kararı tek bir toggle router'da toplamak ve her flag'e sahip ile son kullanma tarihi vermektir. Yazı Microsoft.FeatureManagement 4.8.0 ile tenant filter'ı, snapshot ile istek içi tutarlılığı, WithFeatureGate ile kill switch'i ve süresi geçen flag'i yakalayan testi gerçek çıktılarla gösteriyor.

7 Kas 2026 12 dk 5
Blog Haritası