28 Şubat 2011 Pazartesi

C# Encapsulation Kavramı

Nesne Yönelimli Programlamanın 3 temel felsefesinden biridir.( Diğerleri; Inheritance(Kalıtım) ve PolyMorphism(Çok Biçimlilik) ).En yakın türkçe çevirisi "kapsüllemek"dir. Nesnenin üyelerine yapılan erişimin kontrol altına alınmasına ve bu kontrolün nesnenin kendisi tarafından yapılmasına dayanan felsefedir.. Amaç; field'ları private yaparak bu alanlara dışarıdan erişimi önlemek ve get ile set metotları aracılığıyla kontrolü sağlamaktır. Şimdi bu felsefeyi bir örnek üzerinden anlamaya çalışalım.

Elimizde Id, Ad ve Fiyat alanları olan bir Urun sınıfı olsun. Klasik programcılıktaki tasarım aşağıdaki gibidir.

class Urun

    {

        public int Id;

        public string Ad;

        public double Fiyat;

    }

Eğer alanların başına "public" erişim belirleyicisini yazmasaydık, üyeler default olarak "private" olacak ve başka bir sınıftan bu üyelere erişim yapılamayacaktı. Şimdi Program sınıfında bir Urun nesnesi oluşturalım;

resim2

Mavi semboller ile gözüken alanlar, nesnenin field'larıdır. Field'ların erişim belirleyicileri public olduğundan dolayı Program sınıfında bu nesnelere erişebildiğimizi görüyoruz.

Oluşturduğumuz Urun nesnelerinin fiyatlarının sıfırdan küçük olamaması durumunu inceleyelim. Yani kullanıcı negatif bir değer giremesin istiyoruz. Bu kontrolü Program tarafında da yapabiliriz. Ancak bu iş Urun sınıfı nesnelerini ilgilendirdiğinden dolayı, kontrolü Urun sınıfı içerisinde yapmak daha doğru bir kodlama olacaktır. Bu kontrolü yapabilmemiz için Fiyat field'ını encapsulation felsefesine göre private yaparak 2 adet metot ekleyelim, birisi nesneye değer ataması kontrol eden Set_Fiyat metodu, diğeri de atanan değeri geriye döndüren Get_Fiyat metodu olsun;

class Urun

    {

        public int Id;

        public string Ad;

        private double Fiyat;

 

        public void set_Fiyat(double value)

        {

            if (value > 0)

                Fiyat = value;

            else

                Console.WriteLine("Fiyat negatif olamaz...");

        }

 

        public double get_Fiyat()

        {

            return Fiyat;

        }

    }

Yukarıdaki kodda görüldüğü gibi, oluşturulan Urun nesnesi üzerinden Set_Fiyat(değer) metodu çağırıldığında verilen değerin uygun olması durumunda field'a atama yapılmakta, aksi takdirde kullanıcıya hata mesajı verilmektedir. Get_Fiyat() metodu da atanan bu değeri geri dönmektedir. Ayrıca, kapsüllenen field'ın isimlendirmesi, başına "_" işareti konarak daha doğru, okunur ve standartlara uygun bir kodlama sağlar. (Yine de isimlendirme tercihe bağlıdır) Şimdi Program sınıfında bir Urun nesnesi oluşturup değer ataması yapalım;

class Program

    {

        static void Main(string[] args)

        {

            Urun u = new Urun();

            u.set_Fiyat(-100);

            Console.WriteLine(u.get_Fiyat());

        }

    }

Kodu çalıştırdığımızda aşağıdaki sonucu alırız;

resim5

İstediğimiz sonucu aldık. Uygun bir değer girilmediği için kullanıcıya hata mesajı verildi. Fiyat field'ına değer ataması yapılmadığından dolayı da, ekrana yazdırdığımızda default değeri olan 0'ı görmekteyiz. Eğer uygun bir değer atansaydı, ekranda atadığımız değeri görebilecektik.



4 yorum:

elif dedi ki...

çok yalın ve açık bir anlatım

Onur Salkaya dedi ki...

Teşekkür ederim, faydalı olmasına sevindim.

Adsız dedi ki...

Fiyat field'ını encapsulation felsefesine göre private yaparak 2 adet metot ekleyelim,BU DEDİĞİNİZ İLE
Field'ların erişim belirleyicileri public olduğundan dolayı Program sınıfında bu nesnelere erişebildiğimizi görüyoruz. BU DEDİĞİNİZ UYUŞMUYOR SANKİ AÇIKLAYABİLİR MİSİNİZ ACABA?

Onur Salkaya dedi ki...

Merhaba,

Dikkat ederseniz sınıf içerisinde 3 adet field var. Id ve Ad field'ları için herhangi bir işlem yapmadım. Encapsulation mantığını sadece 'Fiyat' adlı field üzerinden açıklamaya çalıştım. Fiyat adlı field'ın erişim belirleyicisi 'private' durumunda. Bu field'a değer atayan 'SetFiyat' ve bu field'daki değeri okumamızı sağlayan 'GetFiyat' metotları ise public durumda.

Yorum Gönder