Hai! Mari kita dedikasikan pelajaran hari ini kepada enkapsulasi dan mulakan segera dengan contoh :) Prinsip pengkapsulan - 1Di sini anda mempunyai mesin soda biasa . Saya ada satu soalan untuk anda: bagaimana ia berfungsi? Cuba berikan jawapan terperinci: dari mana asal cawan, bagaimana suhu dalaman dikekalkan, di mana ais disimpan, bagaimana mesin tahu sirap yang hendak ditambah, dsb.? Anda mungkin tidak mempunyai jawapan kepada soalan ini. Cukup adil, kerana tidak semua orang menggunakan mesin sedemikian. Mereka tidak begitu popular pada masa kini. Cuba kita berikan contoh lain. Sesuatu yang pasti anda gunakan berkali-kali setiap hari. Oh, inilah idea! Prinsip pengkapsulan - 2Beritahu kami bagaimana enjin carian Googleberfungsi. Bagaimana sebenarnya ia mencari maklumat yang berkaitan dengan perkataan yang anda masukkan? Mengapakah keputusan tertentu diberi kedudukan tinggi dan bukan yang lain? Walaupun anda menggunakan Google setiap hari, kemungkinan besar, anda tidak tahu. Tetapi tidak mengapa. Anda tidak perlu tahu ini. Anda boleh memasukkan pertanyaan ke dalam enjin carian tanpa memikirkan cara ia berfungsi. Anda boleh membeli soda daripada mesin tanpa mengetahui cara ia berfungsi. Anda boleh memandu kereta tanpa memahami cara enjin pembakaran dalaman berfungsi, dan tanpa mengetahui fizik sama sekali, walaupun di peringkat sekolah rendah. Semua ini adalah mungkin terima kasih kepada salah satu prinsip utama pengaturcaraan berorientasikan objek: enkapsulasi. Membaca pelbagai artikel tentang pengaturcaraan berorientasikan objek (OOP), anda pasti terjumpa fakta bahawa pengaturcaraan melibatkan dua konsep biasa: enkapsulasi dan menyembunyikan . Dan pengarang menggunakan perkataan "enkapsulasi" untuk bermaksud satu perkara dan kemudian satu lagi. Kami akan meneroka kedua-dua istilah supaya anda mendapat pemahaman yang lengkap. Dalam pengaturcaraan, maksud asal enkapsulasi ialah penggabungan data, bersama-sama dengan kaedah yang beroperasi pada data tersebut, ke dalam satu unit (iaitu "kapsul"). Di Jawa, kelas ialah unit enkapsulasi. Kelas mengandungi kedua-dua data (medan) dan kaedah untuk bekerja dengan data ini.Prinsip pengkapsulan - 3Ini mungkin kelihatan seperti pendekatan yang jelas betul kepada anda, tetapi dalam paradigma pengaturcaraan lain, semuanya disusun secara berbeza. Sebagai contoh, dalam pengaturcaraan berfungsi, data dipisahkan dengan ketat daripada operasi di atasnya. Dalam OOP, program terdiri daripada kapsul, atau kelas, yang terdiri daripada kedua-dua data dan fungsi untuk bekerja dengan data tersebut. Sekarang mari kita bercakap tentang bersembunyi . Bagaimanakah kita menggunakan semua jenis peranti kompleks tanpa memahami cara ia disusun atau cara ia berfungsi? Ia mudah: pencipta mereka memberikan kami antara muka yang ringkas dan mudah. Pada mesin soda, antara muka ialah butang pada panel. Menekan satu butang, anda memilih saiz cawan. Menekan satu lagi, anda memilih rasa. Satu pertiga bertanggungjawab untuk menambah ais. Dan itu sahaja yang perlu anda lakukan. Organisasi dalaman mesin tidak penting. Apa yang penting ialah ia direka dengan cara yang memerlukan pengguna menekan tiga butang untuk mendapatkan soda . Begitu juga dengan kereta. Tidak kira apa yang berlaku di dalam. Apa yang penting ialah apabila anda menekan pedal kanan, kereta bergerak ke hadapan, dan apabila anda menekan pedal kiri, ia perlahan.. Itulah yang dimaksudkan dengan bersembunyi. Semua "bahagian dalam" program disembunyikan daripada pengguna. Bagi pengguna, maklumat yang berlebihan dan tidak perlu ini. Pengguna memerlukan hasil akhir, bukan proses dalaman. Mari kita lihat Autokelas sebagai contoh:

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();
   }
}
Begini rupa pelaksanaan penyembunyian dalam program Java. Ia sama seperti dalam kehidupan sebenar: pengguna disediakan dengan antara muka (kaedah). Jika pengguna memerlukan kereta dalam program untuk melakukan tindakan, dia hanya memanggil kaedah yang dikehendaki. Apa yang berlaku di dalam kaedah ini adalah berlebihan. Yang penting semuanya berfungsi sebagaimana mestinya. Di sini kita bercakap tentang penyembunyian pelaksanaan . Selain itu, Java juga mempunyai penyembunyian data . Kami menulis tentang itu dalam pelajaran tentang getter dan setter , tetapi menyemak semula konsep itu tidak akan menyakitkan. Sebagai contoh, kami mempunyai Catkelas:

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!");
   }

  
}
Mungkin anda masih ingat masalah dengan kelas ini dari pelajaran lepas? Jika tidak, mari kita ingat sekarang. Masalahnya ialah datanya (medan) terbuka kepada semua orang — pengaturcara lain boleh mencipta kucing tanpa nama dengan berat 0 dan umur -1000 tahun dengan mudah:

public static void main(String[] args) {

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

}
Mungkin anda boleh memerhatikan sama ada salah seorang rakan sekerja anda telah mencipta objek dengan keadaan tidak sah, tetapi adalah lebih baik untuk mengecualikan walaupun kemungkinan mencipta "objek tidak sah" sedemikian. Prinsip pengkapsulan - 4Mekanisme berikut membantu kami mencapai penyembunyian data:
  1. pengubah suai akses ( peribadi , dilindungi , pakej lalai )
  2. getter dan setter
Sebagai contoh, kita boleh meletakkan semakan di sana untuk melihat sama ada seseorang cuba memberikan nombor negatif kepada umur kucing. Seperti yang kami katakan sebelum ini, pengarang pelbagai artikel tentang enkapsulasi kadangkala bermaksud menggabungkan data dan kaedah, atau menyembunyikannya, atau kedua-duanya (menggabungkan dan menyembunyikannya). Java mempunyai kedua-dua mekanisme (ini tidak semestinya benar untuk bahasa OOP lain), jadi makna terakhir adalah paling betul. Enkapsulasi memberi kita beberapa kelebihan penting:
  1. Kawalan ke atas keadaan objek yang betul. Terdapat contoh di atas. Penetap dan pengubah suai peribadi memastikan program kami tidak akan mempunyai kucing yang beratnya 0.

  2. Kemesraan pengguna melalui antara muka. Hanya kaedah yang dibiarkan "terdedah" kepada dunia luar. Kaedah panggilan sudah cukup untuk mendapatkan hasil — sama sekali tidak perlu menyelidiki butiran cara ia berfungsi.

  3. Perubahan kod tidak menjejaskan pengguna. Kami membuat sebarang dan semua perubahan dalam kaedah. Ini tidak menjejaskan pengguna kaedah: jika kod yang betul sebelum ini ialah "auto.gas()" untuk menggunakan pedal gas, maka ia akan terus menjadi. Hakikat bahawa kami telah mengubah sesuatu di dalam kaedah gas() kekal tidak kelihatan kepada pengguna: seperti sebelum ini, pemanggil hanya menerima hasil yang diingini.