Apa perbedaan antara "data hiding" dan "enkapsulasi"?

29

Saya membaca "konkurensi Java dalam praktek" dan ada yang mengatakan: "Untungnya, teknik berorientasi objek yang sama yang membantu Anda menulis kelas yang terorganisir dengan baik - seperti enkapsulasi dan penyembunyian data - dapat juga membantu Anda membuat thread-safe kelas. "

Masalah # 1 - Saya tidak pernah mendengar tentang data yang disembunyikan dan tidak tahu apa itu.

Masalah # 2 - Saya selalu berpikir bahwa enkapsulasi menggunakan pribadi vs publik, dan sebenarnya menyembunyikan data.

Bisakah Anda jelaskan data apa yang disembunyikan dan bagaimana data itu berbeda dengan enkapsulasi?

dhblah
sumber
2
Baca Kode Lengkap edisi ke-2 . Itu akan menjawab banyak pertanyaan Anda.
Shiplu Mokaddim
Mengenai menyembunyikan informasi, lihat: javaworld.com/jw-05-2001/jw-0518-encapsulation.html
Dave Jarvis
Tautan ini memiliki wawasan berguna tentang Informasi yang Menyembunyikan prinsip desain ini, menetapkan bahwa keputusan desain harus disembunyikan dari bagian lain sistem untuk mencegah sambungan yang tidak diinginkan. Seharusnya menginformasikan cara Anda merangkum hal-hal, tetapi tentu saja tidak harus. Enkapsulasi adalah fitur bahasa pemrograman.
Abhijeet

Jawaban:

19

Penyembunyian data dan informasi adalah gagasan yang lebih luas, ditemukan dalam ilmu komputer & rekayasa perangkat lunak. Ini merujuk pada kenyataan bahwa bagian-bagian dari program komputer yang dapat berubah tidak boleh diakses dari modul lain / dari klien.

Enkapsulasi adalah istilah yang ditemukan dalam paradigma Berorientasi Objek dan mengacu pada menyimpan data di bidang pribadi dan memodifikasinya hanya melalui metode.

Dengan demikian enkapsulasi dapat dilihat sebagai cara untuk mencapai penyembunyian data dalam sistem berorientasi objek .

m3th0dman
sumber
1
Terima kasih atas balasannya Saya masih tidak mengerti, mengapa jika penyembunyian data sama tetapi hanya sedikit lebih luas dari enkapsulasi, itu disebut dalam buku seolah-olah mereka memiliki luas yang sama dan tidak satu termasuk yang lain.
dhblah
Penulis mungkin membuat perbedaan dari penyembunyian data dan penyembunyian informasi dalam arti bahwa penyembunyian data hanya menyembunyikan struktur data - bidang pribadi - sementara penyembunyian informasi dapat merujuk pada merangkum detail implementasi (algoritma yang digunakan misalnya) komunikasi yang dilakukan hanya melalui antarmuka.
m3th0dman
2
Anda dapat memiliki satu tanpa memiliki yang lain - lihat Python, di mana tidak ada data yang bersembunyi sama sekali (tidak ada yang namanya atribut pribadi atau yang dilindungi).
Latty
@ Titik Lattyware sangat benar dan penting. Seseorang juga dapat memiliki enkapsulasi (menurut definisi Anda, yang saya keberatan karena apa yang saya jelaskan di sini) tanpa menyembunyikan apa pun, yaitu dengan secara membabi buta memperlihatkan pengambil dan penyetel yang sepele untuk setiap anggota. Itu tidak menyembunyikan apa pun dan tidak mencegah apa pun, tetapi memenuhi definisi umum enkapsulasi surat itu.
1
Enkapsulasi tidak menyimpan data dalam bidang pribadi, itu menyembunyikan lebih banyak informasi. Enkapsulasi, secara umum, adalah konsep menyatukan (merangkum) informasi / data dan metode ke dalam kelas.
nbro
6

Enkapsulasi dan penyembunyian data adalah istilah terkait. Penting untuk dipahami bahwa mereka muncul dalam kaitannya dengan Abstraksi . Booch et. Al. dalam Analisis dan Desain Berorientasi Objek dengan Aplikasi menjelaskan,

Abstraksi dan enkapsulasi adalah konsep pelengkap: Abstraksi berfokus pada perilaku yang dapat diamati dari suatu objek, sedangkan enkapsulasi berfokus pada implementasi yang menimbulkan perilaku ini. Enkapsulasi paling sering dicapai melalui penyembunyian informasi (bukan hanya penyembunyian data), yang merupakan proses menyembunyikan semua rahasia suatu objek yang tidak berkontribusi pada karakteristik esensialnya; biasanya, struktur suatu objek tersembunyi, serta implementasi metodenya.

theD
sumber
5

Membuat kelas termasuk konsep enkapsulasi. Saat Anda membuat kelas, Anda memasukkan data dan perilaku di dalam kelas dan kelas menjadi satu unit yang kita sebut objek. Jadi penyembunyian data adalah bagian dari enkapsulasi.

Aleko Gharibashvili
sumber
4

Dari Wikipedia :

Dalam bahasa pemrograman, enkapsulasi digunakan untuk merujuk pada salah satu dari dua gagasan yang terkait tetapi berbeda, dan kadang-kadang kombinasi dari keduanya:

  • Mekanisme bahasa untuk membatasi akses ke beberapa komponen objek.
  • Konstruk bahasa yang memfasilitasi bundling data dengan metode (atau fungsi lain) yang beroperasi pada data tersebut.

Beberapa peneliti dan akademisi bahasa pemrograman menggunakan makna pertama saja atau dalam kombinasi dengan yang kedua sebagai fitur pembeda pemrograman berorientasi objek, sementara bahasa pemrograman lain yang menyediakan enkapsulasi tampilan penutupan leksikal sebagai fitur ortogonal bahasa untuk orientasi objek.

Definisi kedua dimotivasi oleh fakta bahwa dalam banyak bahasa OOP menyembunyikan komponen tidak otomatis atau dapat diganti; dengan demikian, penyembunyian informasi didefinisikan sebagai gagasan terpisah oleh mereka yang lebih suka definisi kedua.

Michael Borgwardt
sumber
Terima kasih untuk balasan Anda. Pertanyaan tindak lanjut: 1) apakah bahasa pemrograman java memiliki fasilitas yang mengacu pada konsep enkapsulasi? 2) Saya tidak mengerti mengapa mengesampingkan data menyembunyikan hal-hal. Misalnya dalam java Anda dapat mengakses bidang apa saja (publik atau pribadi) melalui refleksi.
dhblah
@Software Engeneering Learner: kelas sebagai konstruk kode sumber mewakili gagasan kedua. Adapun menyembunyikan informasi, intinya adalah bahwa membatasi ruang lingkup data sering didasarkan pada mekanisme bahasa yang spesifik dan terpisah.
Michael Borgwardt
2

Mereka sering digunakan secara bergantian dalam diskusi, dan sering saya pikir mereka bekerja bersama untuk mencapai tujuan yang sama, dan sementara yang berikut ini mungkin tidak sepenuhnya akurat, mungkin memberikan beberapa perbedaan yang bermakna, jika perbedaan perlu dibuat:

Ketika berbicara tentang enkapsulasi, seringkali ini diimplementasikan sebagai mekanisme prosedural / fungsional. Ada beberapa jenis penjaga untuk keadaan yang mendasarinya, dan akses melalui penjaga memerlukan protokol tertentu yang harus diikuti untuk diberi akses (baca atau ubah status yang diinginkan). Enkapsulasi juga menawarkan kesempatan untuk efek samping terjadi karena akses (seperti perubahan status kaskade, atau pemberitahuan / peningkatan peristiwa / mengeluarkan sinyal ketika hal yang menarik dibaca atau diubah) sehingga tindakan tindak lanjut dapat dimulai. Sekali lagi, saya sering menganggap enkapsulasi sebagai konsep yang merupakan sesuatu yang diimplementasikan sebagai prosedur.

Saya melihat konsep menyembunyikan data serupa dengan tujuan enkapsulasi; Namun, mekanismenya struktural dan beroperasi pada level yang berbeda. Dalam praktiknya, alih-alih menyediakan mekanisme perlindungan dan efek samping melalui prosedur, negara dilindungi dan dipengaruhi melalui mekanisme struktural bahasa dan runtime. Tipe-tipe penjaga ini adalah klausa visibilitas, definisi tipe, pewarisan, dan sejenisnya. Efek samping yang dapat Anda manfaatkan dari objek yang dijaga secara struktural adalah lagi sesuatu yang bergantung pada bahasa dan runtime: mungkin aktivasi objek, jumlah referensi, atau sesuatu di sepanjang garis itu.

JustinC
sumber
0

Mereka sering, mungkin biasanya, digunakan secara bergantian. Tetapi perhatikan kutipan Booch di atas yang mengatakan, "Enkapsulasi paling sering dicapai melalui penyembunyian informasi ..." yaitu paling sering, tetapi tidak selalu dalam setiap kasus.

Perhatikan bahwa Python memungkinkan pengguliran data di kelas, tetapi tidak mengizinkan variabel pribadi. Jadi bisa dikatakan bahwa Python menyediakan enkapsulasi tanpa menyembunyikan data.

Anda bisa melakukan hal yang sama di Jawa dengan membuat semua variabel anggota Anda public, tetapi selain memberi semua orang serangan jantung, Anda akan kehilangan manfaat dari penyembunyian data ... yaitu menjaga semantik objek dengan membatasi akses ke kondisinya.

rampok
sumber
0

Dalam OO, Enkapsulasi adalah tempat informasi disimpan dalam suatu Objek. Sebagai contoh, a Personmemiliki namedan klien Orang (yaitu Anda) tahu bahwa Orang memegang nama, baik melalui bidang publik atau metode accessor. Dan, mudah-mudahan, Anda tidak perlu juga memegang nama-nama di beberapa array nama global, dll. Jadi ini adalah langkah besar untuk menghindari kode spageti yang tidak terkelola. Tetapi klien masih perlu mengetahui sesuatu tentang bagaimana Orang menangani nama: misalnya spasi atau dibatasi koma?

Menyembunyikan Data adalah tempat yang Personmemiliki bidang nama, tetapi, setidaknya secara teori, tidak ada yang tahu . Lapangan bersifat pribadi tanpa metode aksesor publik. Klien dapat memberikan nama dari catatan basis data, XML, HTTP POST, apa pun, tetapi cara internal orang menangani nama adalah "kotak hitam". Implementasi Person di masa depan bebas untuk berubah, misalnya, untuk beralih ke memiliki a firstNamedan a lastName.

Dalam dunia ideal Menyembunyikan Data lebih unggul daripada Enkapsulasi, tetapi tidak semua dunia ideal. :-)

pengguna949300
sumber