4 Mayıs 2023 Perşembe

OOP | Class Members

Class Members

1. Field
👉🏻Nesne içerisinde veri depolanan alan. Class içerisinde tanımlanan değişkenlerdir. (Her değişken field değildir, class içerisinde olması önemli.)
👉🏻 Herhangi bir türden olabilir.

İnceleyelim:
MyClass adında bir sınıfımız var. İçerisinde int a; değişkeni tanımlamış olalım. MyClass içerisinde new MyClass(); ile nesne oluşturduk, bu nesne Heap üzerinde oluşturulacak. Buna erişim için de MyClass türünden m1 referansı ile işaretleme yaparız. m1 referansından sonra . koyarak o sınıf içerisinde hangi elemanlar varsa erişim sağlamak mümkün. (Örn. m1.a = 5; tanımı yaparsak bundan sonra projede m1.a dediğimizde  değerini getirecek.) 

MyClass sınıfındaki nesnelere erişmek için public hale getirilmesi önemlidir: 

    public class MyClass    

ya da sadece o değişken için: 

    public int a;


👉🏻Field, türüne özgü varsayılan değeri alır. Örneğin int a; yazıldığında Stack'te 0 değeri atanmış olur. Çünkü int sayısal bir değerdir ve default değeri sıfırdır. Ancak bu sadece field için geçerlidir, yani bir metot vb. içerisinde tanımlanan değişkenin default değeri olmaz.



2. Property

👉🏾 Nesne içerisinde özellik sağlar.

👉🏾Esasında pragmatik/algoritmik kodlarımızı inşa ettiğimiz bir metottur. Ancak normal metottan farklı olarak parametre almaz ve get - set bloklarını barındırır.
👉🏾 İşlevsel olarak metottan farkı yoktur, ancak davranışsal olarak nesne üzerinde değer okuma ve değer atama işlemlerinde kullanılır.
👉🏾Property'ye değer atandığında bu değer set bloğunda yakalanır. Bu değer okunmak istendiğinde de get bloğu tetiklenir.

Normal metot örneği:


Property örneği:


Property Neden Kullanılır? : Yazılımcılar nesneler içerisindeki field'lara direkt erişilmesini istemez. Dolayısıyla field'lardaki verileri kontrollü bir şekilde dışarı açmayı/dışarıdan da kontrollü bir şekilde değer almasını sağlamayı tercih ederler. (Birinin cüzdanından direkt para almak yerine kendisinden istemek gibi.) İlgili field değerinin tümü ya da bir kısmı talep edene gönderilir, böylece kontrol sağlanmış olunur. Kontrollü erişimi sağlamak için C# dilinde metot yerine property yapıları geliştirilmiştir. Encapsulation kavramı bununla ilişkilidir.


📌Not: Encapsulation, bir nesne içerisindeki dataların (field'lardaki verilerin) dışarıya kontrollü bir şekilde açılması ve veri almasıdır.

 


Property İmzaları

Property yapısı oluşturabilmenin yapısal olarak birkaç farklı yolu/imzası vardır:

  • Full Property
  • Prop Property
  • Auto Property Initializers
  • Ref Readonly Returns
  • Computed Properties
  • Expression-Bodied Property (Read Only/Write Only Property)
  • Init-Only Properties & Init Accessor


2.1. Full Property

👉En sade property yapılanmasıdır.

👉İçerisinde get ve set blokları tanımlanmalıdır.
👉Dışarıdan erişilip erişilmeyeceğini belirlemek için önce [erişim belirleyicisi], sonra [geri dönüş değeri] belirtilmeli.
👉Full property'de set bloğu tanımlanmazsa sadece okunabilir (read only); get bloğu tanımlanmazsa da sadece yazılabilir (write only) olacaktır.
👉Property hangi türden bir field'ı temsil ediyorsa o türden olmalıdır. int ise int, string ise string...
👉İsimlendirmede standart kurallar devam eder (Sayı/özel karakterle başlayamaz). Genellikle temsil ettikleri field'ların baş harfi büyük hali ile adlandırılır:
    int yas;  field
    public int Yas  property

Bu şekilde property'nin hangi field'ı temsil ettiği (hangisini kapsüllediği) anlaşılır.

Yaş değeri dönülürken get, yaşa bir değer atanırken set tetiklenir. 
Sadece get kullanılırsa değerin sadece kontrollü bir şekilde okunmasına izin verilir (read only); sadece set bloğu açık bırakılırsa bu sefer de değer okunmaz ve sadece atama yapılabilir (write only).

📌Not: Value keyword property türü ne ise o türe bürünür.

 


2.2. Prop Property

👉Bir property her ne kadar encapsulation yapsa da temsil ettiği field'daki dataya hiç müdahale etmeden erişilmesini ve veri atanmasını sağlıyorsa prop property kullanılmıştır. Örneklendirelim: Elimizde 10 değeri var, bu değeri talep edildiğinde olduğu gibi gönderiyoruz. Bu durumda encapsulation yapılma nedeni field'lardaki değere müdahale edilme durumuna bakılmaksızın doğrudan erişilmesinin istenmeyişidir.

👉Prop propertyler compile edildiklerinde arka planda kendi field'larını oluştururlar. Dolayısıyla bir field tanımlamaya gerek yoktur. Prop kullandığımızda kendi field'ımızı kullanmıyoruz, eğer kendi field'ımızı kullanmak istiyorsak prop kullanmıyoruz. (Yani başta int yasi; gibi bir field olmaz.)
👉Prop imzada ilgili property read only olabilir ama write only olamaz.
👉İlk değeri atadıktan sonra (auto property initializers) bunu başka yerde çağırmamıza müsaade ediyor ama aynısını set ile yapamıyoruz çünkü kullanamayacağımız değeri başka yerde çağırmamız engelleniyor.
Full property ile karşılaştıralım:

şeklinde uzun uzun yazmak yerine prop property kullanılabilir:



2.3. Auto Property Initializers (C# 6.0)

👉Bir property'nin ilk değerini nesne ayağa kaldırılır kaldırılmaz aşağıdaki gibi verebiliriz:

👉Yine compiler tarafından default field'lar oluşturuluyor ama ilk değerini verebiliyoruz.
👉Auto property initializers sayesinde read only olan proplara hızlıca değer atanabilmekte.


2.4. Ref Readonly Returns

👉Ref readonly returns, bir class içerisindeki field'ı referansıyla döndürmemizi sağlayan ve bir yandan da bu değişkenin değerini read only yapan özelliktir.

👉Metotlarda metoda dışarıdan gönderilen bir değişkenin hem değerini hem de referansını göndermek ve metot içinde yapılan işlemlerin değişkene etkisini görmek istiyorsak ref parametresi kullanırız. Ref Readonly ise metot yapısından çıkarak class yapısında işlevsellik kazandırır. Bir class değişkenini class nesnesi/tipi üzerinden referansı ile döndürme olanağı sağlar. Aynı zamanda döndürdüğümüz değişkenin değerini read only yapar.

Detaylı ve örnekli açıklamalar: https://www.gencayyildiz.com/blog/c-7-2-ref-readonly-returns/


2.5. Computed Property

👉Hesaplanmış property. İçerisinde türetilmiş bir bağıntı taşır. Normal property yapılanması vardır. 

Örnekte "Topla" her çağırıldığında hesaplanan s1 ve s2 toplamı dönecektir:



2.6. Expression-Bodied Property

👉Tanımlanan property'de lambda expression kullanmamızı sağlayan söz dizimidir. Bu propertyler read only olarak oluşturulacaktır.


Böyle bir property olduğunu düşünelim:
Lambda expression ile bu şekilde çağırabiliyoruz: 


2.7. Init-Only Property - Init Accessor (C# 9.0)

👉Init-Only property, nesnenin sadece oluşturulma anında propertylerine değer atar. Böylece iş kuralı gereği runtime'da değeri değişmemesi gereken nesneler için bir önlem alınır.

👉Init-Only property, developer açısından süreç esnasında değiştirilmemesi gereken property değerlerinin "yanlışlıkla" değiştirilmesinin önüne geçer ve yazılımı olası buglardan korur. Auto Property Initializers'ı anımsatabilir ama Init-Only C# 9 sürümünde farklı bir avantaj sağlamıştır: Object Initializer desteği.
👉Object Initializer'da bir nesne oluşturulurken nesne içerisindeki propertylere ilk değerlerini şu şekilde verebiliyoruz:

Bu read only davranışta oluyor, yani dışına çıkıp book.Name = "Aynadaki Muamma" yapamıyoruz. Ancak bu özelliği Init-Only destekler ve sonrasında read only özelliği gösterir.



3. Metot

👉🏻Nesne üzerinde field'larda ya da parametreler eşliğinde gelen değerler üzerinde işlemler yapılmasını sağlayan temel programatik parçalardır.

👉🏻Property'den farkı: Propertylerin kesinlikle bir türü olmalı (void olmamalı) iken metotlarda böyle bir şart yoktur. Aralarındaki temel fark metotların void olma ihtimalinin olmasıdır (void geri dönüş yapmaz).



4. Indexer

👉🏾Nesneye indexer özelliği kazandıran, işleyiş açısından property ile birebir aynı olan elemandır. Burada sadece property adı yoktur. this keyword ile kullanılır. 


(\_/) ( •-•) /づ💻

0 yorum:

Yorum Gönder