Saya tidak yakin apakah kedua istilah tersebut dapat digunakan secara bergantian. Mungkin ada beberapa perbedaan akademik dalam ilmu komputer yang tidak relevan untuk pemrograman sehari-hari? Atau bisakah saya menggunakan kedua istilah secara bergantian tanpa salah? Mungkin itu tergantung pada konteks di mana saya menggunakan kedua istilah itu?
Sunting: Dengan alasan mengapa saya menemukan kedua istilah ini dapat dipertukarkan adalah entri Wikipedia tentang lapisan Abstraksi . Di sana Anda dapat menemukan kutipan David Wheelers 'Semua masalah dalam ilmu komputer dapat diselesaikan dengan tingkat tipuan yang lain.'
computer-science
terminology
Theo Lenndorff
sumber
sumber
Jawaban:
Penawaran abstraksi dengan penyederhanaan,transaksi tipuan dengan lokasi.
Abstraksiadalah mekanisme yang "menyembunyikan" detail rumit suatu objek dalam istilah yang lebih sederhana, lebih mudah untuk memanipulasi istilah. Dalam pemrograman, contoh yang baik adalah perbedaan dalam detail antara kode mesin dan berbagai alat untuk membuat aplikasi yang pada akhirnya didasarkan pada kode mesin. Pertimbangkan untuk membuat aplikasi Windows Form dengan Visual Studio IDE. IDE memungkinkan Anda memikirkan aplikasi dalam hal item yang mudah dimanipulasi dengan cara What-You-See-Is-What-You-Get. Posisi widget layar disarikan ke lokasi visual dalam bingkai yang dapat Anda ubah dengan menyeret widget ke sekitarnya. Secara internal, IDE memanipulasi widget menggunakan lapisan abstraksi lain seperti bahasa tingkat tinggi (seperti C #). C # itu sendiri tidak dimanipulasi menggunakan kode mesin, itu dimanipulasi menggunakan "Common Runtime Environment"
Penipuan mengacu pada membuat lokasi suatu barang transparan. Jika Anda mengetahui URI sumber daya web, Anda dapat mengakses sumber daya tanpa mengetahui lokasi tepatnya. Anda tidak mengakses sumber daya secara langsung, melainkan Anda mengakses melalui saluran yang melewati permintaan Anda melalui serangkaian server, aplikasi, dan router. Peniruan dapat dianggap sebagai jenis khusus abstraksi di mana lokasi diabstraksi.
sumber
Abstraksi diimplementasikan menggunakan tipuan.
Misalnya, memori virtual: Abstraksi adalah ruang alamat yang berdekatan yang sepenuhnya Anda inginkan. Abstraksi ini diimplementasikan menggunakan tipuan melalui tabel halaman. Alih-alih secara langsung mengakses alamat memori fisik, mereka diterjemahkan dari alamat virtual ke alamat fisik.
Untuk menambahkan lapisan abstraksi, Anda harus menambahkan lapisan tipuan. Tetapi menambahkan tipuan tidak selalu memberi Anda abstraksi. Misalnya, memiliki getter dan setter pada setiap variabel tunggal adalah lapisan tipuan, tetapi jika semua yang mereka lakukan adalah mendapatkan dan menetapkan nilai-nilai sederhana tidak ada abstraksi.
sumber
Pertama, mari kita coba definisi yang tepat untuk istilah:
Lapisan abstraksi berarti:
Tingkat tipuan di sisi lain berarti:
Kedua hal ini dapat berarti hal yang sama, selama Anda menggunakan:
sumber
Pemahaman saya adalah bahwa abstraksi sebagian besar mengacu pada fungsi dan tipuan sebagian besar mengacu pada data. Dengan kata lain, level abstraksi adalah seberapa dalam jejak stack Anda dapatkan, dan level tipuan adalah berapa banyak pointer yang harus Anda lakukan dereference. Setidaknya begitulah cara saya menggunakan istilah tersebut.
sumber
Lapisan Abstraksi dan Tingkat Ketidaktahuan adalah konsep yang berbeda. Abstraksi adalah agregasi dan penamaan bermakna sejumlah elemen seperti potongan data atau instruksi program, misalnya konsep panggilan file atau metode, sedangkan tipuan adalah decoupling entitas untuk memfasilitasi penundaan realisasi hubungan mereka, misalnya, penggunaan JNDI untuk memisahkan identifikasi sumber daya dalam suatu program dari sumber daya aktual yang pada akhirnya dapat disediakan oleh wadah aplikasi.
Seringkali konsep berjalan beriringan dan mana yang berlaku untuk konstruksi tertentu tergantung pada latihan atau diskusi apa yang sedang berlangsung. Misalnya, sifat abstrak dari antarmuka adalah penting ketika mempelajari atau mendokumentasikan API; properti tipuannya penting ketika menambahkan ekstensibilitas atau membuat tes untuk suatu aplikasi.
Lapisan abstraksi adalah agregasi abstraksi dan memberi mereka integritas konseptual dan konsistensi penggunaan. CreateProcess adalah nama API win32 untuk sekelompok kode yang membangun dan menjalankan suatu proses. "Nama" penting untuk konteks ini karena jika kita memanggil fungsi tersebut seperti DoAllocMemThenMakeEnvThenFindEntryPoint ... itu benar-benar tidak akan terlalu abstrak. Lapisan seperti Win32 API memberikan penghalang di mana programmer mungkin disarankan untuk tidak berani. Ini menghilangkan kompleksitas dari sudut pandang penelepon dengan biaya daya berkurang (fleksibilitas, kinerja dll). Pertukaran ini disorot oleh diskusi yang sering terjadi tentang abstraksi bocor: kita mungkin masih perlu membuat panggilan SQL langsung saat menggunakan Hibernate atau membuat panggilan Win32 saat menggunakan .NET.
Mengenai tipuan, sebagian besar program non-sepele beroperasi dengan beberapa bentuk tipuan kode pengguna, lihat bagian INPUT-OUTPUT COBOL dari sebelum bahtera. Ketika mengakses sumber daya seperti database, kita mungkin melihat penyisipan string koneksi JDBC dalam kode sebagai Level 0 tipuan, koneksi JNDI (yang mendelegasikan pilihan sumber daya ke wadah aplikasi) sebagai Level 1 dan beberapa pegas konstruksi yang memetakan pengidentifikasi JNDI aplikasi ke salah satu dari banyak sumber daya kontainer sebagai Level 2. Beberapa level memungkinkan sejumlah pihak di luar hubungan (dalam hal ini hubungan antara mengeksekusi kode dan database) untuk memanipulasi hubungan itu. Ini berlaku sama untuk komponen program internal seperti antarmuka dan acara.
Kita melihat bahwa, tidak peduli apa kualitas mereka yang lain, abstraksi mengurangi kompleksitas sedangkan tipuan meningkatkannya. Abstraksi mengurangi daya sedangkan tipuan meningkatkannya. Indirection dapat digunakan untuk mengembalikan kekuatan abstraksi dengan membiarkan perilaku default ditimpa oleh callback kustom.
sumber
Pointer ke pointer ke pointer ke pointer ke pointer ke pointer ke int memiliki enam tingkat tipuan, tetapi tidak ada lapisan abstraksi apa pun.
sumber
Contoh abstraksi yang baik adalah memanggil metode tunggal untuk menyimpan item dalam database. Metode ini mengabstraksi rincian menghubungkan dan memanggil basis data. Di mana contoh tipuan menggunakan struct untuk mengakses interupsi. Anda masih mengakses interupsi ketika Anda menetapkan nilai di struct. itu hanya secara tidak langsung melalui struct dengan memberikan nama-nama anggota struct ke titik-titik tertentu dalam memori.
Jadi abstraksi menyembunyikan detail implementasi di mana tipuan hanya menyediakan antarmuka "tidak langsung" untuk mengakses sesuatu.
Abstraksi adalah ketika Anda tidak perlu memahami apa yang disembunyikan, di mana dengan tipuan Anda lakukan.
sumber
Menambahkan tingkat (atau lapisan) abstraksi dan menambahkan tingkat tipuan adalah dua cara sederhana untuk mengatakan hal yang sama. Ketika Anda memecahkan masalah, Anda biasanya mencoba solusi langsung. Terkadang itu tidak mungkin, jadi Anda mencoba solusi tidak langsung. Ini membutuhkan pengenalan beberapa abstraksi untuk menyederhanakan masalah - karena masalah ini rumit sehingga tidak dapat dipecahkan secara langsung. Setelah memecahkan masalah dengan pendekatan tidak langsung, tidak ada alasan untuk tidak mempertimbangkan menyelesaikan masalah lagi, tetapi lebih umum; Ini akan melibatkan pengenalan tingkat abstraksi lain yang lebih tinggi. Dan solusi baru yang lebih umum ini bahkan lebih tidak langsung daripada solusi tidak langsung asli - yaitu, sehingga tingkat tipuan lainnya telah diperkenalkan.
sumber