C#

C# Record Types ve Value Objects: Domain Modellemede Güç

· 7 dakika okuma · 1
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
  • with ifadesiyle 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ş: