Kapsulleme (Encapsulation)

Sınıfların doğrudan dışarıyı ilgilendirmeyen elemanları private bölüme konularak gizlenebilir. Böylece sınıfı kullanacak kişiler “çok fazla şey varmış” duygusuna kapılmazlar ve doğrudan kullanabilcekleri elemanlara yönelirler. Sınıfın iç işleyişe yönelik dışarıyı ilgilendirmeyen elemanlarının private bölümünde gizlenmesine kapsülleme denilmektedir. Bir sınıfın için 2 bakış açısı döz konusudur. Birincisi sınıfı tasarlayanların bakış açısıdır. Onlar sınıfın her bölümünü bilmek zorundadır. İkincisi sınıfı kullanan kişilerin bakış açısıdır. Onlar sınıfın yalnızca public bölümüne yoğunlaşabilir.

Bir sınıfın DoSomethingImportant isimli dışarıdan kullanılabilecek bir metodu olsun. Bu metodun Foo, Bar, Tar isimli işin bazı bölümlerini yapan metodları olduğunu düşünelim. DoSomethingImportant metodu public bölümde; Foo, Bar, Tar metodları private bölümde bulunmalıdır.

Kapsüllemeyle aslında günlük yaşantımızda da karşılaşmaktayız. Örneğin bir otomobilin gaz, fren, debriyaj public bölümledir. Asıl işlemleri yöneten üniteleri kaput içerisine gizlenmiştir.

Veri Elemanlarının Private Bölümde Gizlenmesi
Veri elemanları genellikle sınıfın iç işleyişine ilişkindir. Bu nedenle onların private bölümde gizlenmesi iyi bir tekniktir. Veri elemanlarının private bölümde gizlenmesine “Data hiding” denir ve NYPT’nin önemli prensiplerinden biridir. Sınıfın veri elemanlarına private olmadan dışarıdan doğrudan erişemeyiz. İşte onlara erişebilmek için public bölümde get ve set metodları yazılmak zorundadır.

Veri Elemanlarının Private Bölüme Yerleştirilmesinin Anlamı
Veri elemenlarının private bölümüne gizlenmesinin bazı önemli gerekçeleri vardır.
1. Deneyimler veri elemanlarını isimlerinin ve türlerinin zamanla sınıfı yazan kişiler tarafından değiştirilebildiğini göstermektedir. Eğer sınıfın veri elemanları public bölümüne yerleştirilirse sınıfı kullananlar onlara doğrudan erişebilir. Böylece sınıfın veri elemanları değiştirildiğinde onları kullanan kodlar geçersiz hale gelir. İşte veri elemanları private bölüme yerleştirilip, onlara get ve set metodlarıyla erişilirse elemanlarda değişiklik yapıldığında artık bu işlemden onları kullanan kodlar etkilenmez. Tabi değişiklik yapan kişinin tüm metodların parametrik yapılarını değiştirmeden onların içini yeniden yazması gerekir. Bir sınıfı kullanan kodlar, sınıfın kendi kodlarından daha fazladır. Bu durumda kullanan kodları değiştirmek daha uygundur.
2. Bir sınıfın birbirleriyle ilişkili veri elemanları bulunuyor olabilir. Örneğin Circle isimli bir sınıfta dairenin alanı başka metodlarda sık kullanıldığı için area isimli bir veri elemanında saklanıor olsun. Eğer biz veri elemanlarını public bölümünde tutarsak dışarıdan sınıfı kullanan kişinin yarıçap bilgisini değiştirdiğinde bu area değişkenindeki değeri de değiştirmesi gerekir.
Halbuki veri elemanlarını private bölüme yerleştirirsek SetRadius gibi bir metodla area değişkenini biz güncelleyebiliriz.

3. Bazen bir veri elemanı set ederken ya da get ederken başka bir takım işlemlerin yapılması gerekebilir. Örneğin SerialPort isimli bir sınıf sözkonusu olsun. Bu sınıfın seri port hızını tutan bir veri elemanı bulunabilir. İşte bu seri port hızı elektriksel olarak da set etmek için başka kodlarda gerekmektedir. Bu işlemler SetBaudRate isimli bir sınıf içerisinde gizlice yapılabilir.

Get ve set metodları birer satırlık metodlar olmak zorunda değildir. Aslında çok daha karışık işlemler yapıyor olabilirlerdi.

Bazı özel durumlarda sınıfın veri elemanlarının public bölüme yerleştirilimesi tercih edilebilir. Örneğin sınıfın çok yerde kullanılmadığı durumlarda eğer programcı veri elemenlarının değişmeyeceğinden eminse, elemanları sınıfın public bölümüne yerleştirebilir. Elemanlara get ve set yoluyla erişmek göreli bir zaman kaybına yol açabilir. İşte bu tür durumlarda elemanlar public bölümüne yerleştirilebilir. Fakat bunlar çok seyrek karşılaşılabilcek özel durumlardır.

Leave a Reply

Site Footer