Bu bölümde, nesne yönelimli programlamanın temel kavramlarından biri olan encapsulation konusunu detaylı bir şekilde ele alacağız. Bu konuya, encapsulation kelimesinin etimolojisiyle başlayarak yaklaşacağız. “Nedir?” sorusunun yerine “neden ve nasıl?” sorularını sormak, kalıcı öğrenmenin sağlanmasında oldukça önemlidir. Beynimiz, yeni öğreneceği bilgileri önceden bildikleriyle bağlantı kurarak daha iyi anlamlandırır. Bizde önceden bildiklerimizle bağlantı kurarak bu konuyu detaylandıracağız.
Encapsulation Sözcüğü
Encapsulation sözcüğünü incelediğimizde, temel olarak üç bölümden oluştuğunu söyleyebiliriz: en-capsule-ation. Burada aklımıza şu soru gelebilir: “Neden ‘capsulation’ değil de ‘encapsulation’ denmiştir?” Bu durumun birkaç nedeni vardır ve aslında encapsulation kavramı da bu nedenler üzerine kuruludur. Şimdi “encapsulation” kelimesini daha yakından inceleyelim.
Capsule, Türkçede “kapsül” anlamına gelen bir isim yapısıdır.
Capsulate [capsule+ate], Türkçe’de “kapsüllemek” eylemini ifade eden bir fiildir.
Capsulation [capsule+ation], Türkçe’de “kapsülleme” eyleminin isim halidir..
Şimdi başa gelen “-en” ekinden bahsedelim. Bu ek, (İngilizce’de) eylemin veya durumun en üst seviyede gerçekleştiğini vurgulamak için kullanılan bir ektir.
Bu durumda, özelden genele göre erişim belirleyiciler sıralandığında Private > Default > Protected > Public sıralamasını görürüz. Encapsulation işlemini gerçekleştirirken genellikle “Private” erişim belirleyicisini kullanırız ve bu erişim belirleyicisi en üst seviyede bir gizlilik sağlar. Başına “-en” ekinin getirilmesinin uygun görülmesinin sebeplerinden biri budur.
İngilizce’de, bir ismin başına “-en” eki gelmesi, belirli bir iş için gerekli anlamı sağlatmak ve özel bir anlam kazandırmak için de kullanılır. Bu durumda, “encapsulation” kelimesi, herhangi bir nesneyi kapsül etrafına almak, onunla çevrelemek anlamına gelen daha genel bir kelime olan “capsulation”dan daha spesifik bir anlam taşır. Bilgisayar bilimlerinde, verileri en üst düzeyde gizlilik sağlayarak ve onları koruyarak bir sınıf altında toplama işlemine “encapsulation” denir. Buradaki “en üst düzeyde gizlilik sağlayarak” ifadesindeki atıfta bulunulan nokta, “private” erişim belirleyicisidir. “Onları koruyarak” ifadesinde ise data metotlarına değinilmiştir (getters/setters).
İngilizcede bazı sözcüklerin başına getirilen bu ek, anlamı özelleştirerek daha spesifik bir anlam kazandırmak için kullanılır, ve aslında baktığımızda kazandırılmak istenen bu anlam konunun en temel yapı taşlarıdır. Encapsulation kelimesi ile ilgili bu temel bilgileri öğrendikten sonra bu kavramın daha teknik bir tanımını yaparak konumuzu detaylandıralım.
Encapsulation Nedir?
Encapsulation, nesne yönelimli programlama (OOP) paradigmalarından biridir ve bir sınıfın verilerini (data fields, data members, states, fields) ve bu veriler üzerinde işlem yapan fonksiyonları (data methods) bir arada tutarak, bu sınıfın içine gizler. Bu sayede sınıf dışındaki kodun bu verilere doğrudan erişmesi engellenir ve sadece sınıf içindeki belirli fonksiyonlar vasıtasıyla (getters/setters) erişim sağlanır. Encapsulation sayesinde, verilerin ve fonksiyonların doğrudan erişiminin engellenmesiyle birlikte, sınıfın işlevselliği kontrol altında tutulabilir. Ayrıca, sınıfın içindeki değişikliklerin sınıfın kullanıldığı diğer kodlara etki etmesi de minimize edilir.
Encapsulatin’a Bize Ne Sağlar ?
- Daha iyi kontrol
Encapsulation kullanarak verilere doğrudan erişemeyiz. Tanımda bahsedildiği üzere, sadece bu veriler üzerinde işlem yapan fonksiyonlar ile bu verilere erişebiliriz ve bu fonksiyonları istediğimiz gibi özelleştirip, bu fonksiyonları kullanacak olan programcılara çeşitli sınırlamaları gereksinimlerimize göre getirebiliriz. Örneğin, aşağıdaki kod bloğu RSA kriptosistemini programlarken yazdığım bir bloktur. Burada BigInteger veri tipindeki sayının asal olarak girilmesi gerekmektedir. isPrime() fonksiyonu kendisine parametre olarak gelen sayının asal olup olmadığını kontrol eder. Asal ise true değilse false değerini döndürür. Burada görüldüğü üzere, bir setter metodu ile datayı değiştirecek kişiye sınırlama getirilmiştir. Dolayısıyla daha iyi bir kontrol sağlanmıştır.
public void setP(BigInteger p) {
if(isPrime(p) ){
this.p = p;
}else{
System.err.println("Please enter a prime number");
}
}
- Güvenlik
Encapsulation, data hiding işlemiyle birlikte kullanıldığında bize güvenlik avantajı sağlar. private erişim belirleyicisi, ilgili sınıf dışındaki kodların veriye erişmesini engeller. Ayrıca, data metotları ile veriye nasıl ve nereden erişilebileceği kontrol altında tutulur, bu sayede programcılar veriye yanlışlıkla müdahale edemezler. Getter ve setter fonksiyonları için hazırlanan dökümantasyonlar, yetkili programcıların veri manipülasyonu hakkında bilgi sahibi olmasını sağlar. Böylece, encapsulation ile programımızın güvenliği arttırılmış olur.
Örneğin aşağıdaki görselde p’nin asal olması gerektiği ile ilgili bir bilgi bu fonksiyonu kullanacak programcı için yazılmıştır.

Aşağıdaki görsel ise setP() fonksiyonunu kullanacak olan programcının karşısına çıkmıştır.

- Esneklik
encapsulation işlemi ile sınıflarımızı daha esnek ve genişletilebilir hale getirebiliriz. Bu sayede, yazılımımızın ilerleyen zamanlarda ihtiyaç duyacağı yeni özellikleri kolaylıkla ekleyebiliriz. Örneğin, bir sınıfın başlangıçta sadece birkaç state’i olsa bile, ilerleyen zamanlarda bu state’lerin sayısı artabilir. Encapsulation sayesinde bu yeni state’lerin sınıfa eklenmesi kolaylaşır ve mevcut kod üzerinde minimal etki bırakır.
Aynı zamanda, encapsulation işlemi sayesinde bir sınıftaki değişikliklerin diğer sınıfları etkilemesi de en aza indirgenir. Veri setlerimizi koruyarak, sınıfın iç yapısındaki değişikliklerin dışarıdaki kodlara minimal bir etkisi olur ve bu da kodun daha sürdürülebilir hale gelmesine yardımcı olur.
- Zaman
Günümüzde, encapsulation işlemini kolaylaştıran birçok geliştirme aracı mevcuttur. Örneğin, birçok IDE’de otomatik getter/setter ve constructor tanımlamaları gibi kısayollar bulunmaktadır. Bu kısayollar, geliştiricilerin veri üyelerine hızlı bir şekilde erişmelerine ve düzenlemelerine olanak tanır.Bu kısayollar sayesinde, yazılım geliştirme sürecinde zaman kazanılabilir ve verimlilik artırılabilir.
Ancak, her zaman otomatik kısayolların kullanılması doğru olmayabilir. Çünkü otomatik olarak oluşturulan kod, belirli gereksinimleri karşılamayabilir veya bir hata içerebilir. Bu nedenle, geliştiricilerin encapsulation işlemini doğru bir şekilde anlamaları ve uygulamaları önemlidir.
İşin teorik kısmını hallettik, sözü bırak kodu göster dediğinizi duyar gibiyim 🙂 öyleyse hiç beklemeden, küçük bir proje yapalım…