Encapsulation — Kapsülleme

yagmurcurku
6 min readOct 26, 2023

--

Object Oriented Programming (OOP) yazısında bahsettiğimiz gibi OOP 4 temel özellik üzerine kurulmuştur. Bu yazımızda bu 4 temel taştan biri olan Encapsulation yani Kapsülleme mekanizması hakkında konuşacağız. Keyifli okumalar..

Encapsulation dendiğinde aslında aklınıza gelmesi gereken şey, bu yapının bir güvenlik duvarı oluşturmak amacıyla kullanıldığıdır. Oluşturduğumuz sınıflar içerisindeki değişkenleri ve metotları her zaman koruma altında tutmamız gerekmektedir. Çünkü başka bir yerden gelip de değişkenlerimiz veya metotlarımız üzerinde değişiklik yapılmasını istemeyiz değil mi ? Yani özetle, bir sınıf içerisindeki metot ve değişkenlere dışarıdan erişmenin sa-kıncalı olduğu durumlarda kapsülleme mekanizması kullanılarak bahset-tiğimiz güvenlik sağlanır.

Şimdi gelin, Encapsulation nasıl uygulanır bunu öğrenelim.

Bir tane Product sınıfımız olduğunu düşünelim. Bu sınıfın “id”, “name” ve “price” adında 3 adet değişkeni ve “add” adında 1 adet metodu bulunmakta-dır.

Product.java

Main sınıfında product nesnesi oluşturarak bu nesnenin tüm özelliklerine ve metodlarına görüldüğü gibi rahatlıkla ulaşabilmekteyiz.

Main.java

Main metodu çalıştırdığımızda da çıktımız şu şekilde olacaktır:

Console

Şimdi öncelikle şunu anlamalıyız ki bir class değişkenlerini asla dışarıya açık hale getirmemelidir. Metotlarının erişim durumunu da projenin o anki çalışma mekanizmasına göre belirlemelidir. Bunları sağlamak için de erişim belirteçleri (Access Modifiers) yani diğer bir adıyla erişim belirleyi-ciler kullanılmaktadır.

Yukarıda verilen tabloda gördüğünüz üzere 3 adet erişim belirleyici bulun-maktadır. Kısaca özetlersek bir değişkeniniz veya metodunuz, public olursa her yerden erişim sağlanır; private olursa sadece bulunduğu sınıf içerisin-den erişim sağlanır; protected olursa da aynı paketteki sınıflardan ve miras alınan tüm alt sınıflardan erişim sağlanır. Diğer bir seçenek de default ol-ma durumudur. Bunu yukarıdaki örnekte verdik. Default durumdaki bir değişken ve metoda sadece aynı paket altındaki sınıflardan erişim sağlanır.

Tüm bu anlattıklarımı daha iyi anlayabilmeniz için gelin değişkenlerimizi “private”, metodumuzu “protected” yapalım ve durumlar nasıl değişiyor inceleyelim.

Product.java
Main.java

Görüldüğü üzere Product sınıfında private olarak işaretlediğimiz değişken-lere main üzerinden erişmeye çalıştığımızda bize kızıyor yani hata veriyor. Metoda dikkat ettiyseniz onu da protected olarak işaretledik ama main’de bir hata ile karşılaşmadık çünkü protected olarak işaretlenen değişken ve metotlara aynı paket altındaki tüm sınıflardan erişim sağlanabilmektedir. Product sınıfımız ile Main sınıfımız da aynı paket altında olduğu için “add” metoduna kolaylıkla erişim sağlayabildik. Peki“Bu metodu neden protected yaptın ? Hiçbir şey değişmedi.” derseniz sadece örnek olarak görmeniz için bu şekilde yaptım. Normalde kapsülleme yapılacağı zaman metotlarla çok ilgilenmeyiz sadece değişkenleri private yaparak korumaya alırız.

Eğer “Eee bu değişkenleri private yaptık iyi hoş ama bundan sonra bunlara ihtiyacımız olduğunda nasıl erişim sağlayacağız ?” diye düşünüyorsanız da, işte tam da bu noktada “GETTER-SETTER” metotlar ile tanışacağız. Sınıf içerisindeki değişkenler private yapıldıktan sonra bunlara erişmek için getter — setter metotlar yazılır ve doğrudan erişim yerine dolaylı olarak bu metotlar üzerinden erişim sağlanır.

“Getter = Okuma”, “Setter = Yazma” gibi düşünebilirsiniz.

Getter metotlar : Getter metotlar geri dönüş tipi olan metotlardır ve geriye döndürdükleri değerler, okumak yani çağırılmak istenen değişkenlerdir. Bu metotların isimlendirmesi get ile başlar daha sonra ise değişken ismi ile devam eder. İsimlendirme bu şekilde yapılmasa da metot çalışacaktır ama bu şekilde yazıldığında kodun okunabilirliği artacaktır.

Setter metotlar : Bir sınıfa ait bir değişkenin değeri değiştirilmek istenirse setter metotlar kullanılmalıdır. Böylece bu metot içerisinde belirli kurallar belirleyebiliriz ve değişken üzerinde değişim yapacak birisi de bu kurallara uygun olarak değişiklik yapmak mecburiyetinde kalacaktır. Bu metotların isimlendirmesi de getter metotlar gibidir. Tek farkı bu metotların “set” ile başlamasıdır. Setter metotların genel özellikleri, geriye bir değer döndür-meyen void metotlar olmalarıdır.

Şimdi aynı örnek üzerinde private yaptığımız değişkenler için getter ve setter metotları oluşturalım ve bu metotların ne işe yaradığını konuşalım.

Product.java

Verilen ekran görüntüsünde gördüğümüz üzere Product sınıfındaki değiş-kenler private durumda ve her bir değişken için birer tane getter ve setter metotları oluşturduk.

Main.java

Artık main üzerinde product nesnesine id, name ve price değişkenlerinin değerlerini atamak istediğimizde setter metotlarını kullanmaktayız. Tam tersi şekilde bu değişkenlerin değerlerini okumak istediğimizde de getter metotlarını kullanmaktayız. Örnekte görüldüğü üzere ürün fiyatını konsola yazdırmak istediğimiz için “product.getPrice()” ifadesini kullandık. Böylece product nesnesinin price değişkeninin değerini almış olduk. Bu durumda main metodunu çalıştırdığımızda console görüntüsü şu şekilde olacaktır :

Console

Şimdi çok önemli bir noktaya değinmek istiyorum. Biz encapsulation me-kanizmasını ne için kullandığımızı söylemiştik ? Güvenlik için. Şimdi bu güvenlik kavramına bazı örnekler verelim ve kodumuzu geliştirelim.

Örneğin “id” özel bir değişkendir ve dışarıdan erişime kapalı olması gayet olasıdır. Bu yüzden id’ye ulaşılmasını istemiyoruz. Bu durumda naparız ? id’nin getter metodunu kaldırsak işe yarar mı ?

Product.java
Main.java

Görüldüğü gibi “getId()” metodunu kaldırdık. Daha sonra main metoduna gittiğimizde ürünün id’sini ekrana yazdırmak için bu metodu çağırmaya çalıştık fakat erişim sağlayamadık. Bu sayede artık kimse “id” değişkenini çağıramayacaktır.

Diğer bir örneğimiz ise “price” değişkenine bir kural tanımlamak olsun. Örneğin fiyatı 10'dan küçük olan ürünler sisteme tanımlanamasın ve hata fırlatılsın. Bunu nasıl yaparız ? price’ın setter metodu içerisinde bu kuralın algoritmasını yazsak sorunumuza çözüm olur mu ?

Product.java

Görüldüğü gibi “setPrice()” metodu içerisinde bir “if()” koşul yapısı oluştur-duk. Bu koşula göre artık bir product nesnesine setPrice işlemi yapılırken price’ın değeri 10'dan küçük olursa sistem hata fırlatacaktır, fakat 10'dan küçük değilse yani bu if koşulunun scope’una girmezse “this.price = price” ataması ile normal set etme işlemi yapılacaktır.

Main.java

Biz main metodumuzda örnek olarak product nesnesine 9 değerini set etmek istedik. Bu durumda console çıktımız şu şekilde olacaktır :

Console

Son olarak getter ve setter metotlarının nasıl oluşturulabileceğinden bah-setmek istiyorum.

Bu metotları kendiniz de yazabilirsiniz ya da IDE’nizin size sunduğu kısa-yollardan da faydalanabilirsiniz. Ben Eclipse IDE kullandığım için eclipse üzerinden örnek verecek olursam, şu adımları izleyebilirsiniz :

Boş bir alanda sağ tık yapın → “Source” → “Generate Getters and Setters”

Daha sonra açılan pencerede getter ve setter metotlarını oluşturmak istedi-ğiniz değişkenleri seçin veya “Select All” diyerek tümünü seçin, sonrasında “Generate” düğmesine basın. Artık getter ve setter metotlarınız hazır.. :)

Okuduğunuz için teşekkür ederim, umarım akıcı bir yazı olmuştur. Kod örnekleri ile yazıyı biraz uzatmış oldum ama bu şekilde daha açıklayıcı olacağını düşündüm. Hepinize iyi çalışmalar diliyorum.. ✨

--

--