Nesneye Dayalı Programlama -5- Erişim Denetleyiciler


Merhabalar Arkadaşlar,

Bu yazımızda bir önceki yazımızda oluşturduğumuz proje ile devam edeceğiz.
SepeteAt projesinde Urun nesnesinden ürünler oluşturup onlara nasıl erişebileceğimizden bahsedeceğiz.

Öncelikle Urun sınıfımıza urunID,urunAd,fiyat,indirim ve stok elemanlarını dahil edelim.


Dahil ettiğimiz elemanların bilgilerini eğer sınıf içerisinde verirsek Urun nesnesinden ziyade her seferinde belli bir Urun tanımı yapılmış olur. 
Halbuki istediğimiz Urun nesnesi her oluşumunda kendisini tarif edebilen değerler alabilmesi olmalıdır. Dolayısıyla Urun sınıfının bir örneği (instance) oluştuktan sonra verilmelidir.

Bir sınıfın bir örneğini oluşturmaya "Nesne" oluşturma denir ve new anahtar sözcüğü ile olur ve aşağıdaki şekilde tanımlanır.

SinifIsmi   degiskenIsmi   =   new  SinifIsmi();


Artık şablonumuz içerisinde oluşturduğumuz alanlara değer verebiliriz. Bunun için Ayakkabi isimli nesne isminden sonra NOKTA(.) operatörü kullanılır.
Ancak resimden de görüleceği üzere Urun sınıfı içerisinde oluşturduğumuz alanları (urunID,urunAd...) kullanamıyoruz. Halbuki şablonumuzda oluşturabildiğimiz alanların değerlerine aşağıdaki gibi ulaşabilmeliydik.


Bunun nedeni NDP özellikleri olan Soyutlama (abstracttion) ve sarmalamadır (encapsulation, bilgi saklama).

Soyutlama

Nesne tanımlanırken verinin kullanılması veya veriye erişilmesi için gerekli detayların azaltılması işlemidir. Soyutlama kabaca iki şekilde yapılır;
  1. Veri(data) soyutlaması
  2. Kontrol (control) soyutlaması
Veri soyutlaması, veri yapıları üzerinde yapılan soyutlamadır.
Kontrol soyutlaması ise yapısal programlama ile gelen altprogram(subprogram), işlev(function) gibi kavramlar üzerinde soyutlamadır.

Örnek olarak bir "kişi" nesnesinde, kişinin yaşını tutan bir tam sayı değişkeni olan "yas" değişkenini ele alalım. Bu "yas" değişkenine, program çalıştırma anında, "-10" gibi bir değer atanmasını kimse engelleyemez. İşte burada nesneye dayalı programlamanın getirdiği görünürlük(visibility), ve özellik(property) tanımlama gibi yetenekler kullanarak "yas" değerine gerçek bir değerin girilmesi garanti edilebilir. İşte buna Veri Soyutlaması adı verilir.
Başka bir örnekte Öğrencinin Notu 0 ile 100 arasında olabileceği.

Benzer şekilde soyutlama işleminin verileri taşıyan değişkenlerin değil de yöntem(method) veya işlevlerin(function) üzerinde yapılası işlemine Kontrol Soyutlaması adı verilir. Yani yöntem(method) ile yapılan işlemlerin başka bir nesne tarafından müdahale edilemeyecek hale sokulması işlemidir.
 


Sarmalama (Encapsulation)

Bir nesne üzerinde hem veri soyutlama hem de kontrol soyutlaması yapılıyor ise buna sarmalama(encapsulation) adı verilir.

Kodu, veriyi veya nesneyi dış müdahalelerden koruyabilmek, oluşturulma amacı dahilinde kullanabilmek ve kullanılmayacağı yerlerde gösterimini engellemek için sarmalamaya ihtiyaç duyulmuştur.

Bir sınıf içinde bulunan üyelerin, o sınıfı kullananlar tarafından erişilip, erişilemeyeceğini belirlemeye yarar. Örnek vermek gerekirse arabamızı çalıştırdığımızı düşünelim, biz sadece anahtarı yerine sokup çeviriyoruz değil mi, o anda arka planda olan hiç bir işleme karışmıyor ve müdahale edemiyoruz, yani ben anahtarı çevirince o motora giden enerji açıyor, benzini pompalıyor ve buna benzer bir dizi işlemi sırasıyla yapıyor ama biz bununla ilgilenmiyoruz ve buna erişemiyoruz, işte bu mekanizma bizim erişememiz için kapsüllenmiştir. Aksi takdirde kaputu açıp enerjiyi biz vermeye kalksaydık istenmeyen durumlarla karşılaşabilirdik. Bu çok uç bir örnek oldu farkındayım o yüzden daha basit bir örnek vermek gerekirse hepimiz cep telefonu kullanıyoruz, mesaj yazarken birini ararken tuşlara basıyoruz ama telefonun içindeki devrelere erişmemiz engellenmiştir. Bu işlemi yapabilmemiz için tuş takımı geliştirilmiştir. Yani bu devreler bir nevi kapsüllenmiştir

Sarmalama erişim denetleyiciler ile sağlanmaktadır.


Erişim Denetleyiciler (Access Modifiers)

Diğer sınıfların veya sınıf gruplarının, sınıf yada sınıf üyelerine erişimi düzenleyen/kısıtlayan anahtar kelimelerdir.
Nesneye dayalı programlamanın önemli özelliklerinden bir tanesi olan encapsulation, sınıf değişkenlerine erişimi kısıtlayarak sınıfı oluşturan kişinin sınıfını korumasını sağlamaktır.
Aşağıdaki anahtar sözcükler, metot veya değişkenlere erişimi kısıtlamak veya izin vermek için kullanılırlar.

Public
Bu şekilde tanımlanmış bir metot veya değişkene herhangi bir yerden ulaşmak mümkündür.

Private
Bu şekilde tanımlanmış bir metot veya değişkene sadece sınıf içerisinden ulaşmak mümkündür.

Protected 
Bu şekilde tanımlanmış bir metot veya değişkene tanımlandıkları sınıftan veya bu sınıftan türetilmiş sınıflardan ulaşılabilir.

C#'a ait anahtar kelimeler

Internal
Bu şekilde tanımlanmış bir metot veya değişkene tanımlandıkları sınıftan veya tanımlandıkları sınıfla aynı assembly'de olan sınıflardan ulaşmak mümkündür.

Protected Internal
Bu şekilde tanımlanmış bir metot veya değişkene hem protected hem de internal özelliğindedir.


Bu noktada unutulmaması gereken 5 husus vardır:
  1. İşletim sistemleri bir tipin public, protected veya private olmasıyla ilgilenmez. Dolayısıyla hafıza takibi ile üyelerin değerlerine ulaşılabilmektedir.
  2. Her programcı kendi yazdığı sınıfın güvenliğinden ve güvenirliğinden sorumludur. Eğer herhangi bir sınıf üyesinin private ile tanımlanması yeterli olduğu halde public ile dış dünyaya açılırsa programcılar bu üyeyi istedikleri gibi kullanabilirler. Bu durumNPD'nin soyutlama prensibine aykırıdır.
  3. Her dilin kabul ettiği default değerleri farklıdır. C# private, java public olarak kabul etmektedir. Ancak programın okunabilirliği açısından erişim denetleyicilerin default değeri her ne olursa olsun belirtilmesi tavsiye edilmektedir.
  4. Sınıf üyelerinden alanların public ile sınıf dışına açılması önerilmemektedir. (Sınıf üyelerinden özellikler konusunda açıklanacaktır.)
  5. Bir sınıfın kendisinin private olarak tanımlanmasının hiçbir anlamı yoktur. Dolayısıyla derleyiciler hata vermektedir.
Erişim denetleyiciler ile tekrar düzenlersek;


Örneğimize devam edecek olursak,



Sonuç:



İyi çalışmalar dilerim.