C# Record Types ve Value Objects: Domain Modellemede Güç
Merhaba,
C# 9 ile gelen Record Types, immutable veri modellemesi için güçlü bir araç. Value Objects tasarım deseniyle birleştirildiğinde domain-driven design uygulamalarında çok temiz kod yazmanızı sağlıyor. Gelin birlikte inceleyelim arkadaşlar.
Record Types Nedir?
Record, C# 9 ile gelen ve değer semantiğini referans tiplerle birleştiren özel bir sınıf türü. Temel özellikleri:
- Yapısal eşitlik (structural equality) iki record içerikleri aynıysa eşit
- Immutability (varsayılan olarak)
- Positional syntax ile özlü tanım
withifadesiyle kopyalama ve değiştirme- Otomatik
ToString()implementasyonu
Record Class vs Record Struct
C# 10 ile Record Struct da geldi. Seçim kriterleri: küçük, primitive benzeri değerler için Record Struct (stack allocation), referans semantiği veya kalıtım gerekiyorsa Record Class. Kurumsal uygulamalarda çoğunlukla Record Class yeterli.
Value Objects ile Kullanım
Domain-Driven Design'daki Value Object kavramı Record ile mükemmel eşleşiyor. Örnek: Para birimi, e-posta adresi, TC kimlik numarası gibi değerleri primitive obsession yerine güçlü tiplerle modelleyebilirsiniz. Email record'u oluşturup validation'ı constructor'da yapınca sisteminizin her yerinde geçerli email garantisi oluyor.
Immutability Avantajları
Immutable nesneler thread-safe'dir. Paralel işlemler sırasında race condition riski yok. Koleksiyonlarda paylaşılabilirler. Hata ayıklama kolaylaşır nesnenin durumu değişmediği için yan etki takibi basitleşir.
with Expression ile Non-Destructive Mutation
with ifadesi record'un değiştirilmiş kopyasını yaratır. var yeniAdres = mevcutAdres with { Sehir = "Ankara" } orijinal nesne değişmeden yeni bir kopya oluşturulur. Özellikle event sourcing ve CQRS pattern'lerinde çok kullanışlı.
Record ve EF Core
Entity Framework Core ile Record kullanımında dikkat gereken noktalar var. EF Core, entity'leri takip etmek için referans eşitliği kullanır, Record'ların yapısal eşitliği bunu karıştırabilir. Genellikle DB entity'leri için class, DTO ve value object'ler için record önerilir.
Positional Records
En özlü record tanım biçimi positional syntax: record Point(double X, double Y); tek satır. Constructor, deconstruct, equality hepsi otomatik geliyor. DTO tanımlamak için mükemmel.
Sonuç
Record Types, C#'a fonksiyonel programlama dünyasından önemli bir yetenek kazandırdı. Domain modellemesinde Value Objects için, DTO'larda ve event payload'larında bugün kullanmaya başlayın :)
İyi Günler Dilerim,
Bu yazıyı paylaş: