MERHABA! Bugünün dersini kapsüllemeye ayıralım ve hemen örneklerle başlayalım :) Burada sıradan bir soda makinenizKapsülleme ilkeleri - 1 var . Size bir sorum var: nasıl çalışıyor? Ayrıntılı bir cevap vermeye çalışın: fincan nereden geliyor, iç sıcaklık nasıl korunuyor, buz nerede saklanıyor, makine hangi şurubu ekleyeceğini nasıl biliyor, vs. Muhtemelen bu sorulara cevabınız yok. Yeterince adil, çünkü herkes bu tür makineleri kullanmıyor. Günümüzde pek popüler değiller. Başka bir örnek vermeye çalışalım. Her gün kesinlikle birçok kez kullandığınız bir şey. İşte bir fikir! Bize Google arama motorunun nasıl olduğunu anlatınKapsülleme ilkeleri - 2İşler. Girdiğiniz kelimelerle ilgili bilgileri tam olarak nasıl arar? Neden bazı sonuçlar üst sıralarda yer alırken diğerleri sıralamada yer almıyor? Google'ı her gün kullanıyor olmanıza rağmen muhtemelen bilmiyorsunuzdur. Ama önemli değil. Bunu bilmenize gerek yok. Nasıl çalıştığını düşünmeden bir arama motoruna sorgular girebilirsiniz. Nasıl çalıştığını bilmeden bir makineden soda satın alabilirsiniz. İçten yanmalı motorun nasıl çalıştığını anlamadan ve fizikten hiç anlamadan ilkokul seviyesinde bile araba kullanabilirsiniz. Tüm bunlar, nesne yönelimli programlamanın ana ilkelerinden biri sayesinde mümkündür: kapsülleme. Nesne yönelimli programlama (OOP) ile ilgili çeşitli makaleleri okurken, programlamanın iki ortak kavram içerdiği gerçeğiyle karşılaşmış olmalısınız: kapsülleme ve gizleme . Ve yazarlar "kapsülleme" kelimesini bir şeyi ve sonra başka bir şeyi ifade etmek için kullanırlar. Tam bir anlayış kazanmanız için her iki terimi de keşfedeceğiz. Programlamada, kapsüllemenin orijinal anlamı , verilerin, bu veriler üzerinde çalışan yöntemlerle birlikte tek bir birimde (yani bir "kapsül") gruplandırılmasıdır . Java'da sınıf , kapsülleme birimidir. Bir sınıf, hem verileri (alanları) hem de bu verilerle çalışmak için yöntemleri içerir.Kapsülleme ilkeleri - 3Bu size açıkça doğru bir yaklaşım gibi görünebilir, ancak diğer programlama paradigmalarında her şey farklı düzenlenmiştir. Örneğin, işlevsel programlamada veriler, üzerindeki işlemlerden kesin olarak ayrılır. OOP'de programlar, hem verilerden hem de bu verilerle çalışmak için işlevlerden oluşan kapsüllerden veya sınıflardan oluşur. Şimdi saklanmaktan bahsedelim . Nasıl oluyor da nasıl organize olduklarını veya nasıl çalıştıklarını anlamadan her türlü karmaşık cihazı kullanıyoruz? Çok basit: yaratıcıları bize basit ve kullanışlı bir arayüz sağladı. Bir soda makinesinde arayüz, paneldeki düğmelerdir. Bir tuşa basarak fincan boyutunu seçersiniz. Bir başkasına basarak lezzeti seçersiniz. Üçüncüsü buz eklemekten sorumludur. Ve tüm yapman gereken bu. Makinenin iç organizasyonu önemli değil. Önemli olan, kullanıcının gazoz almak için üç düğmeye basmasını gerektirecek şekilde tasarlanmış olmasıdır . Aynı şey arabalar için de geçerli. İçeride ne olduğu önemli değil. Önemli olan sağ pedala bastığınızda arabanın ilerlemesi, sol pedala bastığınızda ise yavaşlamasıdır.. İşte saklanmak böyle bir şey. Bir programın tüm "iç kısımları" kullanıcıdan gizlenir. Kullanıcı için bu gereksiz, gereksiz bilgiler. Kullanıcı nihai sonuca ihtiyaç duyar, dahili sürece değil. AutoÖrnek olarak sınıfa bakalım :

public class Auto {

   public void go() {

       /* Some complicated things happen inside the car.
       As a result, it moves forward */
   }

   public void brake() {

       /* Some complicated things happen inside the car.
       As a result, it slows down. */
   }

   public static void main(String[] args) {

       Auto auto = new Auto();

       // From the user's perspective,

       // one pedal is pressed and the car accelerates.
       auto.gas();
      
       // The other is pressed, and the car slows down.
       auto.brake();
   }
}
İşte bir Java programında uygulama gizlemenin nasıl göründüğü. Tıpkı gerçek hayatta olduğu gibi: kullanıcıya bir arayüz (yöntemler) sağlanır. Kullanıcı, bir eylemi gerçekleştirmek için bir programda bir arabaya ihtiyaç duyarsa, sadece istenen yöntemi çağırır. Bu yöntemlerin içinde olanlar gereksizdir. Önemli olan, her şeyin olması gerektiği gibi çalışmasıdır. Burada uygulama gizlemeden bahsediyoruz . Bunun yanı sıra, Java'da ayrıca veri gizleme vardır . Alıcılar ve ayarlayıcılar dersinde bunun hakkında yazdık , ancak kavramı gözden geçirmek zarar vermez. Örneğin, bir Catsınıfımız var:

public class Cat {

   public String name;
   public int age;
   public int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }

  
}
Belki de son dersten bu sınıftaki sorunu hatırlıyorsunuzdur? Değilse, şimdi hatırlayalım. Sorun şu ki, verileri (alanları) herkese açık - başka bir programcı, ağırlığı 0 ve yaşı -1000 olan isimsiz bir kediyi kolayca yaratabilir:

public static void main(String[] args) {

   Cat cat = new Cat();
   cat.name = "";
   cat.age = -1000;
   cat.weight = 0;

}
Belki iş arkadaşlarınızdan birinin geçersiz duruma sahip nesneler oluşturup oluşturmadığını yakından takip edebilirsiniz, ancak bu tür "geçersiz nesneler" oluşturma olasılığını bile dışlamak çok daha iyi olacaktır. Kapsülleme ilkeleri - 4Aşağıdaki mekanizmalar veri gizlemeyi başarmamıza yardımcı olur:
  1. erişim değiştiricileri ( özel , korumalı , varsayılan paket )
  2. alıcılar ve ayarlayıcılar
Örneğin, birinin kedinin yaşına negatif bir sayı atamaya çalışıp çalışmadığını görmek için oraya bir kontrol koyabiliriz. Daha önce de söylediğimiz gibi, kapsülleme ile ilgili çeşitli makalelerin yazarları bazen veri ve yöntemleri birleştirmek veya gizlemek veya her ikisini birden (birleştirmek ve gizlemek) kastediyor. Java'nın her iki mekanizması da vardır (bu, diğer OOP dilleri için mutlaka doğru değildir), bu nedenle son anlam en doğrudur. Kapsülleme bize birkaç önemli avantaj sağlar:
  1. Bir nesnenin doğru durumu üzerinde kontrol. Yukarıda bunun örnekleri vardı. Bir ayarlayıcı ve özel değiştirici, programımızın ağırlığı 0 olan kedilere sahip olmamasını sağlar.

  2. Bir arayüz aracılığıyla kullanıcı dostu olma. Yalnızca yöntemler dış dünyaya "maruz kalır". Bir sonuç elde etmek için yöntemleri çağırmak yeterlidir — nasıl çalıştıklarının ayrıntılarını araştırmaya kesinlikle gerek yoktur.

  3. Kod değişiklikleri kullanıcıları etkilemez. Yöntemlerin içinde her türlü değişikliği yapıyoruz. Bu, yöntemin kullanıcısını etkilemez: gaz pedalına basmak için daha önce doğru kod "auto.gas()" ise, olmaya devam edecektir. gas() yönteminde bir şeyi değiştirdiğimiz gerçeği kullanıcı tarafından görülmez: daha önce olduğu gibi arayan kişi istenen sonucu alır.