"Merhaba Amigo! Bugünün dersini kapsüllemeye adamak istiyorum . Bunun ne olduğu hakkında zaten genel bir fikriniz var."

Kapsülleme - 1

Peki kapsüllemenin avantajları nelerdir? Çok var, ama bence en önemli olan dört tanesine işaret edeceğim:

1) Geçerli dahili durum.

Programlar genellikle aynı nesneyle etkileşime giren birkaç sınıfa sahiptir. Nesnenin dahili verileriyle aynı anda etkileşim kurarak, nesnenin veri bütünlüğünü ihlal ederek nesnenin düzgün çalışmamasına neden olabilirler.

Bu nedenle nesne, dahili verilerindeki herhangi bir değişikliği izlemeli veya daha iyisi - bu değişiklikleri yapan kişi olmalıdır.

Bazı sınıf değişkenlerinin diğer sınıflar tarafından değiştirilmesini istemiyorsak, o zaman onu private olarak bildiririz , bu da ona yalnızca o sınıfın yöntemlerinin erişebileceği anlamına gelir. Değişkenlerin diğer sınıflar için salt okunur olmasını istiyorsak bu değişkenlere public getter ekleriz.

Örneğin, koleksiyonumuzda kaç tane öğe olduğunu herkesin bilmesini isteyebiliriz ama hiç kimse bizim iznimiz olmadan değiştiremez. Bu durumda, bir private int count değişkeni ve bir public getCount() yöntemi bildiririz .

Uygun kapsülleme, diğer sınıfların bizim sınıfımızın dahili verilerine doğrudan erişememesini ve sonuç olarak, biz onların eylemlerini kontrol edemeden onu değiştirememesini garanti eder. Değiştirilecek değişkenleri içeren sınıftaki yöntemleri çağırmalıdırlar.

Diğer programcıların sınıflarınızı her zaman kendileri için en uygun şekilde kullanacağını varsaymak en iyisidir, sizin (veya sınıfınız) için en güvenli olacak şekilde değil. Bu bir hata kaynağı ve onları önlemenin bir yoludur.

2) Parametre kontrolü.

Bazen sınıfınızın yöntemlerine iletilen parametreleri kontrol etmeniz gerekir. Örneğin, bir "kişi"yi temsil eden bir sınıfımız olduğunu ve onun doğum tarihini belirtebileceğinizi varsayalım. Aktarılan herhangi bir verinin programın mantığına ve sınıfın mantığına karşılık geldiğini doğrulamalıyız. Örneğin 13. ay yok, 30 Şubat yok vs.

"Birisi neden 30 Şubat'ı doğum tarihi olarak belirtsin ki?"

"Öncelikle, bir veri girişi hatasının sonucu olabilir."

İkincisi, bir program saat gibi çalışmadan önce birçok hataya sahip olabilir. Örneğin, böyle bir şey olabilir.

Bir programcı, yarından sonraki gün kimin doğum günü olduğunu belirleyen bir kod yazar. Diyelim ki bugün 3 Mart. Program güncel tarihe 2 ekliyor ve 5 Mart'ta doğan herkesi buluyor. Buraya kadar her şey yolunda.

Ancak 30 Mart geldiğinde, 32 Mart olmadığı için program kimseyi bulamıyor. Yöntemler parametre denetimi yaptığında programlar çok daha az hatalı oluyor."

"ArrayList'i incelediğimizde onun koduna baktığımı hatırlıyorum ve get ve set yöntemlerinde, index parametresinin sıfırdan büyük veya ona eşit ve dizinin uzunluğundan küçük olmasını sağlayan kontroller vardı. Kod bir hata verirdi. dizinin dizine karşılık gelen bir öğesi yoksa istisna.

"Evet, bu klasik giriş kontrolüdür. "

3) Sınıfların içindeki kodu değiştirirken daha az hata.

Büyük bir projenin parçası olarak gerçekten faydalı bir sınıf yazdığımızı varsayalım. Herkes o kadar beğendi ki diğer programcılar kendi kodlarında yüzlerce yerde kullanmaya başladılar.

Ders o kadar faydalı oldu ki, onu geliştirmeye karar verdiniz. Ancak sınıftaki herhangi bir yöntemden kurtulursanız, diğer düzinelerce programcının kodu artık derlenmeyecektir. Kodlarını hızla yeniden yazmaları gerekecekti. Ve ne kadar çok yeniden yazma olursa, hatalar için o kadar çok fırsat olur. Yapıyı düzenli olarak bozarsanız, sizden nefret edilir.

Ancak özel olarak işaretlenen yöntemleri değiştirirsek, bu yöntemlerin herhangi bir yerde başka birinin kodu tarafından çağrılmadığını biliriz. Bunları yeniden yazabilir ve parametrelerin sayısını ve türünü değiştirebiliriz ve bağımlı kod yine de çalışır. Ya da en azından hala derlenecek.

4) Diğer nesnelerin bizim nesnemizle nasıl etkileşime gireceğini tanımlarız.

Nesnemiz üzerinde hangi eylemlerin alınabileceğini kısıtlayabiliriz. Örneğin, projede aynı anda birkaç yerde oluşturulmuş olsa bile, bir sınıfın yalnızca bir örneğinin oluşturulmasını isteyebiliriz. Ve bunu kapsülleme kullanarak başarabiliriz.

Kapsülleme - 2

Kapsülleme, ek avantajlara dönüşebilecek ek kısıtlamalar uygulamamıza olanak tanır . Örneğin, String sınıfı değişmez bir nesne olarak uygulanır . String sınıfının bir örneği, oluşturulması ve yok edilmesi arasında değiştirilemez. String sınıfının tüm metotları (remove, substring, ...) yeni bir string döndürür ve hiçbir şekilde çağrıldıkları nesneyi değiştirmezler.

"Aman Tanrım. Demek böyle."

"Kapsülleme merak uyandırıcı."

"Kabul ediyorum."