C#’ta Etki Alanına Dayalı Tasarım: Değişmez Değer Nesneleri

Tüm bu kazan plakası kodunun bizim için uygulanması çok güzel. Bu olmadan, “Julie” ve “Lerman” içeren iki nesne, Equals veya == operatörüyle eşit görülmeyecektir. Ancak bu kod yürürlükteyken, eşitlik yalnızca iki özellik değerine dayanır ve tanınır. JetBrains’ Rider’ın da benzer bir özelliği var. VS Kodu uzantıları için hiçbir şey görmedim.

C#9 Kayıtlarını Kullanma

Başka bir seçenek de yeni C#9 kayıt özelliğidir. Yazar Thomas Claudius Huber’den kayıtlar hakkında daha fazla bilgiyi thomasclaudiushuber.com/2020/09/01/c-9-0-records-work-with-immutable-data-classes adresinde bulabilirsiniz.

IEquatable’ı uygulamak ve bu kodun tamamını değer nesnenize eklemek yerine, türü sınıftan kayda değiştirebilirsiniz. Orijinal sınıfın bir kopyası var (PersonFullNameRecord adını verdiğim Hızlı Eylemi kullanmadan önce ve tek fark, bunun bir sınıf değil, bir kayıt olarak bildirilmiş olmasıdır.

genel kayıt KişiTamAdıKayıt

Derleme zamanında, C#, diğer bazı güzelliklerle birlikte tüm eşitlenebilir ve karma kod ortak plakasını ekleyecektir. Aslında, Visual Studio için ILSpy uzantısını kullanarak (hata ayıklarken) derlenmiş sınıfın gerçekten de yerleşik bir ortak plakaya sahip olduğunu görebiliyordum. Sınıfın derlenmiş sürümü biraz uzun ama onu bir metin dosyası olarak ekledim çözümde. Ancak sınıfın önceki sürümüne eklediğim her şeye ve PrintMembers ve ToString geçersiz kılma gibi bazı ek yöntemlere sahiptir ve bu kaydı partiye getirir.

C#9 kayıtları, belirli değer nesnenizdeki her sorunu çözmeyebilir, bu nedenle kullanım durumlarınızı test ettiğinizden emin olun!

Başka bir yol, Jimmy Bogard’ın ValueObject (2007’den itibaren) veya Pluralsight yazarı, Vladimir Khorikov’un ValueObject veya bu kavramı genişleten diğer uygulamalar gibi gerekli tüm mantığı uygulayan akıllı bir temel sınıftan miras almaktır.

Peki ya Veri Kalıcılığı?

Tipik olarak, value nesnesi özelliğinin değerleri, varlığın eşlendiği veritabanı tablosunda depolanır. Benim durumumda, bir Yazarlar tablosu, verilen ve soyadı değerleri için sütunlar içerecektir. Veri kalıcılığı uzmanlığım, değer nesnelerini kalıcı kılmak için bize iki yol sağlayan .NET’in Entity Framework Çekirdeğidir. İlk yol, EF Core’a ait varlık (veya sahip olunan koleksiyon) eşlemesidir (https://docs.microsoft.com/en-us/ef/core/modeling/owner-entities). Bu, özellik olarak kullanılan karmaşık türler için tasarlanmıştır. Değer nesnesini tanımlamamıza yardımcı olan değişmezlik ve eşitlik nitelikleri, yolculuk için ortaya çıkıyor.

Tek bir değere sahip kalıcı değer nesneleri için çok iyi çalışan bir başka EF Core özelliği, Değer Dönüştürme’dir. Prince gibi tek ada sahip kişiler için OneWordName adında bir değer nesneniz olduğunu hayal edin. Bu türün TheName adlı bir dize özelliği ve alanınızla ilgili bazı ek yardımcı mantığı vardır. EF Core’un HasConversion eşleme yöntemiyle, OneWordName nesnesini bir dizeye dönüştürebilirsiniz (EF Core bu tek özelliği bulur) ve ardından EF Core, dizeyi bir veritabanı şemasına kolayca eşleyebilir. HasConversion ayrıca verileri nesnelerinize yeniden sulandırma mantığına sahiptir.

Sparkjoy’un 2012’de söylediği gibi, “Bütün bu izolasyonun güzelliği, Etki Alanına Dayalı Tasarımın temel hedeflerinden biri olan, yalnızca kısa ve öz iş mantığı bırakarak, teknolojiden yoksun, bozulmamış bir etki alanı katmanı oluşturmamızdır”.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.