Enkapsulasi vs Abstraksi?

139

Berikut adalah definisi singkat dari enkapsulasi dan abstraksi.

Abstraksi:

Proses abstraksi di Java digunakan untuk menyembunyikan detail tertentu dan hanya menampilkan fitur penting dari objek. Dengan kata lain, ini berhubungan dengan tampilan luar dari suatu objek (antarmuka). Satu-satunya contoh bagus yang saya lihat untuk ini di berbagai situs adalah antarmuka.

Enkapsulasi:

Ini pada dasarnya tentang menyembunyikan status objek dengan bantuan pengubah seperti privat, publik, dilindungi, dll. Kami mengekspos status melalui metode publik hanya jika diperlukan.

Apa yang kami capai dengan modifikator seperti private, publicjuga menyembunyikan detail yang tidak perlu dari dunia luar yang tidak lain adalah konsep abstraksi

Jadi, dari penjelasan di atas sepertinya enkapsulasi merupakan bagian dari abstraksi atau bisa juga dikatakan sebagai subset dari abstraksi. Tapi mengapa istilah enkapsulasi ditemukan ketika kita bisa mengatasinya hanya dengan abstraksi? Saya yakin harus ada beberapa perbedaan utama yang membedakan mereka tetapi sebagian besar materi di internet mengatakan hal yang hampir sama untuk keduanya.

Meskipun pertanyaan ini telah diangkat di forum ini sebelumnya juga, tetapi saya mempostingnya lagi dengan keraguan khusus. Beberapa balasan juga mengatakan abstraksi adalah konsep dan enkapsulasi adalah implementasi. Tetapi saya tidak percaya ini - Jika benar, maka saya dapat berpikir bahwa dua konsep berbeda ini disediakan untuk membingungkan kita.

Pembaruan: - Setelah 5 tahun saya telah menemukan jawaban saya sendiri yang intinya berdasarkan jawaban di posting ini dan yang di bawah ini

  1. perbedaan antara abstraksi dan enkapsulasi?
  2. enkapsulasi vs abstraksi contoh dunia nyata
M Sach
sumber
enkapsulasi seperti yang didefinisikan di atas adalah alat abstraksi namun saya cenderung menganggapnya sebagai apa yang diringkas oleh kelas (fungsionalitas / data terlepas dari akses) sedangkan abstraksi lebih merupakan rasa mengeluarkan Anda dari kekhawatiran tentang implementasi konkret yaitu terlepas dari bagaimana caranya itu dilakukan dan apa yang sebenarnya dilakukan itu bisa dilakukan dari wikipediaAn 'abstraction' (noun) is a concept that acts as a super-categorical noun for all subordinate concepts, and connects any related concepts as a group, field, or category.
TI
Enkapsulasi lebih dari mengikat detail yang relevan (data dan perilaku yang beroperasi pada data) yang berkaitan dengan konteks. Ini juga dapat dicapai tanpa penentu akses seperti private public, karena mereka hanya menyediakan penyembunyian informasi / data yang kami lakukan karena itu adalah praktik yang baik untuk melindungi data dari instance.
pengguna3227986

Jawaban:

98

Enkapsulasi adalah strategi yang digunakan sebagai bagian dari abstraksi. Enkapsulasi mengacu pada keadaan objek - objek merangkum statusnya dan menyembunyikannya dari luar; pengguna luar kelas berinteraksi dengannya melalui metodenya, tetapi tidak dapat mengakses status kelas secara langsung. Jadi kelas mengabstraksi detail implementasi yang terkait dengan statusnya.

Abstraksi adalah istilah yang lebih umum, itu juga dapat dicapai dengan (antara lain) subclassing. Misalnya, antarmuka Listdi pustaka standar adalah abstraksi untuk urutan item, diindeks berdasarkan posisinya, contoh konkret a Listare an ArrayListatau a LinkedList. Kode yang berinteraksi dengan Listabstrak atas detail jenis daftar yang digunakannya.

Abstraksi seringkali tidak mungkin tanpa menyembunyikan status yang mendasari dengan enkapsulasi - jika kelas mengekspos status internalnya, ia tidak dapat mengubah cara kerjanya, dan karenanya tidak dapat diabstraksi.

Martin Probst
sumber
8
Enkapsulasi berarti bahwa sekelompok properti, metode, dan anggota lain yang terkait diperlakukan sebagai satu unit atau objek. msdn.microsoft.com/en-us/library/dd460654.aspx
raberana
1
Enkapsulasi mengarah ke Abstraksi.
Martin
127

Abstraksi adalah konsep mendeskripsikan sesuatu dalam istilah yang lebih sederhana, yaitu mengabstraksi detail, untuk fokus pada apa yang penting (Hal ini juga terlihat dalam seni abstrak, misalnya, di mana seniman fokus pada blok bangunan gambar, seperti warna atau bentuk). Ide yang sama diterjemahkan menjadi OOP dengan menggunakan hierarki pewarisan, di mana lebih banyak konsep abstrak di atas dan lebih banyak ide konkret, di bawah, dibangun di atas abstraksi mereka. Pada tingkat yang paling abstrak tidak ada detail implementasi sama sekali dan mungkin sangat sedikit kesamaan, yang ditambahkan saat abstraksi berkurang.

Sebagai contoh, di bagian atas mungkin ada antarmuka dengan metode tunggal, kemudian tingkat berikutnya, menyediakan beberapa kelas abstrak, yang mungkin atau mungkin tidak mengisi beberapa detail tentang tingkat atas, tetapi bercabang dengan menambahkan metode abstrak mereka sendiri , maka untuk masing-masing kelas abstrak ini adalah kelas konkrit yang menyediakan implementasi dari semua metode yang tersisa.

Enkapsulasi adalah teknik . Ini mungkin atau mungkin tidak untuk membantu dalam abstraksi, tetapi ini pasti tentang penyembunyian informasi dan / atau organisasi. Ini menuntut data dan fungsi dikelompokkan dalam beberapa cara - tentu saja praktik OOP yang baik menuntut bahwa mereka harus dikelompokkan berdasarkan abstraksi. Namun, ada kegunaan lain yang hanya membantu dalam pemeliharaan, dll.

Robert
sumber
14
Definisi Anda tentang Abstraksi adalah yang terbaik yang pernah saya lihat, dan saya merasa untuk pertama kalinya, itu benar-benar diklik di kepala saya dan masuk akal. Saya tahu sudah 3+ tahun sejak Anda memposting ini, tapi terima kasih.
Casey Crookston
1
Wow .... Abstraksi .... diekspresikan dalam artian ... merah mungkin amarah, itu saja yang perlu kita ketahui! Terima kasih untuk pandangan konsep ini :-)
SlowLearner
Enkapsulasi digunakan untuk mencapai "Kopling Longgar & Kohesi Tinggi".
Sortir
28

enkapsulasi adalah bagian dari abstraksi atau dapat dikatakan sebagai bagian dari abstraksi

Mereka adalah konsep yang berbeda.

  • Abstraksi adalah proses memurnikan semua atribut yang tidak diperlukan / tidak penting dari suatu objek dan hanya mempertahankan karakteristik yang paling sesuai untuk domain Anda.

    Misalnya untuk seseorang: Anda memutuskan untuk tetap menggunakan nama depan dan belakang dan SSN. Usia, tinggi badan, berat badan, dll. Diabaikan sebagai tidak relevan.

    Abstraksi adalah tempat desain Anda dimulai.

  • Enkapsulasi adalah langkah selanjutnya di mana ia mengenali operasi yang sesuai pada atribut yang Anda terima untuk disimpan selama proses abstraksi. Ini adalah asosiasi data dengan operasi yang bertindak atas data tersebut.
    Yaitu data dan metode digabungkan bersama.
Cratylus
sumber
Bisakah kita mengatakan Abstraksi adalah sejenis konsep desain dan Enkapsulasi terutama berkaitan dengan implementasi desain yang kita sepakati selama abstraksi?
M Sach
1
Dalam enkapsulasi Anda menentukan operasi yang dapat / harus diterapkan ke data Anda.Ini dapat menjadi bagian dari desain juga. Eg mengambil SSN, tetapi tidak dapat memodifikasinya
Cratylus
25

Enkapsulasi menyembunyikan data yang tidak perlu dalam kapsul atau unit

Abstraksi menunjukkan ciri penting suatu objek

Enkapsulasi digunakan untuk menyembunyikan anggotanya dari luar kelas dan antarmuka. Menggunakan pengubah akses yang disediakan di c # .seperti publik, pribadi, dilindungi, dll. Contoh:

Class Learn
{
  private int a;         // by making it private we are hiding it from other
  private void show()   //class to access it
  {
   console.writeline(a);
  }
}

Di sini kami memiliki data bungkus dalam unit atau kapsul yaitu Kelas.

Abstraksi adalah kebalikan dari Enkapsulasi.

Abstraksi digunakan untuk menunjukkan data penting dan relevan kepada pengguna. contoh terbaik dunia nyata Di ponsel, Anda melihat berbagai jenis fungsinya sebagai kamera, pemutar mp3, fungsi panggilan, fungsi perekaman, multimedia, dll. Ini adalah abstraksi, karena Anda hanya melihat informasi yang relevan, bukan rekayasa internalnya.

 abstract class MobilePhone
    {
        public void Calling();       //put necessary or essential data
        public void SendSMS();       //calling n sms are main in mobile
    }

    public class BlackBerry : MobilePhone   // inherited main feature
    {
        public void FMRadio();            //added new
        public void MP3();
        public void Camera();
        public void Recording();

    }
varsha.dll
sumber
saya setuju. orang-orang ini agak berlawanan. Good oop cenderung mengabstraksikan hal-hal yang tidak berubah dan [merangkum hal-hal yang berubah] [1]. [1]: prinsip-wiki.net/…
Ray Tayek
15

Abstraksi adalah istilah yang sangat umum, dan abstraksi dalam perangkat lunak tidak terbatas pada bahasa berorientasi objek. Definisi kamus: "tindakan mempertimbangkan sesuatu sebagai kualitas atau karakteristik umum, terlepas dari realitas konkret, objek tertentu, atau kejadian aktual".

Bahasa assembly dapat dianggap sebagai abstraksi kode mesin - assembly mengungkapkan detail dan struktur penting dari kode mesin, tetapi membebaskan Anda dari keharusan memikirkan opcode yang digunakan, tata letak kode dalam memori, membuat lompatan ke alamat yang benar, dll.

API sistem operasi Anda adalah abstraksi dari mesin yang mendasarinya. Kompilator Anda menyediakan lapisan abstraksi yang melindungi Anda dari detail bahasa assembly. Tumpukan TCP / IP yang dibangun ke dalam sistem operasi Anda mengabstraksi detail transmisi bit melalui jaringan. Jika Anda mempelajari mentah silikon, orang yang merancang CPU Anda melakukannya dengan menggunakan diagram sirkuit yang ditulis dalam istilah "dioda" dan "transistor", yang merupakan abstraksi tentang bagaimana elektron bergerak melalui kristal semikonduktor.

Dalam perangkat lunak, semuanya adalah abstraksi. Kami membangun program yang mensimulasikan atau memodelkan beberapa aspek realitas, tetapi dengan kebutuhan model kami selalu mengabstraksi beberapa detail dari "hal yang nyata". Kami membangun lapisan demi lapisan abstraksi, karena itulah satu-satunya cara kami menyelesaikan sesuatu. (Bayangkan Anda mencoba membuat, katakanlah, pemecah sudoku, dan Anda harus mendesainnya hanya dengan menggunakan kristal semikonduktor. "Oke, saya butuh silikon tipe-N di sini ...")

Sebagai perbandingan, "enkapsulasi" adalah istilah yang sangat spesifik dan terbatas. Beberapa dari jawaban lain untuk pertanyaan ini telah memberikan definisi yang baik untuk itu.

Alex D
sumber
15

Menjawab pertanyaan saya sendiri setelah 5 tahun karena saya merasa masih membutuhkan detail lebih lanjut

Abstraksi:

Definisi Teknis: - Abstraksi adalah konsep untuk menyembunyikan detail yang tidak perlu (kompleks atau sederhana) dan hanya menampilkan fitur penting dari objek. Tidak ada implementasi disini, ini hanya sebuah konsep

Apa artinya secara praktis: - Ketika saya mengatakan perusahaan saya membutuhkan beberapa media / perangkat agar karyawan dapat terhubung dengan pelanggan. Ini adalah bentuk abstaksi yang paling murni (seperti antarmuka di java) karena perangkat / media tersebut dapat berupa telepon atau internet atau skype atau secara langsung atau email dll. Saya tidak akan membahas seluk-beluk perangkat / media

Bahkan ketika saya mengatakan perusahaan saya membutuhkan beberapa media / perangkat agar karyawan dapat terhubung ke pelanggan melalui panggilan suara. Kemudian saya juga berbicara abstrak tetapi pada tingkat yang lebih rendah sebagai perangkat / media dapat berupa telepon atau skype atau yang lainnya dll

Sekarang ketika saya mengatakan perusahaan saya membutuhkan beberapa telepon agar karyawan dapat terhubung ke pelanggan melalui panggilan suara. Kemudian saya juga berbicara abstrak tetapi pada tingkat yang sedikit lebih rendah karena telepon dapat dari perusahaan mana pun seperti iphone atau samsung atau nokia dll

Enkapsulasi: - Pada dasarnya tentang menyembunyikan status (informasi) objek dengan bantuan pengubah seperti privat, publik, dilindungi, dll. Kami mengekspos status melalui metode publik hanya jika diperlukan.

Apa artinya secara praktis: - Sekarang ketika saya mengatakan perusahaan saya membutuhkan beberapa iphone sehingga karyawan dapat terhubung ke pelanggan melalui panggilan suara. Sekarang saya berbicara tentang beberapa objek konkret (seperti iphone). Meskipun saya tidak membahas seluk-beluk iphone di sini juga, tetapi iphone memiliki beberapa info / implementasi negara / konkret yang terkait dengannya di mana perangkat / media tidak memilikinya. Ketika saya mengatakan objek konkret, sebenarnya itu berarti objek apa pun yang memiliki beberapa implementasi / info (tidak lengkap seperti kelas abstrak java) yang terkait dengannya.

Jadi iphone sebenarnya digunakan di sini enkapsulasi sebagai strategi untuk menyembunyikan status / informasinya dan hanya mengekspos yang menurutnya harus diekspos. Jadi baik abstraksi dan enkapsulasi menyembunyikan beberapa detail yang tidak perlu tetapi abstraksi pada level konsep dan enkapsulasi sebenarnya pada level implementasi

Ini adalah intinya berdasarkan jawaban di posting ini dan yang di bawah ini

  1. perbedaan antara abstraksi dan enkapsulasi?
  2. enkapsulasi vs abstraksi contoh dunia nyata
M Sach
sumber
5

Enkapsulasi - proses menyembunyikan komponen kelas untuk mencegah akses langsung dari luar. Hal ini dicapai dengan menggunakan pengubah "private" untuk mencegah akses langsung ke beberapa anggota kelas (bidang data atau metode) dari kelas atau objek lain sementara itu memberikan akses ke anggota privat ini oleh anggota publik (Antarmuka). Itu membuat anggota kelas terlindungi seperti organ manusia yang tersembunyi / terbungkus di bawah kulit atau perisai.

Abstraksi - Prinsip harus diikuti dalam menulis program OOP yang mengatakan "Anda harus memasukkan di kelas hanya komponen yang menarik dalam tugas program". Misalnya: objek siswa memiliki banyak karakter sebagai manusia: nama, usia, berat badan, warna rambut, warna mata, dll. Tapi, ketika Anda membuat kelas di OOP untuk bekerja dengan siswa, Anda harus memasukkan hanya karakter yang benar-benar materi untuk database siswa: nama, usia, spesialisasi, level, nilai ... dll. di C ++ Anda dapat membuat kelas abstrak dengan menggunakan pengubah "virtual" dengan metode apa pun di kelas dan itu akan membuatnya tidak dapat digunakan secara langsung tetapi Anda bisa dapatkan kelas lain darinya dan buat implementasi untuk anggotanya dengan menambahkan anggota yang diperlukan berdasarkan tugas.

Merah
sumber
4

Beginilah cara saya memahaminya:

Dalam pemrograman berorientasi objek, kami memiliki sesuatu yang disebut kelas . Untuk apa mereka? Mereka menyimpan beberapa keadaan dan menyimpan beberapa metode untuk mengubah keadaan itu yaitu, mereka merangkum keadaan dan metodenya.

Itu (kelas) tidak peduli tentang visibilitasnya sendiri atau isinya. Jika kita memilih untuk menyembunyikan keadaan atau beberapa metode, itu adalah penyembunyian informasi .

Sekarang, ambil skenario warisan . Kami memiliki kelas dasar dan beberapa kelas turunan (warisan). Jadi, apa yang dilakukan kelas dasar di sini? Ini mengabstraksi beberapa hal dari kelas turunan.

Semuanya berbeda, bukan? Tapi, kami mencampurnya untuk menulis program berorientasi objek yang bagus. Semoga membantu :)

abhilash
sumber
3

Abstraksi menggambarkan representasi konteks tertentu yang disederhanakan dari sesuatu; ia mengabaikan detail yang tidak relevan secara kontekstual dan menyertakan detail penting secara kontekstual.

Enkapsulasi membatasi akses luar ke bagian dan bundel sesuatu yang keadaannya dengan prosedur yang menggunakan keadaan tersebut.


Ambil contoh orang, misalnya. Dalam konteks pembedahan, abstraksi yang berguna mengabaikan keyakinan agama seseorang dan termasuk tubuh orang tersebut. Selanjutnya, orang merangkum ingatan mereka dengan proses berpikir yang menggunakan ingatan tersebut. Abstraksi tidak perlu memiliki enkapsulasi; Misalnya, lukisan seseorang tidak menyembunyikan bagian-bagiannya atau menyatukan prosedur dengan negaranya. Dan, enkapsulasi tidak perlu memiliki abstraksi terkait; misalnya, manusia nyata (bukan yang abstrak) membungkus organ mereka dengan metabolisme mereka.

Shaun Luttin
sumber
1

CATATAN: Saya membagikan ini. Bukan berarti di sini bukan jawaban yang bagus tapi karena saya mudah dimengerti.

Menjawab:

Ketika kelas dikonseptualisasikan, properti apa yang dapat kita miliki di dalamnya berdasarkan konteksnya. Jika kita merancang hewan kelas dalam konteks kebun binatang, penting bahwa kita memiliki atribut sebagai animalType untuk mendeskripsikan domestik atau liar. Atribut ini mungkin tidak masuk akal ketika kita mendesain kelas dalam konteks yang berbeda.

Demikian pula, perilaku apa yang akan kita lakukan di kelas? Abstraksi juga diterapkan di sini. Apa yang perlu dimiliki di sini dan apa yang akan menjadi overdosis? Kemudian kami memotong beberapa informasi dari kelas. Proses ini menerapkan abstraksi.

Ketika kita menanyakan perbedaan antara enkapsulasi dan abstraksi, saya akan mengatakan, enkapsulasi menggunakan abstraksi sebagai konsep. Jadi, apakah itu hanya enkapsulasi. Tidak, abstraksi bahkan merupakan konsep yang diterapkan sebagai bagian dari pewarisan dan polimorfisme.

Buka di sini untuk penjelasan lebih lanjut tentang topik ini.

Yubaraj
sumber
1

Mari mencoba memahami dengan cara yang berbeda.

Apa yang mungkin terjadi jika Abstraksi tidak ada dan Apa yang mungkin terjadi jika Enkapsulasi tidak ada.

Jika Abstraksi tidak ada, maka Anda dapat mengatakan bahwa objek tersebut kurang digunakan. Anda tidak dapat mengidentifikasi objek atau mengakses fungsionalitas apa pun darinya. Ambil contoh TV, jika Anda tidak memiliki pilihan untuk menyalakan, mengganti saluran, menambah atau mengurangi volume, dll., Lalu apa gunanya TV dan bagaimana Anda menggunakannya?

Jika Enkapsulasi tidak ada atau tidak diterapkan dengan benar, Anda dapat menyalahgunakan objek tersebut. Oleh karena itu, data / komponen dapat disalahgunakan. Ambil contoh yang sama dari TV, Jika tidak ada enkapsulasi yang dilakukan pada volume TV, maka pengontrol volume dapat disalahgunakan dengan membuatnya berada di bawah atau melampaui batasnya (0-40 / 50).

satya
sumber
1

Enkapsulasi melindungi perilaku internal objek / instance dari entitas eksternal. Jadi, harus ada kontrol untuk memastikan bahwa data yang disuplai tidak akan merusak sistem internal instance / objek untuk bertahan hidup.

Contoh yang bagus, Divider adalah kelas yang memiliki dua variabel contoh, pembagi dan pembagi dan metode getDividedValue.

Bisakah Anda berpikir, jika pembagi diatur ke 0 maka sistem / perilaku internal (getDivided) akan rusak.

Jadi, perilaku internal objek bisa dilindungi dengan melempar pengecualian melalui sebuah metode.

Ranjit Kumar
sumber
0

dalam kalimat sederhana, saya dapat mengatakan: Inti dari abstraksi adalah mengekstrak properti penting sambil menghilangkan detail yang tidak penting. Tetapi mengapa kita harus menghilangkan detail yang tidak penting? Motivator utamanya adalah mencegah risiko perubahan. Anda mungkin menganggap abstraksi sama dengan enkapsulasi. Tetapi enkapsulasi berarti tindakan melampirkan satu atau lebih item di dalam wadah, bukan menyembunyikan detail. Jika Anda membuat argumen bahwa "semua yang dikemas juga disembunyikan." Ini jelas tidak benar. Misalnya, meskipun informasi dapat diringkas dalam struktur rekaman dan array, informasi ini biasanya tidak disembunyikan (kecuali disembunyikan melalui mekanisme lain).

Alireza Rahmani Khalili
sumber