Menguasai Abstraksi Data C++: Sederhanakan Desain dengan Pemisahan Antarmuka-Implementasi
Abstraksi data merujuk pada penyediaan hanya informasi yang diperlukan kepada dunia luar dan menyembunyikan detail latar belakangnya, yaitu, untuk mewakili informasi yang diperlukan dalam program tanpa menyajikan detailnya.
Abstraksi data adalah teknik pemrograman (dan desain) yang bergantung pada pemisahan antarmuka dan implementasi.
Mari kita ambil satu contoh nyata dari TV, yang dapat Anda nyalakan dan matikan, ganti saluran, atur volume, dan tambahkan komponen eksternal seperti speaker, VCR, dan pemutar DVD, TETAPI Anda tidak mengetahui detail internalnya, yaitu, Anda tidak mengetahui bagaimana menerima sinyal melalui udara atau kabel, bagaimana menerjemahkannya, dan akhirnya menampilkannya di layar.
Oleh karena itu, kita dapat mengatakan televisi jelas memisahkan implementasi internalnya dari antarmuka eksternalnya dan Anda dapat bermain dengan antarmukanya seperti tombol daya, pengganti saluran, dan pengatur volume tanpa memiliki pengetahuan tentang internalnya.
Dalam C++, kelas menyediakan tingkat abstraksi data yang luar biasa. Mereka menyediakan metode publik yang cukup bagi dunia luar untuk bermain dengan fungsionalitas objek dan memanipulasi data objek, yaitu, status tanpa sepengetahuan bagaimana kelas telah diimplementasikan secara internal.
Contohnya, program Anda dapat memanggil fungsi sort() tanpa mengetahui algoritma apa yang sebenarnya digunakan fungsi tersebut untuk mengurutkan nilai yang diberikan. Faktanya, implementasi dasar dari fungsionalitas pengurutan dapat berubah antara rilis library, dan selama antarmuka tetap sama, pemanggilan fungsi Anda akan tetap berfungsi.
Dalam C++, kita menggunakan kelas untuk menentukan tipe data abstrak (ADT) kita sendiri. Anda dapat menggunakan objek cout dari kelas ostream untuk streaming data ke output standar seperti ini minus–
Live Demo
#include <iostream> using namespace std; int main() { cout << "Hello C++" <<endl; return 0; }
Di sini, Anda tidak perlu memahami bagaimana cout menampilkan teks di layar pengguna. Anda hanya perlu mengetahui antarmuka publik dan implementasi dasar ‘cout’ bebas untuk berubah.
Label Akses Menerapkan Abstraksi
Dalam C++, kita menggunakan label akses untuk mendefinisikan antarmuka abstrak dari kelas. Sebuah kelas mungkin memiliki nol atau lebih label akses minus–
Anggota yang didefinisikan dengan label publik dapat diakses oleh semua bagian program. Tampilan abstraksi data dari tipe didefinisikan oleh anggota publiknya.
Anggota yang didefinisikan dengan label privat tidak dapat diakses oleh kode yang menggunakan kelas. Bagian privat menyembunyikan implementasi dari kode yang menggunakan tipe.
Tidak ada pembatasan seberapa sering label akses dapat muncul. Setiap label akses menentukan tingkat akses dari definisi anggota yang berikutnya. Tingkat akses yang ditentukan tetap berlaku sampai label akses berikutnya ditemukan atau tutup kurung kanan tubuh kelas terlihat.
Manfaat Abstraksi Data
Abstraksi data memberikan dua keuntungan penting minus–
Internal kelas dilindungi dari kesalahan tingkat pengguna yang tidak sengaja, yang mungkin merusak status objek.
Implementasi kelas dapat berevolusi seiring waktu sebagai respons terhadap persyaratan yang berubah atau laporan bug tanpa memerlukan perubahan pada kode tingkat pengguna.
Dengan mendefinisikan anggota data hanya di bagian privat kelas, penulis kelas bebas untuk melakukan perubahan pada data. Jika implementasi berubah, hanya kode kelas yang perlu diperiksa untuk melihat dampak perubahan tersebut. Jika data publik, maka fungsi apa pun yang langsung mengakses anggota data representasi lama mungkin akan rusak.
Contoh Abstraksi Data
Program C++ mana pun di mana Anda mengimplementasikan kelas dengan anggota publik dan privat adalah contoh abstraksi data. Pertimbangkan contoh berikut minus–
Live Demo
#include <iostream> using namespace std; class Adder { public: // konstruktor Adder(int i = 0) { total = i; } // antarmuka ke dunia luar void addNum(int number) { total += number; } // antarmuka ke dunia luar int getTotal() { return total; }; private: // data tersembunyi dari dunia luar int total; }; int main() { Adder a; a.addNum(10); a.addNum(20); a.addNum(30); cout << "Total " << a.getTotal() <<endl; return 0; }
Ketika kode di atas dikompilasi dan dieksekusi, menghasilkan hasil berikut minus–
Total 60
Kelas di atas menambahkan angka bersama, dan mengembalikan jumlahnya. Anggota publik - addNum dan getTotal adalah antarmuka ke dunia luar dan pengguna perlu mengetahuinya untuk menggunakan kelas. Anggota privat total adalah sesuatu yang pengguna tidak perlu ketahui, tetapi diperlukan agar kelas beroperasi dengan benar.
Strategi Desain
Abstraksi memisahkan kode menjadi antarmuka dan implementasi. Jadi saat merancang komponen Anda, Anda harus menjaga antarmuka independen dari implementasi sehingga jika Anda mengubah implementasi dasar maka antarmuka akan tetap utuh.
Dalam hal ini, program apa pun yang menggunakan antarmuka ini tidak akan terpengaruh dan hanya perlu dikompilasi ulang dengan implementasi terbaru.