C# Veri Kapsülleme (Class Encapsulation) {Get/Set Mevzuları}

Eyyoo eyyoo herkese selamlar…
Bugün sizlere github’da ki projelere bakınca ‘bu değişkenlere neden sadece int veya string diye bırakmıyoruz?/niye get-set ile uğraşıyoruz?/nedir bu get-set?” dedirten veri kapsüllemeyi inceleyip, nasıl kullanılacağını örnekleriyle birlikte sizlere anlatmaya çalışacağım.

Kapsülleme, sınıf içindeki değişkenlere erişimi kaldırmak ya da kısıtlamak için kullanılır. Önemli bir değişkeni public olarak tanımlamak, değişkene yazılımcı tarafından -bilinçli ya da bilinçsiz- müdahaleye açık hale getirir. Bu da sınıf içindeki metodların çalışmasını olumsuz etkileyebilir. Bu gibi durumların önüne geçmek için kapsülleme tekniği kullanılmaktadır.(*1)

Yanii.. Get ve Set metodlarını birer kontrol mekanizması olarak düşünebiliriz . Kod blokları arasında oluşabilecek hataları önceden engelleyen “hoopp hemşerim nereye” diyen bodyguard’ımız 🙂 tabi sadece hataları engellemek için değil, diğer istediğimiz limitlemeleri, koşul kontrollerini de get & set içinden yapabiliriz.

Bilmemiz gereken bilgiler;
• get : Kapsül içindeki verileri okumamız için çalışan metod. (Get -> Getir olarak aklınızda kalabilir)
• set : Kapsüle veri göndereceğimiz zaman kullanacağımız metod.
• value : Kapsüle dışardan gelen veriyi incelemek veya atama yapacağımız zaman kullanacağımız anahtar kelime,
• return : Geriye bir değer döndürmemize yardımcı olan anahtar kelime.

Örneğin nerelerde Get&Set kullanabiliriz?
– Kimlik numarasına harf ataması yapılmasını engelleme durumunda,
– Belirli bir kritere uygun olup olmamasını kontrol ettirme gibi durumlarla örneklendirebiliriz..

Şimdi birlikte kısa bir örnek yapalım;
Hedefimiz şu : Kullanıcıdan bir TC kimlik numarası isteyeceğiz ve TC numarasını tekrar çağırdığımızda ilk 4 hanesini görüp geri kalanını yıldız (*) ile gizleyeceğiz.
(benzeri örnek: 16haneli kredi kartı bilgisinin ilk 4 hanesini görüp kalanının *** olması gibi..)

İlk önce Personel.cs olarak bir class açıyorum ve malzemelerimi yavaş yavaş ekliyorum;
1-) _tckimlikNumarasi adında uzaklardan erişimi olmayan bir private değişken oluşturuyorum.
2-) tckimlikNumarasi adında her yerden erişilebilen, gelen veriyi _tckimlikNumarasi ‘e aktaracak bir kapsül oluşturuyorum.


public class Personel
    { 
        private string _tckimliknumarasi; 
        public string tckimlikNumarasi{ get; set; }  
    }

* _tckimliknumarasi olarak açılan değişkenim private olduğu için diğer classlardan erişimi olmayacaktır. Veri gönderdiğim zaman bütün iş yükü tckimlikNumarasi ‘nin set bloğu arasında olacaktır.

Şimdi projeye geri dönersek; İlk önce kullanıcıdan gelen TC numarasının boş olup olmadığını daha sonrasında da 11 haneli olup olmadığını kontrol edeceğiz. Eğer kriterlere uyuyorsa hata mesajım çıkacak, uymuyorsa direk else bölümüne geçip _tckimliknumarasi değişkenine verimi atayacağım.


public string tckimlikNumarasi
        {
            get { return _tckimliknumarasi;  }
            set
            {
                if (String.IsNullOrEmpty(value) || value.Length != 11) 
                {
                    Console.WriteLine("Lütfen 11 haneli TC numaranızı giriniz!");
                }
                else
                {
                    _tckimliknumarasi = value;
                }
            }
        }

* Şimdi set tarafımdaki koşullarım bitti, hemen get tarafını kodlamaya başlıyorum.

Get tarafında ki amacım neydi? tckimlikNumarasi çağırdığım zaman 11 hanenin ilk 4hanesini gösterip 7haneyi yıldız yapmaktı…

Hatırlarsanız string değerlerin belirli bir aralığını almak istiyorsak Substring kullanıyorduk. O yüzden _tckimliknumarasi değişkenime 0,4 Substringi uygulayıp sonuna da yıldızlarımı ekledim mi istediğim her şey olmuş olacak 🙂

 
 get
 {  
     _tckimliknumarasi = _tckimliknumarasi.Substring(0, 4) + "*******";
     return _tckimliknumarasi;
 }

Personel.cs tarafım hazır, Program.cs tarafına geçip per adında Personel classını üretiyorum.

 Personel per = new Personel();

Artık işim personele tc numarası atamak ve tc numarasını çağırmak…


 Personel per = new Personel();
 per.tckimlikNumarasi = "62411867016";

 Console.WriteLine(per.tckimlikNumarasi);

Kodumuzu şimdi inceleyelim bakalım;

Leave a Comment