Recordlar Nerede Kullanılır Ve Classlar Yerine Kullanılabilirler mi ?

Selamlar,

Bu makaleyi, C# 9 ile baya bir zaman önce hayatımıza giren Recordların pek de kullanılmadığını görmem üzerine yazmaya karar verdim. Tam olarak kullanım alanları nerelerdir ve Class ‘dan farkları var mıdır ? Eğer Recordlar hakkında bilginiz yok ise şu makalemden başlamanızı tavsiye ederim.

How do vinyl records work? Step by step explanation (updated 2024)

Bilmek Kullanmak Degildir ! ―@coderbora

Class:

Aşağıda .Net’de yıllardır kullanılan klasik bir ürün sınıf yapısı görülmektedir. Propertyler, Constructor’da alınan parametreler ile setlenmektedir.

Record:

Aynı durum Recordlarda, aşağıdaki gibi tek satır ile tanimlanabilmektedir.

Buradaki Class VS Record Esas Farklar Neler ?

A-) Mutability:

Aşağıda görüldüğü gibi Calss için atanan değerler sonradan değiştirilebiliyorken, record için atanan değerler sonradan değiştirilemez(Immutability). “productRecord” için geçerli “ProductQuntity” sonradan değiştiremez iken, “product” sınıfı için geçerli “ProductQuantity” değeri sonradan güncellenebilmiştir.

Gelelim esas soruya. Bunu nerde kullanabiliriz ? Değişmesini istemediğimiz yerlerde. Mesela :

Api Response:

Endpoint’den dönecek modeller için değişim istenmez. Hesaplanan ya da çekilen datanın geri dönülmesi istenir.

DTO (Data Transfer Object):

Farkli katmanlar arasında data aktarımı sırasında da data tutarliliğı çok önemlidir. DTO nesnelerinde, Immutable yapıları nedeni ile Recordlar kullanılabilir.

Config Class:

Config dosyalarının, bir sınıfa maplendiği yapılarda, yine Recordlar Immutable yapısı ile çok mantıklı olacaktır.

Gelelim Class Vs Record’da Value Equality’e:

Class ve Recordlarin değer eşitliği kavramı farklıdır. Sınıflar, eşitlikte referans adreslerine bakarken, recordlar referans adreslerinden bağımsız, doğrudan valuelarına bakarlar.

Yukarıdaki örnekde görüldüğü gibi iki class eşitliğinde, referansları farklı olduğu için “false” dönmüştür. Ama Recordlarda sadece değerlere bakıldığı için “true” dönmüştür.

Database Entity:

Database üzerinde değişen dataların karşılaştırılması için Recordlar, tam bir biçilmiş kaftandır. Örneğin data değişmiş ise Update, değişmemiş ise hiçbir işlem yapılmasın diyebiliriz.

Cache Keys:

Immutable olmasini istediğimiz konuların başında Cache’e atadığımız keyler vardır.

Kullanışı:

Çıktı:

Audit, User veya Authorization Loglar:

Recordlar gene immutable yapıları ile değişmesini istemediğimiz logların, basit ve okunabilir bir şekilde kodlanmasını sağlarlar.

Class Ve Recordlarda Clone:

Recordlarda “with” keyword’ü ile Shallow Copy işlemi yapılır yani, complex type propertyler için gene Deep Copy işlemi yapılması gerekmektedir. Recordlar’da clonelama işlemi with ile, sade okunabilir ve kolay bir şekilde aşağıda görüldüğü gibi yapılabilmektedir.

Sonuç: “Iphone13ProMax { ProductName = Iphone13 Mini, Price = 70000, IMEI = 398429384293846, IsNew = True, IsGuaranteed = False }”

İsterseniz Classların içinde Recordları Kullanabilirsiniz:

Aşağıda görüldüğü gibi Program sınıfı altında “ProductRecord” tanımlanmıştır. Random olarak oluşturulan tüm Productlar, List of Record olarak geri dönülmektedir. Bu sayede, daha sade ve okunabilir bir koda sahip olunmaktadır.

Result:

Özellikle Prototype gibi oyun geliştirmede sıkça kullanılan Design Patternler için Recordlar çok pratik yapılardır. Prototype’ın özünde, birbirinin aynı ama sadece bazı alanları farklı nesneleri, tekrar tekrar yaratmak yerine clonelama ve farklı özellikleri tekrar atama mantığı vardı. İşte tam bu noktada Recordlar, bize büyük kolaylık sağlamaktadır.

Prototype pattern - một trong những pattern phổ biến nhất - KieBlog

Sonuç:

Recordlar özellikle immutable yapısı ile projede değişmesi istenmeyen yapılarda, ne kadar faydalı olduğunu hep birlikte gördük. Özellikle Cache Key, Audit Log ve Config sınıflarda Record kullanımı bize büyük kolaylıklar sağlayacaktır. Recordlarda, sınıflara göre nesnelerin eşitlik ilkesi referansları ile değil value değerlere göre bakıldığı için, özellikle Repository ya da servislerde, seçilecek operasyon tipinin belirlenmesinde kullanılabilirler. Servislerde Global dönülen Result tiplerinde, recordlar immutable özelliklerinden dolayı özellikle tercih edilebilirler. Clonelama gerektiren Prototype gibi farklı Design Patternlerinde veya operasyonlarda Recordların “with” sayesinde basitçe özelleştirilip kullanılması, kod okunaklıgını arttırması genel kullanım sebeplerinden biri olabilir.

Bu makalede aklıma gelmeyen ama karşılaştığımda sizlerle paylaşacağım recordlar ile alakalı daha birçok durum olabilir. Umarım Recordların hayatımıza kattığı kolaylıkları fark eder ve projelerinizde ona daha çok yer verirsiniz. Yeni bir makalede görüşmek üzere hepinize hoşçakalın.

Source:

  • https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/record
  • https://devblogs.microsoft.com/dotnet/welcome-to-c-9-0/
  • https://medium.com/@dotnetcode/exploring-the-differences-between-classes-and-records-in-c-and-when-to-use-each-07929b037b2e

 

 

Herkes Görsün:

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

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