Apa perbedaan antara 'lapisan abstraksi' dan 'tingkat tipuan'?

38

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.'

Theo Lenndorff
sumber
7
... kecuali masalah terlalu banyak tingkat tipuan!
Mason Wheeler
@MasonWheeler: Anda dapat menambahkan tingkat tipuan yang tidak langsung dan tidak langsung ...
Jon Purdy
C ++ memungkinkan Anda untuk menambahkan lapisan abstraksi tanpa lapisan tipuan, sehingga mereka tidak bisa berarti sama.
fredoverflow

Jawaban:

30

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.

Jay Elston
sumber
2
+1 jawaban terbaik sejauh ini! Akan menulis satu tetapi yang ini cukup dekat dengan apa yang ada dalam pikiran saya.
Newtopian
27

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.

Austin
sumber
2
Faktanya, contoh terakhir tidak terlalu bagus. Getter dan setter polos memang menambah abstraksi. Satu-satunya yang mengetahui, mereka jelas, adalah kelas yang menyatakannya. Jika Anda memutuskan untuk mengubah implementasi, kode apa pun yang dibangun melawan abstraksi tidak akan terpengaruh.
back2dos
dapatkah Anda memberikan contoh yang lebih baik yang tipuan tetapi bukan abastraksi?
Mr Coder
1
jelas contoh yang salah
Morg.
3
Siapa yang mengatakan sesuatu tentang kelas? Saya juga tidak mengatakan apa pun tentang mengubah visibilitas suatu variabel. Tidak ada yang menghentikan Anda mengaksesnya secara langsung; itu variabel. Tetapi Anda juga bisa melakukannya dengan tingkat tipuan melalui pengambil dan penyetel. Karena semantik menggunakan pengambil dan penyetel sama dengan mengakses variabel secara langsung, tidak ada abstraksi.
Austin
2
Kecuali bahwa pengambil dan penyetel tidak selalu 'hanya' mengakses variabel. Jika Anda menggunakan pengambil dan penyetel Anda menambahkan abstraksi karena Anda dapat mengubahnya untuk menggunakan variabel yang berbeda tanpa pengguna menyadarinya, oleh karena itu abstraksi.
Dominique McDonnell
9

Pertama, mari kita coba definisi yang tepat untuk istilah:

  1. Lapisan abstraksi berarti:

     a) there is large number of positions which use abstraction
          (layer = all the positions together)
     b) each position is hiding some complex stuff, but allows invoking it 
          using only simple code. 
         (abstraction == one-to-one mapping between simple code and complex code)
    
  2. Tingkat tipuan di sisi lain berarti:

      a) you're counting levels
      b) indirection==there are several steps before you can reach or access the data
      c) level of indirection is just how many steps it takes to access the data
    

Kedua hal ini dapat berarti hal yang sama, selama Anda menggunakan:

  a) step = going from simple code to complex code. 
tp1
sumber
7

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.

Karl Bielefeldt
sumber
dengan fungsi virtual yang dimodelkan sebagai pointer ke fungsi?
Caleth
7

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.

mikemay
sumber
1

Pointer ke pointer ke pointer ke pointer ke pointer ke pointer ke int memiliki enam tingkat tipuan, tetapi tidak ada lapisan abstraksi apa pun.

gnasher729
sumber
0

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.

Charles Lambert
sumber
-1

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.

ChrisC
sumber
3
ini sepertinya tidak menambahkan sesuatu yang substansial pada poin yang dibuat dan dijelaskan dalam 7 jawaban sebelumnya
nyamuk
Terima kasih, Nyamuk. Saya ambil poin Anda, dan sayangnya pertanyaan menarik ini menarik banyak spam!
ChrisC