Derinlemesine Recordlar

Selamlar,

Bu makalede Recordlar nedir ve neye çözüm olmaktadır? Class’lara göre avantajları nelerdir ? Inheritance, Deep Copy, Immutable gibi farklı taraflardan inceleyip, bu sorulara cevap bulmaya çalışacağız.

Recordlar Nedir ? Ne amaçla kullanılmaktadırlar?

Recordların esas amacı, datanın özlü ve değişmezliğinin sağlanmasıdır. Eğere bir değişiklik gerekiyorsa yenisini yarat fikrinin esas amacı, oluşabilecek hataların önüne geçmek, riskleri minimize etmek ve güncelleme sırasında oluşabilecek bugları engellemektir. Bu yüzden recodlar immutable’dır. Yani immutable atanan değerler asla değişmezler.  Ayrıca recordlar, sanıldığının aksine value type değil, referance type nesnelerdir. Classlara göre yeni gelen birçok ek özellikleri bulunmaktadır. Recordlar, equality yani eşitliğe, value yani değerlere bakarak kıyaslamakta, classlarda ise bu iş tamamen referans adresler üzerinden yürütülmektedir. Makalenin devamında bu konuya ayrıca değinilecektir. Son olarak propertyleri default olarak immutable değildir. Sizin tanımlamanız gerekmektedir.

Record ile Struct’ın Tam Olarak Farkı Nedir ?

  • Recordlar referance type iken, structlar value typedir.
  • Struct ve Recordlarda eşitlik karşılaştırması, valuelar üzerinden yapılırken, classlarda  referancelar üzerinden yapılmaktadır.
  • Function parametrelerinde, class ve recordlar referance tip olarak geçerken, structlar value tip olarak atanmaktadırlar.
  • Inheritance’ı, class ve recordlar desteklerken, structlar desteklememektedir.
  • ==” equlity check’i, Struct desteklemez. Class ve Record destekler.

Aşağıda görüldüğü gibi 3 eşlenik Record, Struct ve Class motorlar birbirleri ile karşılaştırılmaktadır. ReferanceEquals() her zaman Structlarda “False” değeri döndürürken, Recordlarda ve Classlarda nesenlerin referansları karşılaştırılır ve bu örnekde geriye “True” döndürülür.

Sonuç:

With İle Clonelama:

Aşağıda görüldüğü gibi Iphone13Mini ürünü, onUcProMax’in “with” keyword’ü ile Shallow Copy‘si alınmıştır. ProductName ve IMEI değerleri değiştirilmiştir.

Sonuç:

Class Vs Record : 

Aşağıda görüldüğü gibi Class, ShallowCopy ile kopyalanmıştır. Recordın da, with ile eşleniği alınmıştır. Classda, classSuzuki1 ve classSuzuki2 sınıflarının referancelarına göre eşitliğine bakıldığı için, “==” geriye “False” değeri dönülmüştür. Record da ise, recordHonda1 ve recordHonda2 nesnelerinin valuelarına göre eşitliğine bakıldığı için, geriye “True” değeri dönülmüştür.

Sonuç: 

Nasıl gördüğünü değiştir, nasıl değiştiğini gör!  ―Buddha

Struct Property init(): 

Aşağıdaki Record propertyleri “init” olarak tanımlarsanız, sonradan değerlerini değiştiremessiniz. Kısaca ReadOnly olurlar.

Aşağıda görüldüğü gibi “Price” property’sinin değişimine izin verilmemektedir.

Positional Records:

Aynı durum, Positional Record tipleri için de geçerlidir. Aşağıda görüldüğü gibi Constructorda tanımlanan propertyler, default olarak “init” olarak atanmışlardır. Yani sonradan değiştirilemezler.

Deconstructor: 

Aşağıdaki örnekde, Record eşitlikde tuple bir değer dönülmektedir. Böylece ara işlemlerde recordlar, büyük bir kolaylık sağlamaktadırlar.

Her değişim daima başka değişimlere ihtiyaç gösterir.  ―Niccola Machieavelli

Inheritence:

Recordlar yanlızca başka bir record’dan Inheritance alabilirler. Bir class, record’dan inheritance alamaz. Aşağıda, bir Product record’u oluşturulmuştur. Iphone, bu Product’dan türetilmiştir. Son olarak Iphone13ProMax’de, Iphone’dan türetilerek aynı zamanda Product’dan da türetilmesi sağlanmıştır.

Örnek kullanım şekli:

Sonuç:

Örnek 2 Positional Recordlarda Inheritance:

Sonuç:

“Rüzgarın yönünü değiştiremiyorsanız, yelkenlerinizi değiştirin.” ―Max de Pree

With İle Clonelanan Record Değişir ise Root Record da Değişir mi?

Propertyleri Primitive typelardan oluşan bir Record, değişmez. Ama ya Record’un propertylerinden biri, gene Record ise! Yani complex bir type ise!

Aşağıda görüldüğü gibi, Person recordunu bir property’si de Scholl record’udur. Yani Person record’una, Complex tipde bir property atanmıştır.

Aşağıda görüldüğü gibi  Person bora, “Hurriyet Koleji” adında bir okul ile tanımlanmıştır. Ayrıca jordan record’u “with” keyword’ü ile bora’dan “Shallow Copy” şeklinde clonelanmıştır.

jordan’ın Scholl.Name değiştiği zaman, root’daki boranın da okul ismi değişmektedir. Çünkü “with” keyword’ü ile Primitive tipler clonelanırken, Scholl record gibi Complex tipleri clonelanamayıp, aynı referance adresini göstermektedir. Bu nedenle jordan’ı ait Scholl recordunun bilgileri değiştirilir ise ,aynı referance adresinin gösterildiği bora’nın da School bilgileri değişir.

Bu durumun yaşanmaması için, complex tipli Recordlarda, DeepCopy yönetemine gidilip, “with” keywordünden uzak durulması gerekmektedir.

Sonuç:

Record ile Genericler:

Aşağıda görüldüğü gibi, “Product” record’undan türeyen 2 Iphone record aşağıdaki gibi tanımlanmıştır.

Calculate<T>  Generic Class: Aşağıda görüldüğü gibi, Calculate sınıfı “Product” record tipinde bir nesne beklemektedir. TotalCost() methodu bu “T” tipinde bir nesne’yi parametre olarak beklemektedir. Ve geriye double tipinde bir değer döndürmektedir.

Main(string[] args): Aşağıda görüldüğü gibi Calculate class’ına “phone“‘dan türüyen, “IPhone13ProMax“sınıfı atanmış ve parametre olarak Claculate() sınıfına gönderilmiştir. Son olarak TotalCost() methodu ile satış fiyatı ekrana basılmıştır. Böylece Recordlar, Generic classlarda rahatlıkla kullanılabilmişlerdir.

Sonuç:

Bu makalede Recodların Immutable özelliğinden bahsettik. Belki asenkron programlamada Race Condition’a düşmemek için, Recordların Immutable özelliğinden faydalanabiliriz. Sonuçta locklamaya gerek kalmadan, kullanımı deneyebiliriz. Hızlıca “with” ile clonelaması data kopyalamada, ve constructor’a ihtiyaç duymadan propertylerin set edilebilmesi, bize kod geliştirmede büyük bir kullanım kolaylığı sağlamaktadır. Ayrıca data eşitliğinde referance yerine değer tipine bakması, bazı bussines logiclerde çokça işimize yarıyacak gibi gözüküyor.

Geldik bir makalenin daha sonuna. Yeni bir makalede görüşmek üzere hepinize hoşçakalın.

Kaynaklar:

Herkes Görsün:

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir