1. Pengenalan
Kami ingin menumpukan pelajaran hari ini kepada enkapsulasi . Anda sudah tahu apa itu secara umum.
Apakah faedah enkapsulasi? Terdapat beberapa daripada mereka, tetapi saya boleh memilih empat yang, pada pendapat saya, adalah yang utama:
2. Keadaan dalaman yang sah
Dalam program, situasi sering timbul apabila objek berinteraksi dengan beberapa kelas lain. Interaksi dengan objek ini boleh merosakkan data di dalam objek, menjadikannya mustahil untuk objek terus berfungsi seperti yang diharapkan.
Akibatnya, objek perlu menjejaki sebarang perubahan pada data dalamannya, atau lebih baik lagi, buat perubahan itu sendiri.
Jika kami tidak mahu beberapa pembolehubah diubah oleh kelas lain, maka kami mengisytiharkannya sebagai peribadi. Sebaik sahaja kita berbuat demikian, hanya kaedah kelasnya sendiri boleh mengaksesnya. Jika kita mahu pembolehubah menjadi baca sahaja, maka kita perlu menambah a public getter
untuk pembolehubah yang berkaitan.
Sebagai contoh, katakan kami mahu semua orang dapat mengetahui bilangan elemen dalam koleksi kami, tetapi kami tidak mahu mereka boleh menukar koleksi tanpa kebenaran kami. Kemudian kami mengisytiharkan private int count
pembolehubah dan public getCount()
kaedah.
Penggunaan enkapsulasi yang betul memastikan tiada kelas boleh mengakses data dalaman kelas kami secara langsung, yang oleh itu menghalang sebarang perubahan di luar kawalan kami. Perubahan ini hanya boleh dilakukan melalui memanggil kaedah kelas yang sama dengan pembolehubah yang diubah.
Adalah lebih baik untuk menganggap bahawa pengaturcara lain akan sentiasa menggunakan kelas anda dengan cara yang paling mudah untuk mereka, bukan cara yang paling selamat untuk anda (untuk kelas anda). Tingkah laku ini adalah punca kedua-dua pepijat serta percubaan untuk menghalangnya.
3. Mengesahkan hujah kaedah
Kadangkala kita perlu mengesahkan hujah yang diberikan kepada kaedah kita. Sebagai contoh, katakan kami mempunyai kelas yang mewakili seseorang dan membolehkan anda menetapkan tarikh lahir. Kita mesti menyemak semua data input untuk memastikan ia masuk akal dengan logik program dan logik kelas kita. Contohnya, untuk tidak membenarkan tarikh lahir dalam bulan ke-13 atau pada 30 Februari, dan seterusnya.
Mengapakah seseorang menyatakan 30 Februari untuk tarikh lahir mereka? Pertama, ini mungkin ralat pengguna semasa memasukkan data. Kedua, program mungkin mempunyai banyak ralat di dalamnya sebelum ia mula berjalan seperti jam. Sebagai contoh, situasi berikut adalah mungkin.
Seorang pengaturcara menulis program yang mengenal pasti orang yang hari lahirnya ialah lusa. Sebagai contoh, katakan hari ini ialah 3 Mac. Program ini menambah nombor 2 pada hari semasa bulan dan mencari semua orang yang lahir pada 5 Mac. Nampaknya semuanya betul.
Tetapi apabila 30 Mac tiba, program tidak akan menemui sesiapa, kerana kalendar tidak mempunyai 32 Mac. Program mempunyai ralat yang jauh lebih sedikit jika kita menyemak data yang dihantar ke kaedah.
Ingat semasa kita mengkaji ArrayList
dan menganalisis kodnya? Kami melihat bahawa kaedah get
dan set
menyemak sama ada index
lebih besar daripada atau sama dengan sifar dan kurang daripada panjang tatasusunan. Lebih-lebih lagi, kaedah ini memberikan pengecualian jika indeks berada di luar sempadan tatasusunan. Ini adalah contoh klasik pengesahan input.
4. Meminimumkan ralat semasa menukar kod
Katakan kita menulis kelas yang sangat berguna apabila kita terlibat dalam projek besar. Semua orang sangat menyukainya sehingga pengaturcara lain mula menggunakannya di beratus-ratus tempat dalam kod mereka.
Kelas itu sangat berguna sehingga anda memutuskan untuk memberikannya beberapa penambahbaikan. Tetapi jika anda mengalih keluar sebarang kaedah daripada kelas, maka kod berpuluh-puluh orang akan berhenti menyusun. Mereka perlu menulis semula segala-galanya. Dan lebih banyak perubahan yang anda buat, lebih banyak ralat yang akan anda buat. Anda akan memecahkan banyak perhimpunan dan anda akan dibenci.
Tetapi apabila kita menukar kaedah yang diisytiharkan sebagai peribadi, kita tahu bahawa tidak ada satu pun kelas lain di mana-mana yang boleh memanggil kaedah ini. Kami boleh menulis semulanya, menukar bilangan parameter dan jenisnya, dan sebarang kod luaran yang bergantung akan terus berfungsi. Nah, sekurang-kurangnya ia akan disusun.
5. Kami memutuskan bagaimana objek kami berinteraksi dengan objek luaran
Kita boleh menyekat beberapa tindakan yang boleh dilakukan dengan objek kita. Sebagai contoh, katakan kita mahu objek dijadikan instantiated sekali sahaja. Walaupun ia mungkin dibuat di beberapa tempat dalam projek itu. Dan kita boleh melakukan ini terima kasih kepada enkapsulasi.
Enkapsulasi membolehkan kami menambah sekatan tambahan , yang boleh diubah menjadi kelebihan tambahan . Sebagai contoh, String
kelas dilaksanakan sebagai objek tidak berubah . Objek kelas String
tidak berubah dari saat penciptaannya hingga saat kematiannya. Semua kaedah kelas String
( remove
, substring
, ...), mengembalikan rentetan baharu tanpa membuat sebarang perubahan pada objek yang dipanggil.
Enkapsulasi adalah perkara yang sangat menarik.
GO TO FULL VERSION