it-swarm-id.com

Apa itu abstraksi?

Apakah ada definisi yang disepakati secara umum untuk apa abstraksi pemrograman, seperti yang digunakan oleh programmer? [Catatan, pemrograman abstraksi tidak harus disamakan dengan definisi kamus untuk kata "abstraksi."] Apakah ada definisi yang jelas, atau bahkan matematis? Apa saja contoh jelas dari abstraksi?

38
mlvljr

Jawaban untuk "Bisakah Anda menentukan apa abstraksi pemrograman kurang lebih secara matematis?" Tidak." Abstraksi bukan konsep matematika. Ini seperti meminta seseorang untuk menjelaskan warna lemon secara matematis.

Jika Anda menginginkan definisi yang baik: abstraksi adalah proses perpindahan dari ide tertentu ke ide yang lebih umum. Misalnya, lihat mouse Anda. Apakah nirkabel? Sensor macam apa yang dimilikinya? Berapa banyak tombol? Apakah ergonomis? Seberapa besar itu? Jawaban untuk semua pertanyaan ini dapat dengan tepat menggambarkan tetikus Anda, tetapi terlepas dari apa jawabannya, ia tetap mouse, karena itu adalah alat penunjuk dengan tombol. Hanya itu yang diperlukan untuk menjadi tikus. "Silver Logitech MX518" adalah item yang konkret, spesifik, dan "mouse" adalah abstraksi dari itu. Suatu hal penting untuk dipikirkan adalah bahwa tidak ada objek konkret seperti "mouse", itu hanya sebuah ide. Mouse di meja Anda selalu merupakan sesuatu yang lebih spesifik - itu adalah Apple Magic Mouse atau Dell Optical Mouse atau Microsoft IntelliMouse - "mouse" hanyalah konsep abstrak.

Abstraksi dapat berlapis dan halus atau kasar seperti yang Anda inginkan (MX518 adalah mouse, yang merupakan objek penunjuk, yang merupakan perangkat komputer, yang merupakan objek yang didukung oleh listrik), dapat berjalan sejauh yang Anda inginkan , dan di hampir semua arah yang Anda inginkan (mouse saya memiliki kawat, artinya saya dapat mengategorikannya sebagai objek dengan kawat. Ini juga rata di bagian bawah, jadi saya bisa mengkategorikannya sebagai jenis objek yang tidak akan bergulir ketika ditempatkan tegak di bidang miring).

Pemrograman berorientasi objek dibangun pada konsep abstraksi dan keluarga atau kelompok mereka. Bagus OOP berarti memilih abstraksi yang baik pada tingkat detail yang sesuai yang masuk akal dalam domain program Anda dan jangan "bocor". Yang pertama berarti mengklasifikasikan mouse sebagai objek yang menang 't roll pada bidang miring tidak masuk akal untuk aplikasi yang menginventarisasi peralatan komputer, tetapi mungkin masuk akal untuk simulator fisika. Yang terakhir berarti Anda harus mencoba untuk menghindari "tinju diri Anda" ke hierarki yang tidak t masuk akal untuk beberapa jenis objek. Misalnya, dalam hierarki saya di atas, apakah kami yakin bahwa semua peripheral komputer didukung oleh listrik? Bagaimana dengan stylus? Jika kita ingin mengelompokkan stylus ke dalam kategori "periferal", kita akan memiliki masalah, karena ia tidak menggunakan listrik, dan kami mendefinisikan periferal komputer sebagai objek yang menggunakan listrik. Lingkaran-elips) masalah adalah contoh paling terkenal dari teka-teki ini.

46
nlawalker

Saya sangat tidak setuju dengan sebagian besar jawaban.

Ini jawaban saya:

Diberikan dua set G dan H, koneksi Galois (alpha, beta) dapat didefinisikan di antara mereka, dan satu dapat dikatakan konkretisasi yang lain; membalikkan koneksi, dan satu merupakan abstraksi dari yang lain. Fungsi-fungsinya adalah fungsi konkretisasi dan fungsi abstraksi.

Ini dari teori interpretasi abstrak dari program komputer, yang biasanya merupakan pendekatan analisis statis hingga saat ini.

25
Paul Nathan

Abstraksi lebih fokus pada What dan lebih sedikit pada How. Atau Anda bisa mengatakan, hanya tahu hal-hal yang Anda butuhkan, dan hanya percaya pada penyedia untuk semua layanan lainnya. Kadang-kadang bahkan menyembunyikan identitas penyedia layanan.

Misalnya, situs ini menyediakan sistem untuk mengajukan pertanyaan dan menjawabnya. Hampir semua orang di sini tahu apa prosedur untuk bertanya, menjawab, memberikan suara dan hal-hal lain dari situs ini. Tetapi sangat sedikit yang tahu apa teknologi yang mendasarinya. Seperti apakah situs itu dikembangkan dengan ASP.net mvc atau Python, apakah ini berjalan di Windows atau server Linux dll. Karena itu bukan urusan kami. Jadi, situs ini menyimpan lapisan abstraksi atas mekanisme yang mendasarinya kepada kami yang menyediakan layanan.

Beberapa contoh lain:

  • Sebuah mobil menyembunyikan semua mekanismenya tetapi menyediakan cara untuk mengemudi, mengisi bahan bakar dan mempertahankannya untuk pemiliknya.

  • API apa pun menyembunyikan semua detail implementasinya yang menyediakan layanan untuk programmer lain.

  • Kelas dalam OOP menyembunyikan anggota privasinya dan implementasi anggota publik yang menyediakan layanan untuk memanggil anggota publik.

  • Saat menggunakan objek tipe Interface atau abstract class dalam Java atau C++, implementasi sesungguhnya disembunyikan. Dan tidak hanya disembunyikan, implementasi metode yang dideklarasikan dalam Interface juga cenderung berbeda dalam berbagai implementasi/kelas yang diwarisi. Tetapi ketika Anda mendapatkan layanan yang sama, jangan ganggu How itu diterapkan dan tepatnya Who/What menyediakan layanan.

  • Identity Hiding: Untuk kalimat "Saya tahu Sam bisa menulis program komputer." abstraksinya bisa- "Sam adalah seorang programmer. Pemrogram tahu cara menulis program komputer." Dalam pernyataan kedua, orang itu tidak penting. Tetapi kemampuannya untuk melakukan pemrograman itu penting.

13
Gulshan

Abstraksi pemrograman adalah model yang disederhanakan dari suatu masalah.

Misalnya, koneksi TCP/IP adalah abstraksi atas pengiriman data. Anda hanya memasukkan alamat ip dan nomor port dan mengirimkannya ke API. Anda tidak peduli dengan semua detail kabel, sinyal, format pesan, dan kegagalan.

7
C. Ross

Abstraksi hanyalah versi pemrograman teorema.

Anda memiliki sistem formal, Anda mengusulkan pemikiran tentang sistem itu. Anda melakukan pembuktian, dan jika berhasil, maka Anda memiliki teorema. Mengetahui bahwa teorema Anda berlaku, Anda dapat menggunakannya dalam bukti lebih lanjut tentang sistem. Primitif yang disediakan oleh sistem (seperti jika pernyataan dan tipe nilai int) biasanya akan dilihat sebagai aksioma, meskipun itu tidak sepenuhnya benar karena apa pun yang bukan instruksi CPU yang ditulis dalam kode mesin adalah semacam abstraksi.

Dalam pemrograman fungsional, ide program sebagai pernyataan matematis sangat kuat, dan seringkali sistem tipe (dalam bahasa yang diketik dengan statis seperti Haskell, F #, atau OCAML) dapat digunakan untuk menguji teorema melalui bukti.

Sebagai contoh: katakanlah kita memiliki pemeriksaan penjumlahan dan persamaan sebagai operasi primitif, dan bilangan bulat dan boolean sebagai tipe data primitif. Ini adalah aksioma kita. Jadi kita bisa mengatakan itu 1 + 3 == 2 + 2 adalah teorema, lalu gunakan aturan penjumlahan dan bilangan bulat dan kesetaraan untuk melihat apakah itu pernyataan yang benar.

Sekarang mari kita anggap kita menginginkan multiplikasi, dan primitif kita (demi singkatnya) termasuk konstruksi perulangan dan sarana untuk menetapkan referensi simbolik. Kami bisa menyarankan itu

ref x (*) y := loop y times {x +}) 0

Saya akan berpura-pura membuktikannya, menunjukkan bahwa multiplikasi berlaku. Sekarang saya dapat menggunakan perkalian untuk melakukan lebih banyak hal dengan sistem saya (bahasa pemrograman).

Saya juga dapat memeriksa sistem tipe saya. (*) memiliki tipe int -> int -> int. Dibutuhkan 2 int dan menghasilkan int. Selain itu memiliki jenis int -> int -> int sehingga 0 + (istirahat) berlaku selama (istirahat) menghasilkan int. Loop saya bisa melakukan segala macam hal, tapi saya katakan ini menampilkan rangkaian fungsi yang telah dikeringkan sehingga (x + (x + (x ... + 0))) adalah hasilnya. Bentuk rantai tambahan itu hanya (int -> (int -> (int ... -> int))) jadi saya tahu hasil akhir saya akan menjadi int. Jadi sistem tipe saya memegang hasil bukti saya yang lain!

Tambahkan ide semacam ini selama bertahun-tahun, banyak programmer, dan banyak baris kode, dan Anda memiliki bahasa pemrograman modern: seperangkat primitif dan perpustakaan besar abstraksi kode "terbukti".

7
CodexArcanum

Anda mendapatkan jawaban yang bagus di sini. Saya hanya akan mengingatkan - orang berpikir abstraksi adalah sesuatu yang luar biasa yang perlu diletakkan di atas tumpuan, dan Anda tidak bisa mendapatkan cukup. Bukan itu. Itu hanya akal sehat. Itu hanya mengenali kesamaan antara berbagai hal, sehingga Anda dapat menerapkan solusi masalah ke sejumlah masalah.

Izinkan saya kencing ...

Yang paling tinggi dalam daftar gangguan saya adalah ketika orang berbicara tentang "lapisan abstraksi" seolah itu adalah hal yang baik. Mereka membuat "pembungkus" di sekitar kelas atau rutinitas yang tidak mereka sukai, dan menyebutnya "lebih abstrak", seolah-olah itu akan membuat mereka lebih baik. Ingat dongeng "Putri dan Kacang"? Sang putri begitu lembut sehingga jika ada kacang di bawah kasurnya, dia tidak akan bisa tidur, dan menambahkan lebih banyak lapisan kasur tidak akan membantu. Gagasan bahwa menambahkan lebih banyak lapisan "abstraksi" akan membantu begitu saja - biasanya tidak. Ini hanya berarti bahwa setiap perubahan pada entitas dasar harus diubah melalui beberapa lapisan kode.

4
Mike Dunlavey

Saya pikir Anda mungkin menemukan posting blog saya pada abstraksi bocor berguna. Inilah latar belakang yang relevan:

Abstraksi adalah mekanisme untuk membantu mengambil apa yang umum di antara sekumpulan fragmen program terkait, menghilangkan perbedaannya, dan memungkinkan programmer untuk bekerja langsung dengan konstruk yang mewakili konsep abstrak itu. Konstruk baru ini (secara virtual) selalu memiliki parameterisasi : sarana untuk menyesuaikan penggunaan konstruk agar sesuai dengan kebutuhan spesifik Anda.

Sebagai contoh, kelas List dapat mengabstraksi detail dari implementasi linked-list - di mana alih-alih berpikir dalam memanipulasi next dan previous pointer, Anda dapat berpikir pada tingkat menambah atau menghapus nilai ke urutan. Abstraksi adalah alat penting untuk membuat fitur yang berguna, kaya, dan kadang-kadang rumit dari serangkaian konsep yang lebih primitif yang jauh lebih kecil.

Abstraksi terkait dengan enkapsulasi dan modularitas, dan konsep-konsep ini sering disalahpahami.

Dalam contoh List, enkapsulasi dapat digunakan untuk menyembunyikan detail implementasi dari daftar tertaut; dalam bahasa berorientasi objek, misalnya, Anda dapat menjadikan pointer next dan previous pribadi, di mana hanya implementasi Daftar yang diizinkan mengakses bidang ini.

Enkapsulasi tidak cukup untuk abstraksi, karena itu tidak selalu berarti Anda memiliki konsepsi konstruksi yang baru atau berbeda. Jika semua kelas List lakukan adalah memberi Anda 'getNext'/'setNext' metode aksesor gaya, itu akan merangkum dari Anda dari detail implementasi (misalnya, apakah Anda menyebutkan nama bidang 'prev' atau 'previous'? apa jenis statisnya?), tetapi ia akan memiliki tingkat abstraksi yang sangat rendah.

Modularitas berkaitan dengan penyembunyian informasi : Properti stabil ditentukan dalam antarmuka , dan modul mengimplementasikan antarmuka itu, menjaga semua detail implementasi dalam modul. Modularitas membantu programmer mengatasi perubahan, karena modul lain hanya bergantung pada antarmuka yang stabil.

Penyembunyian informasi dibantu oleh enkapsulasi (sehingga kode Anda tidak bergantung pada detail implementasi yang tidak stabil), tetapi enkapsulasi tidak diperlukan untuk modularitas. Misalnya, Anda dapat mengimplementasikan struktur List di C, mengekspos pointer 'next' dan 'prev' ke dunia, tetapi juga menyediakan antarmuka, yang berisi initList(), addToList(), dan removeFromList() fungsi. Asalkan aturan antarmuka diikuti, Anda dapat membuat jaminan bahwa properti tertentu akan selalu dipegang, seperti memastikan struktur data selalu dalam keadaan valid. [Makalah klasik Parnas tentang modularitas, misalnya, ditulis dengan sebuah contoh di Majelis. Antarmuka adalah kontrak dan bentuk komunikasi tentang desain, tidak harus harus diperiksa secara mekanis, meskipun itulah yang kami andalkan saat ini.]

Meskipun istilah seperti abstrak, modular, dan dikemas digunakan sebagai deskripsi desain positif, penting untuk menyadari bahwa kehadiran salah satu dari kualitas ini tidak secara otomatis memberi Anda desain yang baik:

  • Jika suatu algoritma n ^ 3 "dienkapsulasi dengan baik", ia akan tetap bekerja lebih buruk daripada algoritma n log n yang ditingkatkan.

  • Jika sebuah antarmuka berkomitmen untuk sistem operasi tertentu, tidak ada satu pun manfaat dari desain modular yang akan terwujud ketika, katakanlah, sebuah gim video perlu diangkut dari Windows ke iPad.

  • Jika abstraksi yang dibuat mengekspos terlalu banyak detail yang tidak penting, itu akan gagal untuk membuat konstruksi baru dengan operasinya sendiri: Ini hanya akan menjadi nama lain untuk hal yang sama.

4
Macneil

Apakah jawaban Wikipedia cukup baik? http://en.wikipedia.org/wiki/Abstraction_%28programming%29

Dalam ilmu komputer, mekanisme dan praktik abstraksi mengurangi dan memfaktorkan perincian sehingga seseorang dapat fokus pada beberapa konsep sekaligus.

4
John Fisher

Secara matematis, "integer" adalah abstraksi. Dan ketika Anda melakukan bukti formal seperti itu x + y = y + x untuk semua bilangan bulat, Anda bekerja dengan "bilangan bulat" abstraksi daripada angka-angka spesifik seperti 3 atau 4. Hal yang sama terjadi dalam pengembangan perangkat lunak ketika Anda berinteraksi dengan mesin pada tingkat di atas register dan lokasi memori. Anda dapat memikirkan pikiran yang lebih kuat pada tingkat yang lebih abstrak, dalam banyak kasus.

4
Kate Gregory

Sebagai cara untuk menjelaskannya kepada orang lain saya akan pergi sebaliknya, dari hasil belakang:

Abstraksi dalam pemrograman komputer adalah tindakan menggeneralisasi sesuatu ke titik bahwa lebih dari satu hal yang sama dapat secara umum diperlakukan sama dan ditangani sama.

Jika Anda ingin memperluas yang dapat Anda tambahkan:

Kadang-kadang ini dilakukan untuk mencapai perilaku polimorfik (antarmuka dan pewarisan) untuk mengurangi kode berulang di muka, di lain waktu itu dilakukan sehingga pekerjaan dalam sesuatu dapat diganti di masa depan dengan solusi yang sama tanpa harus mengubah kode di sisi lain dari wadah abstrak atau pembungkus, mudah-mudahan mengurangi pengerjaan ulang di masa depan.

Selain itu, saya pikir Anda harus mulai dengan contoh ...

2
Bill

Abstraksi adalah ketika Anda mengabaikan detail yang dianggap tidak relevan untuk yang dianggap relevan.

Abstraksi meliputi enkapsulasi, penyembunyian informasi, dan generalisasi. Itu tidak mencakup analogi, metafora, atau heuristik.

Formalisme matematika apa pun untuk konsep abstraksi akan dengan sendirinya be abstraksi, karena hal itu tentu memerlukan hal yang mendasarinya untuk diabstraksi menjadi seperangkat sifat matematika! Gagasan kategori-teori tentang morfisme mungkin paling dekat dengan apa yang Anda cari.

Abstraksi bukanlah sesuatu yang Anda nyatakan, itu adalah sesuatu yang Anda lakukan .

2
Steven A. Lowe

Oke, saya pikir saya sudah tahu apa yang Anda tanyakan: "Apa definisi matematis yang ketat tentang 'Abstraksi.'"

Jika itu masalahnya, saya pikir Anda kurang beruntung - 'abstraksi' adalah istilah arsitektur/desain perangkat lunak, dan tidak memiliki dukungan matematis sejauh yang saya ketahui (mungkin seseorang yang lebih berpengalaman dalam CS teoretis akan memperbaiki saya di sini), lebih dari "kopling" atau "menyembunyikan informasi" memiliki definisi matematika.

2
Fishtoaster

Saya selalu menganggap abstraksi dalam pemrograman sebagai menyembunyikan detail dan menyediakan antarmuka yang disederhanakan. Ini adalah alasan utama pemrogram dapat memecah tugas monumental menjadi bagian-bagian yang dapat dikelola. Dengan abstraksi, Anda dapat membuat solusi untuk bagian dari masalah, termasuk semua detail kasar, dan kemudian menyediakan antarmuka sederhana untuk menggunakan solusi. Maka Anda bisa "lupa" tentang detailnya. Ini penting karena tidak mungkin seseorang dapat menyimpan semua detail dari sistem yang super kompleks dalam pikiran mereka sekaligus. Ini bukan untuk mengatakan bahwa rincian di bawah abstraksi tidak akan pernah harus ditinjau kembali, tetapi untuk saat ini, hanya antarmuka yang harus diingat.

Dalam pemrograman, antarmuka yang disederhanakan ini dapat berupa apa saja dari variabel (mengabstraksi sekelompok bit dan menyediakan antarmuka matematis yang lebih sederhana) ke suatu fungsi (mengabstraksi sejumlah pemrosesan menjadi panggilan baris tunggal) ke kelas dan seterusnya.

Pada akhirnya, tugas utama pemrogram adalah biasanya mengabstraksi semua detail komputasi dan menyediakan antarmuka sederhana seperti GUI yang dapat digunakan oleh seseorang yang tidak mengetahui satu hal tentang cara kerja komputer.

Beberapa keuntungan dari abstraksi adalah:

  • Memungkinkan masalah besar untuk dipecah menjadi bagian-bagian yang bisa dikelola. Saat menambahkan catatan seseorang ke database, Anda tidak ingin harus mengacaukan memasukkan dan menyeimbangkan pohon indeks pada database. Pekerjaan ini mungkin telah dilakukan di beberapa titik, tetapi sekarang telah diabstraksi dan Anda tidak perlu lagi khawatir tentang hal itu.

  • Memungkinkan beberapa orang bekerja sama dengan baik dalam suatu proyek. Saya tidak ingin harus mengetahui seluk beluk kode rekan saya. Saya hanya ingin tahu bagaimana menggunakannya, apa fungsinya, dan bagaimana memasangnya bersama dengan pekerjaan saya (antarmuka).

  • Mengizinkan orang yang tidak memiliki pengetahuan yang diperlukan untuk melakukan tugas yang rumit untuk melakukannya. Ibuku dapat memperbarui facebook-nya dan orang-orang yang dia kenal di seluruh negeri dapat melihatnya. Tanpa abstraksi dari sistem yang sangat rumit ke antarmuka web yang sederhana, tidak ada cara dia akan dapat mulai melakukan sesuatu yang serupa (tidak akan saya dalam hal ini).

Abstraksi dapat, bagaimanapun, memiliki efek sebaliknya dari membuat hal-hal menjadi kurang dapat dikelola jika terlalu sering digunakan. Dengan memecah masalah menjadi potongan-potongan kecil terlalu banyak, jumlah antarmuka yang harus Anda ingat meningkat dan semakin sulit untuk memahami apa yang sebenarnya terjadi. Seperti kebanyakan hal, keseimbangan harus ditemukan.

1
Jason B

Salah satu cara saya mencoba menggambarkannya kepada orang lain, mungkin bukan cara terbaik

Pertimbangkan Program yang menambahkan 2 + 2 dan output 4

Pertimbangkan sebuah program yang menambahkan input dua angka oleh pengguna, x + y = z

Mana yang lebih bermanfaat dan umum?

1

Saya berpendapat bahwa abstraksi adalah sesuatu yang menyembunyikan detail yang tidak perlu. Salah satu unit abstraksi paling dasar adalah prosedurnya. Misalnya, saya tidak ingin khawatir tentang bagaimana saya menyimpan data ke database ketika saya membaca data itu dari file. Jadi saya membuat fungsi save_to_database.

Abstraksi juga dapat disatukan untuk membentuk abstraksi yang lebih besar. Misalnya, fungsi dapat disatukan dalam kelas, kelas dapat disatukan untuk membentuk suatu program, program dapat disatukan untuk membentuk sistem terdistribusi, dll.

1
Jason Baker

Ini adalah sesuatu yang saya sebenarnya ingin blog tentang untuk waktu yang lebih lama, tetapi saya tidak pernah mendapatkannya. Untungnya, saya adalah zombie rep dan bahkan ada hadiah. Posting saya agak panjang , tapi intinya:

Abstraksi dalam pemrograman adalah tentang memahami esensi suatu objek dalam konteks yang diberikan.

[...]

Abstraksi tidak hanya keliru dengan generalisasi, tetapi juga dengan enkapsulasi, tetapi ini adalah dua bagian ortogonal dari penyembunyian informasi: Modul layanan memutuskan apa yang ingin ditampilkan dan modul klien memutuskan apa yang ingin dilihat. Enkapsulasi adalah bagian pertama dan abstraksi yang terakhir. Hanya keduanya yang merupakan informasi lengkap yang disembunyikan.

Semoga itu bisa membantu.

1
back2dos

Tingkat tipuan ekstra.

Anda tidak ingin peduli apakah objek yang Anda gunakan adalah Cat atau Dog, jadi Anda harus melalui tabel fungsi virtual untuk menemukan makeNoise() yang tepat fungsi.

Saya yakin ini dapat diterapkan pada level 'lebih rendah' ​​dan 'lebih tinggi' - pikirkan seorang kompiler yang mencari instruksi yang tepat untuk digunakan untuk prosesor yang diberikan atau abstrak Monad yang dilakukan Haskell atas efek komputasi dengan memanggil semuanya return dan >>=.

1
yatima2975

Anda mungkin ingin memeriksa beberapa metrik Bob Martin

http://en.wikipedia.org/wiki/Software_package_metrics

Yang mengatakan, saya tidak berpikir "abstraknya" nya sama dengan Anda. Nya lebih merupakan ukuran "kurangnya implementasi pada kelas" yang berarti penggunaan antarmuka/kelas abstrak. Ketidakstabilan dan Jarak dari Urutan Utama mungkin lebih berperan dalam apa yang Anda cari.

1
MIA

Abstraksi mewakili sesuatu (mis. Konsep, struktur data, fungsi) dalam hal yang lain. Misalnya kita menggunakan kata-kata untuk berkomunikasi. Word adalah entitas abstrak yang dapat direpresentasikan dalam bentuk bunyi (ucapan) atau dalam hal simbol grafis (tulisan). Gagasan kunci dari abstraksi adalah bahwa entitas yang dimaksud berbeda dari representasi yang mendasarinya, seperti halnya Word bukanlah bunyi yang digunakan untuk mengucapkannya atau huruf yang digunakan untuk menulisnya.

Dengan demikian, setidaknya dalam teori, representasi yang mendasari suatu abstraksi dapat digantikan oleh representasi yang berbeda. Namun dalam praktiknya, abstraksi jarang sepenuhnya berbeda dari representasi yang mendasarinya, dan terkadang representasi " kebocoran " sampai. Misalnya, ucapan membawa nada emosi yang sangat sulit disampaikan secara tertulis. Karena ini, rekaman audio dan transkrip dengan kata-kata yang sama mungkin memiliki efek yang sangat berbeda pada audiens. Dengan kata lain abstraksi kata sering bocor.

Abstraksi biasanya berlapis-lapis. Kata-kata adalah abstraksi yang dapat direpresentasikan dengan huruf, yang pada gilirannya juga merupakan abstraksi suara, yang pada gilirannya adalah abstraksi dari pola gerak partikel-partikel udara yang diciptakan oleh pita suara seseorang dan dideteksi oleh gendang telinga seseorang. .

Dalam ilmu komputer, bit biasanya adalah tingkat representasi terendah. Bytes, lokasi memori, instruksi perakitan, dan register CPU adalah level berikutnya dari abstraksi. Kemudian kami memiliki tipe data primitif dan instruksi dari bahasa tingkat yang lebih tinggi, yang diimplementasikan dalam bentuk byte, lokasi memori, dan instruksi Assembly. Kemudian fungsi dan kelas (dengan asumsi OO bahasa) yang diimplementasikan dalam hal tipe data primitif dan dibangun dalam instruksi bahasa. Kemudian fungsi dan kelas yang lebih kompleks diimplementasikan dalam hal yang lebih sederhana. fungsi-fungsi dan kelas-kelas ini mengimplementasikan struktur data, seperti daftar, tumpukan, antrian, dll. Yang pada gilirannya digunakan untuk mewakili entitas yang lebih spesifik seperti antrian proses, atau daftar karyawan, atau tabel hash judul buku. Dalam skema ini, setiap level adalah abstraksi sehubungan dengan pendahulunya.

1
Dima

Merriam-webster mendefinisikan abstrak sebagai kata sifat: dipisahkan dari contoh spesifik apa pun.

Abstraksi adalah model dari beberapa sistem. Mereka sering membuat daftar kelompok asumsi yang harus dipenuhi untuk sistem nyata untuk dapat dimodelkan oleh abstraksi, dan mereka sering digunakan untuk memungkinkan kita untuk membuat konsep sistem yang semakin rumit. Beralih dari sistem nyata ke abstraksi tidak memiliki metode matematika formal untuk melakukannya. Terserah penilaian siapa pun yang mendefinisikan abstraksi, dan apa tujuan abstraksi itu.

Namun sering kali, abstraksi didefinisikan dalam bentuk konstruksi matematika. Itu mungkin karena mereka begitu sering digunakan dalam sains dan teknik.

Contohnya adalah mekanika Newton. Itu mengasumsikan semuanya sangat kecil, dan semua energi dilestarikan. Interaksi antara objek didefinisikan dengan jelas oleh rumus matematika. Sekarang, seperti yang kita tahu, alam semesta tidak bekerja seperti itu, dan dalam banyak situasi abstraksi bocor. Tetapi dalam banyak situasi, ini bekerja dengan sangat baik.

Model abstrak lainnya adalah elemen rangkaian linier tipikal, resistor, kapasitor, dan induktor. Sekali lagi interaksi didefinisikan dengan jelas oleh rumus matematika. Untuk sirkuit frekuensi rendah, atau driver relai sederhana, dan hal lainnya, analisis RLC bekerja dengan baik dan memberikan hasil yang sangat baik. Tetapi situasi lain, seperti sirkuit radio gelombang mikro, unsur-unsurnya terlalu besar, dan interaksinya lebih halus, dan abstraksi RLC sederhana tidak bertahan. Apa yang harus dilakukan pada saat itu tergantung pada penilaian insinyur. Beberapa insinyur telah menciptakan abstraksi lain di atas yang lain, beberapa mengganti op-amp ideal dengan rumus matematika baru untuk bagaimana mereka bekerja, yang lain mengganti op amp ideal dengan op-amp nyata yang disimulasikan, yang pada gilirannya disimulasikan dengan jaringan kompleks yang lebih kecil. elemen ideal.

Seperti yang dikatakan orang lain, ini adalah model yang disederhanakan. Ini adalah alat yang digunakan untuk lebih memahami sistem yang kompleks.

1
whatsisname

Pemrograman abstraksi adalah abstraksi yang dilakukan oleh seseorang pada elemen pemrograman. Katakanlah Anda tahu bagaimana membangun Menu dengan item dan barang-barangnya. Kemudian seseorang melihat potongan kode itu dan berpikir, hei itu bisa berguna dalam jenis lain seperti struktur sewaan, dan mendefinisikan Pola Desain Komponen dengan merupakan abstraksi dari potongan kode pertama.

Pola Desain Berorientasi Objek adalah contoh yang sangat baik dari apa itu abstraksi, dan saya tidak bermaksud implementasi nyata tetapi cara kita harus mendekati solusi.

Jadi, singkatnya, pemrograman abstraksi adalah pendekatan yang memungkinkan kita memahami masalah, itu adalah sarana untuk mendapatkan sesuatu tetapi itu bukan hal yang nyata

0
guiman

Bagi saya abstraksi adalah sesuatu yang tidak ada "secara harfiah", itu seperti ide. Jika Anda mengekspresikannya secara matematis, itu tidak abstrak lagi karena matematika adalah bahasa untuk mengekspresikan apa yang terjadi di otak Anda sehingga dapat dipahami oleh otak orang lain, sehingga Anda tidak dapat menyusun ide-ide Anda, karena jika Anda melakukannya, itu bukan ide lagi: Anda perlu memahami bagaimana otak bekerja untuk mengekspresikan model ide.

Abstraksi adalah sesuatu yang memungkinkan Anda untuk menafsirkan realitas menjadi sesuatu yang dapat terlepas dari itu. Anda bisa mengabstraksi pantai dan mimpi, tetapi pantai itu ada tetapi mimpi itu tidak. Tapi Anda bisa mengatakan keduanya ada, tetapi itu tidak benar.

Hal tersulit dalam abstraksi adalah menemukan cara untuk mengekspresikannya sehingga orang lain dapat memahaminya sehingga dapat berubah menjadi kenyataan. Itu pekerjaan terberat, dan itu tidak bisa dilakukan sendiri: Anda harus menemukan model relatif yang bekerja pada ide-ide Anda dan itu bisa dipahami oleh orang lain.

Bagi saya abstraksi dalam bahasa komputer haruslah nama "matematika" model, ini tentang menggunakan kembali ide yang dapat dikomunikasikan, dan itu merupakan kendala yang sangat besar dibandingkan dengan apa yang dapat dicapai secara abstrak.

Sederhananya, atom berada di sebelah satu sama lain, tetapi mereka tidak peduli. Seperangkat molekul besar yang diorganisasikan menjadi manusia dapat memahami bahwa ia berada di samping seseorang, tetapi tidak dapat memahami caranya, hanya bagaimana atom memposisikan diri dalam suatu pola.

Satu objek yang diperintah oleh suatu konsep, secara umum, tidak dapat "memahami" dirinya sendiri. Itu sebabnya kami mencoba untuk percaya pada tuhan dan mengapa kami kesulitan memahami otak kami.

Bisakah saya mendapatkan medali saya sekarang?

0
jokoon

Di sini, jawaban yang tidak matematis:

Mengurangkan dalam pemrograman berpura-pura Anda tidak peduli dengan detailnya sekarang, padahal sebenarnya Anda melakukannya dan Anda harus peduli tentang hal itu setiap saat. Itu pada dasarnya berpura-pura.

0
mojuba

Pertanyaan menarik. Saya tidak tahu satu definisi abstraksi yang dianggap otoritatif ketika datang ke pemrograman. Padahal orang lain telah memberikan tautan ke beberapa definisi dari berbagai cabang teori CS atau matematika; Saya suka memikirkannya dengan cara yang mirip dengan "supervenience" lihat http://en.wikipedia.org/wiki/Supervenience

Ketika kita berbicara tentang abstraksi dalam pemrograman, kita pada dasarnya membandingkan dua deskripsi dari suatu sistem. Kode Anda adalah deskripsi suatu program. Abstraksi kode Anda juga akan menjadi deskripsi program itu tetapi pada tingkat "lebih tinggi". Tentu saja Anda bisa memiliki abstraksi tingkat yang lebih tinggi dari abstraksi asli Anda (mis. Deskripsi program dalam arsitektur sistem tingkat tinggi vs. deskripsi dari program dalam desain terperinci).

Sekarang apa yang membuat satu deskripsi "lebih tinggi" daripada yang lain. Kuncinya adalah "multiple realizability" - abstraksi program Anda dapat diwujudkan dengan berbagai cara dalam banyak bahasa. Sekarang Anda dapat mengatakan bahwa seseorang dapat menghasilkan beberapa desain untuk satu program juga - dua orang dapat menghasilkan dua desain tingkat tinggi yang berbeda yang keduanya secara akurat menggambarkan program. Kesetaraan realisasi membuat perbedaan.

Ketika membandingkan program atau desain, Anda harus melakukannya dengan cara yang memungkinkan Anda mengidentifikasi properti kunci dari deskripsi di tingkat itu. Anda dapat masuk ke cara rumit untuk mengatakan suatu desain setara dengan yang lain, tetapi cara termudah untuk memikirkannya adalah ini - dapatkah satu program biner memenuhi batasan kedua deskripsi?

Jadi apa yang membuat satu tingkat deskripsi lebih tinggi dari yang lain? Katakanlah kita memiliki satu tingkat deskripsi A (mis. Dokumen desain) dan tingkat deskripsi B lainnya (mis. Kode sumber). A adalah level yang lebih tinggi daripada B karena jika A1 dan A2 adalah dua deskripsi yang tidak setara pada level A, maka realisasi dari deskripsi tersebut, B1 dan B2 harus juga menjadi non-setara di level B. Namun, kebalikannya tidak selalu berlaku.

Jadi jika saya tidak dapat menghasilkan program biner tunggal yang memenuhi dua dokumen desain yang berbeda (yaitu kendala desain tersebut akan saling bertentangan), maka kode sumber yang mengimplementasikan desain tersebut harus berbeda. Tetapi di sisi lain, jika saya mengambil dua set kode sumber yang tidak mungkin dikompilasi ke dalam program biner yang sama, itu masih bisa menjadi kasus bahwa biner yang dihasilkan dari kompilasi dua set kode sumber keduanya memenuhi desain yang sama dokumen. Jadi dokumen desain adalah "abstraksi" dari kode sumber.

0
wahbedahbe