Encapsulation (Kapsülleme)
NYP'nin 4 Temel İlkesi
Nesne yönelimli programlama 4 temel ilke üzerine kuruludur. Bir programlama dilinin nesne yönelimli programlamayı uyguladığını anlamak için bu 4 temel ilkeyi sağlıyor olması gereklidir. Bu temel ilkeler kodların değiştirilebilirlik, yeniden kullanım ve esneklik gibi kriterlerin sağlanmasına ön ayak olurlar.
Bu ilkeler ;
Encapsulation (Kapsülleme)
Inheritance (Kalıtım)
Polymorphism (Çok Biçimlilik)
Abstraction (Soyutlama)
NYP'nin 4 Temel İlkesi Encapsulation (Kapsülleme)
Sarmalama ilkesi, bir sınıfa ait değişkenlerin veya niteliklerin ancak o sınıfa ait metotlar tarafından değiştirilebilmesi ve okunabilmesi ilkesidir. Bu ilke sayesinde nesnelerde oluşacak anlamsızlıkların önüne geçilebilir.
Ayrıca değişkenlere sınıfların dışından erişim olmaması ve bir sınıf içindeki değişkenlerin nasıl ve ne kadar olacağının da başka kodlardan saklanmış olması anlamına gelir. Böylelikle biz değişkenlerimizi sarmalayarak istenmeyen durumlardan korunacak bir filtre haline dönüştürebiliriz. Bunu bir örnek ile anlamaya çalışalım.
Erişim Belirliyiciler
Bir sınıfa ait nitelik ve davranışlara ulaşabilmek için Erişim Belirleyiciler (Access Modifier) kullanılır. Erişim belirleyiciler (Access Modifier), değişken, metot ve sınıfların önüne yazılır ve yazıldıkları konuların erişebilecekleri alanları belirler.
Private : Yazıldığı ögenin sadece ait olduğu sınıftan doğrudan erişilebilir olduğunu ve o sınıfın dışındaki kod parçacıklarından doğrudan erişim izni olmadığını tanımlar.
Public : Yazıldığı ögenin sadece ait olduğu sınıf için değil, diğer sınıflar tarafından doğrudan erişilebilir olmasını sağlar. Sınıflara ait nesnelerin ve diğer nesneler tarafından kullanılması istenilen metotlar için kullanılır.
Protected : public veya private arasında kalan bir erişim düzenleyicidir. Protected ile tanımlanan öğeler, kendisi ile aynı pakette (package) bulunan sınıflar tarafından doğrudan erişilebilir.
Encapsuliaton Örneği
Kitap adında bir sınıfımız olsun ve bu sınıfımıza ait 3 adet değişkenimiz olsun bunlar ; kitapAdi, sayfaSayisi ve yazar. Bu değişkenlerin erişim belirleyicileri public olsun ve her sınıftan erişilsin.
public class Kitap { public int sayfaSayisi; public String kitapAdi, yazar; Kitap(String kitapAdi, String yazar, int sayfaSayisi) { this.kitapAdi = kitapAdi; this.sayfaSayisi = sayfaSayisi; this.yazar = yazar; } }
Kitap sınıfından book adında bir nesne oluşturalım ve bu nesnenin niteliklerini belirtelim. Peki biz bu sınıfa ait nitelikleri tanımlarken sayfa sayısını negatif bir değer girseydik ne olurdu ? Hiç bir kitabın sayfa sayısı negatif bir değer olmayacağı için, nesnemizde bir anlamsızlık olacaktır.
Kitap book = new Kitap("Harry Potter","JK Rowling", -10);
Biz bu sorunu constructor (kurucu) metoduna yazacağımız bir kontrol ile çözebiliriz. Ama sorunlarımız hala bitmedi, biz sınıfa ait niteliklere hala dışardan erişebiliyoruz çünkü erişim belirleyicisi "public". Bu sorunu çözmek için sınıfa ait nitelikleri dışaradan erişimi kapatmamız gerekir ve oluşturduğumuz niteliklerin erişim belirleyicisini (Access Modifiers) değiştirmemiz gerekir. Tüm public leri private olarak değiştiriyoruz.
public class Kitap { public int sayfaSayisi; public String kitapAdi, yazar; Kitap(String kitapAdi, int sayfaSayisi, String yazar) { this.kitapAdi = kitapAdi; this.yazar = yazar; if (sayfaSayisi < 1) { this.sayfaSayisi = 10; } else { this.sayfaSayisi = sayfaSayisi; } } }
public class Kitap { private int sayfaSayisi; private String kitapAdi, yazar; Kitap(String kitapAdi, int sayfaSayisi, String yazar) { this.kitapAdi = kitapAdi; this.yazar = yazar; if (sayfaSayisi < 1) { this.sayfaSayisi = 10; } else { this.sayfaSayisi = sayfaSayisi; } } }
Sınıfa ait değişkenlerimin izinlerini private yaparak bu sorunu çözdük ama, biz book nesnesine ait değişkenlere erişimi tamamen kısıtladık. Yani biz oluşturduğumuz nesneye ait sayfa sayısını herhangi bir yerden çağıramayız çünkü değişken private olarak tanımlandı. Ya da sayfa sayısı yanlış girilmiş bir nesneyi daha sonrasında düzenleyemeyiz. Bu sorunu çözmek için sınıfa ait değişkenlerimizi sarmalayarak, sınıf içerisinde ki metotlar yardımı ile değişkenlerimizi koruma altına alıyoruz ve kullanıma sunuyoruz. Bu metotlara Getter ve Setter metotları diyoruz.
Getter ve Setter Metotları
Sınıfımıza ait private değişkenler mevcut. Bu değişkenlere dışarıdan erişebilmek için her bir değişkenimiz için Getter metodu yazmalıyız. Nesneye ait bu metot çağrıldığında geriye bir değer döndürmeli ve bu değer bizim istediğimiz private değişken olmalı. sayfaSayisi değişkeni için getter metodu tanımlayalım,
public class Kitap { private int sayfaSayisi; private String kitapAdi, yazar; Kitap(String kitapAdi, int sayfaSayisi, String yazar) { this.kitapAdi = kitapAdi; this.yazar = yazar; if (sayfaSayisi < 1) { this.sayfaSayisi = 10; } else { this.sayfaSayisi = sayfaSayisi; } } public int getSayfaSayisi() { return this.sayfaSayisi; } }
Biz getter metodu ile private olan değişkenimize ulaştık.Peki bu değişkenin değerini değiştirmek istediğimizde ne yapmalıyız ? Bir sınıfa ait private bir değişkenin değerini değiştirmek için, setter metodu yazılmalıdır. sayfaSayisi değişkeni için setter metodu yazalım.
public class Kitap { private int sayfaSayisi; private String kitapAdi, yazar; Kitap(String kitapAdi, int sayfaSayisi, String yazar) { this.kitapAdi = kitapAdi; this.yazar = yazar; if (sayfaSayisi < 1) { this.sayfaSayisi = 10; } else { this.sayfaSayisi = sayfaSayisi; } } public int getSayfaSayisi() { return this.sayfaSayisi; } public void setSayfaSayisi(int sayfaSayisi) { if (sayfaSayisi < 1) { this.sayfaSayisi = 10; } else { this.sayfaSayisi = sayfaSayisi; } } }
Görüldüğü üzere setter metodu sadece değiştirme işlemi yapacağı için void olarak tanımlandı ve bir adet parametre aldı. Bu parametre bizim yeni değerimi taşıyor olup, sınıfa ait değişkene aktarılmıştır. Ama burada hala bir sorun söz konusudur, bizler setter metodunu kullanarak sayfa sayısını negatif girebiliriz. Bu sorunu aşmak için constructor (kurucu) metotta yaptığımız gibi bir if koşulu ile bu sorunu çözebiliriz.
Kaynak : Patika.dev, kodluyoruz.org, cihancalli.com.tr