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 nyata dari abstraksi?
terminology
abstraction
mlvljr
sumber
sumber
Jawaban:
Jawaban untuk "Bisakah Anda menentukan apa abstraksi pemrograman lebih atau kurang 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 spesifik 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 atas 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 barang 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 sesuatu yang lebih spesifik - itu '
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 bisa mengkategorikannya 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 di atas konsep abstraksi dan keluarga atau kelompok mereka. Good OOP berarti memilih abstraksi yang baik pada tingkat detail yang sesuai yang masuk akal dalam domain program Anda dan jangan "bocor". Yang pertama berarti bahwa mengklasifikasikan mouse sebagai objek yang tidak akan berguling pada bidang miring tidak masuk akal untuk aplikasi yang menginventarisasi peralatan komputer, tetapi mungkin masuk akal untuk simulator fisika. Yang terakhir berarti bahwa Anda harus mencoba untuk menghindari "bertinju sendiri" ke hierarki yang tidak masuk akal untuk beberapa jenis objek. Misalnya, dalam hierarki saya di atas, apakah kami yakin itu semuaperipheral komputer didukung oleh listrik? Bagaimana dengan stylus? Jika kita ingin mengelompokkan stylus ke dalam kategori "periferal", kita akan memiliki masalah, karena itu tidak menggunakan listrik, dan kami mendefinisikan periferal komputer sebagai objek yang menggunakan listrik. Masalah lingkaran-elips adalah contoh paling terkenal dari teka-teki ini.
sumber
Saya pasti tidak setuju dengan sebagian besar jawaban.
Ini jawaban saya:
Ini dari teori interpretasi abstrak dari program komputer, yang biasanya merupakan pendekatan analisis statis hingga saat ini.
sumber
Abstraksi lebih fokus
What
dan kurang padaHow
. 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:
Mobil menyembunyikan semua mekanismenya tetapi menyediakan cara untuk mengemudi, mengisi bahan bakar dan mempertahankannya untuk pemiliknya.
API apa pun menyembunyikan semua detail implementasi yang menyediakan layanan untuk programmer lain.
Kelas di OOP menyembunyikan anggota privasinya dan implementasi anggota publik yang menyediakan layanan untuk memanggil anggota publik.
Saat menggunakan objek jenis
Interface
atauabstract class
di Java atau C ++, implementasi sebenarnya disembunyikan. Dan tidak hanya tersembunyi, implementasi metode yang dideklarasikan dalamInterface
juga cenderung berbeda di berbagai kelas yang diimplementasikan / diwariskan. Tetapi karena Anda mendapatkan layanan yang sama, jangan gangguHow
itu diterapkan dan tepatWho
/What
menyediakan layanan.Menyembunyikan Identitas : 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.
sumber
How
selalu membantu untuk memahamiWhat
s. Jadi, bisa dicampur dengan abstraksi.Abstraksi pemrograman adalah model masalah yang disederhanakan .
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.
sumber
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 secara statis dan kuat seperti Haskell, F #, atau OCAML) dapat digunakan untuk menguji teorema melalui bukti.
Misalnya: katakanlah kami memiliki pemeriksaan penjumlahan dan persamaan sebagai operasi primitif, dan bilangan bulat dan boolean sebagai tipe data primitif. Ini adalah aksioma kita. Jadi kita dapat mengatakan bahwa itu
1 + 3 == 2 + 2
adalah teorema, kemudian 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
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 itu menghasilkan 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 menahan 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".
sumber
Apakah jawaban Wikipedia cukup baik? http://en.wikipedia.org/wiki/Abstraction_%28programming%29
sumber
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. Dalam kebanyakan kasus, Anda dapat memikirkan pikiran yang lebih kuat pada tingkat yang lebih abstrak.
sumber
IInt add(IInt a, IInt b);
subrutin dalam program di mana Anda tahu sebelumnya itua
danb
akan, katakanInt128: IInt
contoh yang kurang lebih baik? --yaitu Anda memiliki bagian kode Anda melakukan apa yang seharusnya dilakukan, mengetahui (dapat membuktikan) itu akan melakukan hal yang Anda butuhkan dan pada saat yang sama (dan di sisi lain) Anda membuatnya melakukan persis hal-hal yang Anda butuhkan tanpa pernah menyadarinya (dengan kemampuan untuk menggunakan hal itu dalam konteks lain juga)?add(int, int)
subrutin / fungsi. Ini akan cukup untuk memilikinya hanyareturn 2 + 3;
dalam kasus ini. Dan mengapa Anda harus menggunakan rutin yang lebih "universal" (denganreturn a + b;
beroperasi pada parameter aktuala
dan yangb
disediakan, dan dengan demikian benar - benar abstrak dari nilai-nilai mereka) - itu adalah pertanyaan (retorika) saya di atas. Semoga ini menjadi sedikit lebih jelas sekarang.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 hal-hal, sehingga Anda dapat menerapkan solusi masalah untuk berbagai masalah.
Izinkan saya kencing ...
Yang paling tinggi dalam daftar gangguan saya adalah ketika orang berbicara tentang "lapisan abstraksi" seolah-olah itu 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.
sumber
Saya pikir Anda mungkin menemukan posting blog saya tentang abstraksi bocor bermanfaat. Inilah latar belakang yang relevan:
Abstraksi adalah mekanisme untuk membantu mengambil apa yang umum di antara seperangkat fragmen program terkait, menghilangkan perbedaan mereka, dan memungkinkan programmer untuk bekerja secara 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, sebuah
List
kelas dapat mengabstraksi detail dari implementasi linked-list - di mana alih-alih berpikir dalam hal memanipulasinext
danprevious
pointer, Anda dapat berpikir pada tingkat menambahkan atau menghapus nilai ke urutan. Abstraksi adalah alat penting untuk membuat fitur yang berguna, kaya, dan terkadang rumit dari serangkaian konsep yang lebih primitif.Abstraksi terkait dengan enkapsulasi dan modularitas, dan konsep-konsep ini sering disalahpahami.
Dalam
List
contoh tersebut, enkapsulasi dapat digunakan untuk menyembunyikan detail implementasi dari daftar tertaut; dalam bahasa berorientasi objek, misalnya, Anda dapat membuatnext
dan menunjukprevious
pribadi, di mana hanya implementasi Daftar yang diizinkan mengakses bidang ini.Enkapsulasi tidak cukup untuk abstraksi, karena itu tidak selalu menyiratkan Anda memiliki konsepsi konstruksi yang baru atau berbeda. Jika semua
List
kelas lakukan adalah memberikan 'getNext
'/'setNext
' gaya pengakses metode, itu akan merangkum dari Anda dari rincian implementasi (misalnya, apakah Anda nama lapangan 'prev
' atau 'previous
'? Apa jenis statis?), Tetapi 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 pemrogram 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 menerapkan
List
struktur dalam C, mengekspos 'next
' dan 'prev
' pointer ke dunia, tetapi juga menyediakan sebuah antarmuka, mengandunginitList()
,addToList()
danremoveFromList()
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 dalam kumpulan. 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", itu masih akan berkinerja 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 permainan 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.
sumber
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.
sumber
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 matematis apa pun untuk konsep abstraksi itu sendiri akan menjadi 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 .
sumber
Sebagai cara untuk menjelaskannya kepada orang lain saya akan pergi sebaliknya, dari hasil belakang:
Jika Anda ingin memperluas yang dapat Anda tambahkan:
Selain itu, saya pikir Anda harus mulai dengan contoh ...
sumber
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.
sumber
Merriam-webster mendefinisikan abstrak sebagai kata sifat: dipisahkan dari contoh tertentu.
Abstraksi adalah model dari beberapa sistem. Mereka sering membuat daftar asumsi yang harus dipenuhi untuk sistem nyata agar dapat dimodelkan oleh abstraksi, dan mereka sering digunakan untuk memungkinkan kita 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.
sumber
Employer
asumsi tentangEmployee
).Abstraksi mewakili sesuatu (misalnya konsep, struktur data, fungsi) dalam hal yang lain. Misalnya kita menggunakan kata-kata untuk berkomunikasi. Kata 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, sama seperti sebuah kata 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 " bocor ". Misalnya, ucapan membawa nada emosional 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 perakitan. Kemudian fungsi dan kelas (dengan asumsi bahasa OO) yang diimplementasikan dalam hal tipe data primitif dan instruksi bahasa built in. Kemudian fungsi dan kelas yang lebih kompleks diimplementasikan dalam hal yang lebih sederhana. Beberapa fungsi dan kelas ini menerapkan 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 .
sumber
int
kurang dari (MAX_INT_SIZE / 2-1) dan mengembalikan satu lagi yang dua kali lebih banyak:int f(int a) { return a*2; }
2. "penangan" dengan prototipevoid (*) (void)
dipanggil ketika ... uhmm itu harus dipanggil sesuai dengan kontrak si penelepon - keduanya mewakili abstraksi (1 - atas rincian implementasinya (yang telah kami berikan, tetapi tidak akan dapat diakses oleh mereka yang tidak memiliki akses ke kode sumber), 2 - atas apa yang sebenarnya ditangani oleh pawang tidak (perhatikan, bahwa ini diketahui oleh orang yang telah menugaskan pawang)) dan tidak bocorSalah 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?
sumber
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.
sumber
save_to_database
tidak perlu khawatir tentang bagaimana tepatnya data disimpan, selama / karena Anda telah memilih implementasi yang Anda butuhkan ! Yaitu akan ada tempat untuk memberikan detail (abstrak "relatif" untuk beberapa bagian kode), hanya masalah memilihnya secara bijaksana - menyediakan "perubahan pikiran" yang lebih mudah, dll.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 memberikan 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 disarikan 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.
sumber
Tingkat tipuan ekstra.
Anda tidak ingin peduli apakah objek yang Anda gunakan adalah a
Cat
atau aDog
, jadi Anda harus melalui tabel fungsi virtual untuk menemukanmakeNoise()
fungsi yang tepat .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
Monad
abstrak Haskell atas efek komputasi dengan memanggil semuanyareturn
dan>>=
.sumber
Ini adalah sesuatu yang saya benar-benar ingin blog tentang untuk waktu yang lebih lama, tetapi saya tidak pernah melakukannya. Untungnya, saya adalah zombie rep dan bahkan ada hadiah. Posting saya agak panjang , tapi ini intinya:
[...]
Semoga itu bisa membantu.
sumber
Di sini, jawaban yang tidak matematis:
Mengurangkan diri dalam pemrograman adalah 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.
sumber
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 bisa independen darinya. 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-ide yang dapat dikomunikasikan, dan itu merupakan kendala yang sangat besar dibandingkan dengan apa yang dapat dicapai secara abstrak.
Sederhananya, atom berdekatan 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?
sumber
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 dapat memiliki abstraksi tingkat yang lebih tinggi dari abstraksi asli Anda (misalnya 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 realalizability" - abstraksi Anda dari program ini 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.
Saat 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 program biner tunggal memenuhi batasan kedua deskripsi?
Jadi apa yang membuat satu tingkat deskripsi lebih tinggi dari yang lain? Katakanlah kita memiliki satu tingkat deskripsi A (misalnya dokumen desain) dan tingkat deskripsi B lainnya (misalnya kode sumber). A adalah tingkat yang lebih tinggi daripada B karena jika A1 dan A2 adalah dua deskripsi non-setara di tingkat A, maka realisasi dari mereka deskripsi, B1 dan B2 harus juga menjadi non-setara di tingkat B. Namun, sebaliknya tidak selalu berlaku .
Jadi jika saya tidak dapat menghasilkan program biner tunggal yang memenuhi dua dokumen desain yang berbeda (yaitu kendala dari 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, 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.
sumber
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 cukup baik tentang 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
sumber