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
502 yazı bulundu
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 5
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 5
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 3
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 4
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 4
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 4
Clean Code'da Fonksiyonlar: Küçük Method, Tek Soyutlama Seviyesi ve Guard Clause
Yazılım Tasarımı SERİ 03

Clean Code'da Fonksiyonlar: Küçük Method, Tek Soyutlama Seviyesi ve Guard Clause

Bir method tek bir iş yapmalı ve tek bir soyutlama seviyesinde kalmalı: legacy OrderService'teki 136 satırlık ProcessData guard clause, step-down rule, parameter object ve CQS (Command-Query Separation) ile bölününce Cognitive Complexity 92'den en yüksek 5'e iniyor ve dokuz senaryoda davranış aynı kalıyor. Yazı flag argument'ları, out yerine record dönmeyi, ThrowIfNull gibi guard helper'ları ve aşırı bölmenin bedelini (Ousterhout'un shallow method eleştirisi) gerçek çıktılarla anlatıyor.

7 Kas 2026 17 dk 2
Clean Code'da Naming: Niyet Anlatan İsimler, .NET Naming Guideline'ları ve Türkçe-İngilizce Karışımı
Yazılım Tasarımı SERİ 02

Clean Code'da Naming: Niyet Anlatan İsimler, .NET Naming Guideline'ları ve Türkçe-İngilizce Karışımı

İyi isim, okuyucunun kodu açmadan soracağı soruları cevaplar: legacy OrderService'teki d, tmp2, k ve int t isimlerini domain diliyle ve sabitlerle değiştirmek davranışı değiştirmeden (beş senaryoda aynı toplam) fiyat hesabını okunur kılıyor. Yazı .NET naming kurallarını, Hungarian notation'ı, Türkçe-İngilizce karışık isimleri ve ToLower()'ın tr-TR'de Id'yi ıd yapan Turkish-I tuzağını gerçek çıktılarla anlatıyor.

7 Kas 2026 14 dk 6
Clean Code Nedir? Okunabilirlik, Değişim Maliyeti ve 2025'teki İkinci Baskı
Yazılım Tasarımı SERİ 01

Clean Code Nedir? Okunabilirlik, Değişim Maliyeti ve 2025'teki İkinci Baskı

Clean Code, çalışan kodun ucuza değiştirilebilir ve okunabilir olmasıdır: Bookstore'un legacy OrderService'inde aynı sepet Türkçe I tuzağı, kopyalanıp ayrışmış fiyat hesabı ve DateTime.Now yüzünden dört farklı tutar üretiyor. 2025'te çıkan ikinci baskı kitabı Code, Design, Architecture ve Craftsmanship kısımlarıyla yeniden yazdı; seri bu 609 satırlık dosyayı adım adım temizleyecek.

7 Kas 2026 16 dk 5
Prensiplerin Eleştirisi: CUPID, Over-Engineering ve SOLID'in Gerçekten Gerektiği Yer
Yazılım Tasarımı SERİ 12

Prensiplerin Eleştirisi: CUPID, Over-Engineering ve SOLID'in Gerçekten Gerektiği Yer

SOLID'in değeri bağlama bağlı: çok ekipli, uzun ömürlü ve sık değişen kodda değişim maliyetini düşürür, script, prototip ve küçük CRUD uygulamalarında ise çoğu zaman yalnız katman ekler. Aynı bildirim özelliğinin minimum, dengeli ve aşırı üç tasarımında push kanalı eklemenin ölçülen maliyeti, Dan North'un CUPID önerisi ve Ousterhout'un deep module uyarısı.

7 Kas 2026 11 dk 5
Component Prensipleri: .NET Solution'ını Project'lere Bölmek (REP, CCP, CRP, ADP, SDP, SAP)
Yazılım Tasarımı SERİ 11

Component Prensipleri: .NET Solution'ını Project'lere Bölmek (REP, CCP, CRP, ADP, SDP, SAP)

Bir solution'ı project'lere bölerken birlikte değişen class'lar aynı project'te durmalı, bağımlılıklar döngüsüz ve stabil olana doğru akmalı, stabil project'ler de abstract olmalı. Herkesin bağımlı olduğu Common project'inin bedelini ölçmek, instability ve abstractness metriklerini gerçek bir solution'da hesaplamak ve main sequence'i doğru okumak.

7 Kas 2026 12 dk 3
Daha Az Bilinen Prensipler: Separation of Concerns, Least Astonishment, Fail Fast, CQS ve GRASP
Yazılım Tasarımı SERİ 10

Daha Az Bilinen Prensipler: Separation of Concerns, Least Astonishment, Fail Fast, CQS ve GRASP

SOLID dışındaki prensipler günlük kararların çoğunu verir: Fail Fast hatayı açılışta yakalar, CQS sorunun cevabı değiştirmesini engeller, GRASP de bir sorumluluğun hangi class'a ait olduğunu sorar. Options validation ile yazım hatasını yakalamak, Math.Round sürprizi, getter'da yan etki, Explicit Dependencies, Persistence Ignorance ve prensipler çatışınca karar vermek.

7 Kas 2026 12 dk 5
Blog Haritası