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
73 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 3
Uygulamalı Clean Code: Legacy OrderService'i Adım Adım Temizlemek
Yazılım Tasarımı SERİ 14

Uygulamalı Clean Code: Legacy OrderService'i Adım Adım Temizlemek

Legacy kodu temizlemenin güvenli yolu önce küçük bir seam ve characterization test'lerle mevcut davranışı sabitlemek, sonra her adımı ayrı commit'te yapmak ve davranış değişikliklerini ayrı fix commit'lerine ayırmaktır. Yazıda 609 satırlık OrderService 16 commit'te, her commit'te testler yeşilken temizleniyor; en yüksek Cognitive Complexity 92'den 10'a iniyor, bilinçli bırakılan smell'ler de gerekçesiyle listeleniyor.

7 Kas 2026 14 dk 2
Clean Code Tartışması: Ousterhout, Muratori ve Kuralların Sınırları
Yazılım Tasarımı SERİ 13

Clean Code Tartışması: Ousterhout, Muratori ve Kuralların Sınırları

Ousterhout ve Martin aynı hedefte, okuyucunun yükünü azaltmakta anlaşıyor; ayrıldıkları yer method'ları ne kadar böleceğin, comment'lerin değeri ve TDD. Yazı 2024–25 tartışmasını, Muratori'nin performans eleştirisini (C#'ta BenchmarkDotNet ile tekrarlanmış hâliyle) ve qntm'nin kitap eleştirisini iki tarafın kendi kaynaklarından özetliyor.

7 Kas 2026 13 dk 4
Code Smell Kataloğu: C# Kodunda Kokuyu Tanımak
Yazılım Tasarımı SERİ 12

Code Smell Kataloğu: C# Kodunda Kokuyu Tanımak

Code smell, genellikle daha derin bir tasarım problemine işaret eden yüzeysel bir belirtidir; teşhis değil, bakılacak yeri gösterir. Yazı Fowler'ın 2. baskıdaki 24 smell'ini Mäntylä'nın beş grubuyla haritalıyor, her birini legacy OrderService.cs'te arıyor ve SonarAnalyzer'ın hangilerini yakalayıp hangilerini kaçırdığını gerçek çıktıyla gösteriyor.

7 Kas 2026 12 dk 4
Simple Design'ın Dört Kuralı: Testler Geçer, Niyet Açık, Tekrar Yok, En Az Eleman
Yazılım Tasarımı SERİ 11

Simple Design'ın Dört Kuralı: Testler Geçer, Niyet Açık, Tekrar Yok, En Az Eleman

Kent Beck'in simple design kuralları öncelik sırasıyla şunlar: testler geçer, niyet açıktır, tekrar yoktur, eleman sayısı en azdır. Yazıda bir kupon indirimi hesabı bu dört soruyla adım adım büyütülüyor, tesadüfi benzerlik ile gerçek tekrar ayrılıyor ve aynı testleri geçen aşırı genelleştirilmiş bir versiyonun bedeli gösteriliyor.

7 Kas 2026 13 dk 2
Temiz Test Kodu: F.I.R.S.T., Okunabilir Assert ve Test Data Builder
Yazılım Tasarımı SERİ 10

Temiz Test Kodu: F.I.R.S.T., Okunabilir Assert ve Test Data Builder

Temiz test hızlı, bağımsız, her gün aynı sonucu veren, kendini doğrulayan ve zamanında yazılmış testtir (F.I.R.S.T.); legacy OrderService testleri DateTime.Now yüzünden cumartesi, static Db yüzünden sıraya göre kırılıyor. TimeProvider ve FakeTimeProvider, test data builder, cümle gibi okunan test adları ve kırıldığında sebebi söyleyen assert'lerle aynı kuralları temiz testlere çeviriyoruz.

7 Kas 2026 11 dk 3
Clean Code'da Class'lar: Küçük Class, Cohesion ve Değişime Göre Düzenlemek
Yazılım Tasarımı SERİ 09

Clean Code'da Class'lar: Küçük Class, Cohesion ve Değişime Göre Düzenlemek

Class'ın büyüklüğü satırla değil, değişikliğini isteyen actor sayısıyla ölçülür; method'ların field paylaşmaması ve CA1822'nin "static yap" uyarıları düşük cohesion'ın işaretidir. Legacy OrderService'te aynı class'taki iki fiyat hesabı ayrışıp 731,50 TRY teklif edip 690,52 TRY çekiyordu; fiyatı tek bir OrderPricing class'ına toplayıp primary constructor, sealed ve required ile modern C# class'ları kuruyoruz.

7 Kas 2026 13 dk 4
Boundary'ler: Third-Party Kodu Sarmak ve Learning Test'ler
Yazılım Tasarımı SERİ 08

Boundary'ler: Third-Party Kodu Sarmak ve Learning Test'ler

Ödeme SDK'sı, e-posta kütüphanesi ve cache gibi kontrol etmediğin kodu, kendi ihtiyacının şeklinde bir interface'in ve tek bir adapter'ın arkasına al; tiplerini ve exception'larını içeri sızdırma. Learning test'lerle kütüphanenin davranışını sabitle: MimeKit'in TryParse'ı "ada"yı bile geçerli sayıyor ve 4.17.0'dan 4.18.2'ye yükseltmede 13 test değişmeden geçip transitive güvenlik uyarısı kayboldu.

7 Kas 2026 11 dk 3
Clean Code'da Error Handling: Exception, Try Pattern ve Result Pattern
Yazılım Tasarımı SERİ 07

Clean Code'da Error Handling: Exception, Try Pattern ve Result Pattern

Beklenen iş sonuçları (stok yok, kupon geçersiz, ödeme reddedildi) için Try pattern ya da Result<T>, bug'lar için argument exception'ları, altyapı hataları için context eklenmiş exception kullan ve onları yalnız uygulamanın sınırında yakala. Legacy OrderService'teki return code'larını, static LastError'ı ve boş catch bloklarını bu üç araçla temizliyoruz; ölçümde fırlatılan bir exception TryParse'tan yaklaşık 1.165 kat yavaş.

7 Kas 2026 14 dk 1
Object mi Data Structure mı? Record, DTO ve Primitive Obsession
Yazılım Tasarımı SERİ 06

Object mi Data Structure mı? Record, DTO ve Primitive Obsession

Object verisini saklayıp davranış açar, data structure veriyi açar ve davranış taşımaz; ikisinin arasındaki hybrid en pahalısıdır. DTO'lar için record, domain için encapsulation, string ve decimal ile taşınan kavramlar için Money ve Email gibi value object'ler kullan; Law of Demeter'a da kısa bir giriş yapıyoruz.

7 Kas 2026 16 dk 1
Formatting ve Dosya Düzeni: Kodu Gazete Gibi Okunur Kılmak
Yazılım Tasarımı SERİ 05

Formatting ve Dosya Düzeni: Kodu Gazete Gibi Okunur Kılmak

Formatting bir estetik değil iletişim meselesidir ve kuralını insan değil araç uygulamalıdır: süslü parantezsiz bir if'te yanlış girinti, e-posta gönderilmediği hâlde log'a 'gönderildi' yazdırıyor ve bunu derleyici değil SonarAnalyzer ile dotnet format yakalıyor. Yazı newspaper metaphor'ü, dikey düzeni, member sırasını, bir dosyada bir tip kuralını, file-scoped namespace dönüşümünü ve 259 karakterlik LINQ zincirini satırlara bölmeyi gerçek çıktılarla anlatıyor.

7 Kas 2026 11 dk 2
Clean Code'da Comment'ler: Ne Zaman Yazılır, Ne Zaman Koda Dönüştürülür?
Yazılım Tasarımı SERİ 04

Clean Code'da Comment'ler: Ne Zaman Yazılır, Ne Zaman Koda Dönüştürülür?

Kodun anlatabildiğini koda (isim, const, enum, method), anlatamadığını (neden, uyarı, dış bağlam, public API contract'ı) comment'e yaz: legacy OrderService'teki comment'lerin çoğu kodu tekrar ediyor, ikisi yalan söylüyor, changelog ve commented-out kodun yeri ise Git. Yazı XML doc comment'lerin CS1572/CS1573/CS1574/CS1591 ile nasıl doğrulandığını ve Ousterhout'un interface comment savunusunu gerçek çıktılarla anlatıyor.

7 Kas 2026 11 dk 1
Blog Haritası