msHOWTO

17 Nisan 2012 Salı

C# OOP -2 Encapsulation

Merhaba arkadaşlar.Bu makalemde Oop kavramlarından biri olan Encapsulation'ı anlatmaya çalışacağım. Fakat encapsulation'ı anlatmadan önce bilmeni gereken bir kaç kavram vardır.Öncelikle bunlardan bahsedeceğim.

Kavramlardan birincisi Field kavramıdır.Diyelim ki 2 sayıyı toplan bir uygulamanız var.Ve en basitinden aşağıdaki gibi kod yazarsınız.

int sayi1=10;
int sayi2=20;
int toplam = sayi1+sayi2;

Yukarıdaki gibi girilen sayıların ve elde edilen sonucun değerini elde tutmak için değişkenleri kullanıyoruz değil mi arkadaşlar ? Hadi gelin bu işlemi bir sınıf içerisinde gerçekleştirelim.

Class Toplayan()
{

int sayi1=10;
int sayi2=20;
int toplam = sayi1+sayi2;

}

Ne değişti arkadaşlar? Kod aynı kod değil mi ? Buradan çıkaran kavram şudur arkadaşlar.Class içerisinde değer tutmak için kullanılan alanlara FIELD denir.

Bir diğer kavram ise Property kavramıdır.Yukarıdaki örneğimizde arkadaşlar field lara biz kendimiz değerlerini atadık.Fakat ya dışarıdan başka bir class dan veya başka bir uygulamadan bunlara erişip değer atamak istiyorsak hatta bu değişkenlere gönderilen değerleri kontrol edip belli bir işleme koyup sonuc elde etmek istiyorsak bu noktada PROPERTY kavramı ortaya çıkmaktadır.Bir diğer kullanım amacı da eğer class içerisindeki field a dışarıdan direk ulaşımı engellemek istiyorsak bu noktada da property kullanılmaktadır.


public string Tc { get{}; set{}; }

Yukarıdaki property örnek kullanımını biraz inceleyelim arkadaşlar.Public kısmı bu property nin access modifier(erişim belirleyici)'idir.Public olması property nin içerisinde bulunduğu classın dahil olduğu projenin her yerinden ve diğer projelerden erişilmesini sağlar.Access modifier konusuna daha detaylı olarak bir başka makalemde değineceğim. String kısmı ise bu property e gönderilen değer ve bu property nin göndereceği değer tipini belirtmektedir.Yani bu property e sadece ve sadece string tipinde değer gönderilir ve sadece string tipinde değer alınır.

Dikkat ettiyseniz get ve set keyword leri daha doğrusu blokları mevcuttur.Set bloğu bu property e dışarıdan değer gönderileceği zaman çalışır.Get bloğu ise bu property den dönen değeri almak istendiği zaman çalışır.

Bu kavramları anladıktan sonra gelelim asıl konumuza arkadaşlar.Encapsulation nedir? Ne amaçla kullanılır? Diyelim ki bir field a dışarıdan erişimi yasaklamak istiyoruz.Peki dışarıdan erişimi yasaklarsak nasıl değer atama işlemi yapılacak? Property oluşturacağız arkadaşlar.Bu property e dışarıdan erişimi sağlayıp bu property aracılığıyla field a değer ataması yapabiliriz arkadaşlar.Bu şekilde dışarıdan gelen değeri istediğimiz gibi kontrol edip istediğimiz durum sağlanırsa atama yapabiliriz.Hatta belli bir işleme tabi tutup çıkan sonucu field a atayabiliriz arkadaşlar.İşte field ve property lerin bir araya gelip bu amaçlarla kullanılmasına encapsulation denir.Mantığını daha iyi anlamak için bir insanın yaş değerini alıp eğer gönderilen değer boş değilse field a atayan ve istenildiği zaman yaş değerini veren 2 tane method yazalım arkadaşlar.

private string yas; // private access modifier ı sayesinde yas field ına sadece bu class içerisinden erişimi sağlayıp dışarıdan erişimi engellemiş olduk.
        public void SetYas(string value)
        {
            if (!string.IsNullOrWhiteSpace(value))
            {
                yas = value;
            }
            else
            {
                throw new Exception("Yaş bilgisi boş olamaz!");
            }

        }
//SetYas methodu ile dışarıdan gelen yas bilgisini bir takım kontrollerden geçirdikten sonra yas field ına atadık.

public string GetYas()
        {
            return yas;
        }
//GetYas methodu ile de insan nesnesinin yas değeri istenildiğinde geri döndürme işlemini yaptık arkadaşlar.

Evet arkadaşlar bu yaptığımız encapsulation değildir.Fakat encapsulation yapısı oluşturduktan sonra visual studionun arka planda bizim yaptığımız encapsulation işlemini bu şekilde method lara ve field lara böldüğünü kesinlikle söyleyebilirim.Bunu görmek istiyorsanız eğer reflactor programını kullanarak kontrol edebilirsiniz.Gelelim bu methodları encapsulation tekniği ile yazmaya.

  public string Yas
        {
            /*Property lerin alacağı ve vereceği değerler aynı olmak zorundadır.*/
            get { return yas; }
            set
            {
                if (!string.IsNullOrWhiteSpace(value))
                {
                    yas = value;/*set scop ları ıcerısınde sistemde tanımlanmış value değeri vardır.Dışarıdan gönderilen değer value ile alınır.Compile derlediği zaman set ve get kısımlarını yukarıdakı gibi method oluşturur.*/
                }
                else
                {
                    throw new Exception("Yaş bilgisi boş olamaz!");
                }
            }
        }



Görüldüğü üzere get ve set bloklarından oluşan property yazıyoruz.Yukarıdaki get ve set methodları ile aynı işlemi yapmaktadır.

Umarım faydalı olmuştur arkadaşlar.Bir sonraki makalemde görüşmek dileğiyle ...

Hiç yorum yok:

Yorum Gönder