Apa itu abstraksi? [Tutup]


38

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?


..dan dipaksa untuk membuktikan bahwa saya bukan robot ketika memposting ini menunjukkan saya benar-benar meminta terlalu banyak :)
mlvljr

8
Apa yang Anda maksud dengan "secara matematis"? Saya tidak akan menganggap abstraksi sebagai konsep matematika.
Fishtoaster

2
@mlvljr: Maaf, saya masih tidak yakin saya ikuti. Abstraksi hanyalah praktik menyediakan cara yang lebih sederhana dalam berurusan dengan sesuatu. Saya tidak melihat bagaimana alat / metode formal ada hubungannya dengan itu.
Fishtoaster

1
@mlvljr, Apakah Anda ingin contoh matematika, atau matematika untuk mencakup semua ekstraksi pemrograman. Saya tidak berpikir yang terakhir ada.
C. Ross

8
Perhpas cstheory.stackexchange.com adalah tempat yang tepat untuk pertanyaan ini
Conrad Frix

Jawaban:


46

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.


2
Saya rasa saya melihat; Anda secara khusus berbicara tentang merujuk pada metode atau fungsi secara abstrak, yaitu berdasarkan kontraknya dan bukan penerapannya. Pernyataan Anda benar, dan ini adalah penggunaan istilah yang valid; pemanggilan metode adalah abstraksi dari beberapa perilaku konkret.
nlawalker

4
@nalkalker: Anda mencampur abstraksi dengan generalisasi. Mereka bukan hal yang sama. Yang Anda gambarkan adalah yang terakhir ('beralih dari ide tertentu ke ide yang lebih umum '). Abstraksi bergerak dari hal-hal konkret ke hal-hal abstrak, misalnya memiliki 7 kelereng biru dan 7 merah, dan mengatakan 'Saya memiliki dua set dengan jumlah kelereng berwarna sama': di sini saya bergerak dari benda konkret (kelereng) ke benda abstrak. (kelas dan set yang setara). BTW, bilangan alami n adalah kelas dari semua set kardinalitas n yang setara, non-lingkaran yang didefinisikan oleh pemetaan satu-ke-satu di antara set-set tersebut.
pembuat pil KB

33
Warna lemon, secara matematis, ringan dengan panjang gelombang sekitar 570 nm.
Erik

1
@Erik, aku akan menulis itu. Bah!
Gary Rowe

1
@Erik Itu fisika, bukan matematika :) Matematika tidak tahu apa-apa tentang konsep seperti "cahaya". Cahaya bersifat empiris; Matematika tidak.
Andres F.

25

Saya pasti tidak setuju dengan sebagian besar jawaban.

Ini jawaban saya:

Diberikan dua set G dan H, koneksi Galois (alfa, beta) dapat didefinisikan di antara mereka, dan satu dapat dikatakan sebagai 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.


8
OK, Anda mendapatkan bintang emas untuk profesor :)
Mike Dunlavey

@ Mike: Yay? :-)
Paul Nathan

Ah, dan bisakah ada contoh?
mlvljr

2
@mlvljr: di.ens.fr/~cousot/AI astree.ens.fr memberikan sketsa data.
Paul Nathan

1
Amir: itu definisi teknis abstraksi dari dunia analisis statis.
Paul Nathan

13

Abstraksi lebih fokus Whatdan kurang 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:

  • 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 Interfaceatau abstract classdi Java atau C ++, implementasi sebenarnya disembunyikan. Dan tidak hanya tersembunyi, implementasi metode yang dideklarasikan dalam Interfacejuga cenderung berbeda di berbagai kelas yang diimplementasikan / diwariskan. Tetapi karena Anda mendapatkan layanan yang sama, jangan ganggu Howitu diterapkan dan tepat Who/ Whatmenyediakan 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.


Jadi mengapa tidak sebut saja "spesifikasi persis apa", btw?
mlvljr

+1 untuk bit satori, juga
mlvljr

@mlvljr Sedikit Howselalu membantu untuk memahami Whats. Jadi, bisa dicampur dengan abstraksi.
Gulshan

7

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.


Aha! Apa itu model yang disederhanakan di sini? Ingat puzzle yang bocor , btw? :)
mlvljr

7

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 + 2adalah 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

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


4

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.


Dan apa yang akan menjadi contoh dari sesuatu yang abstrak itu?
mlvljr

3
@mlvljr: Jika Anda membaca artikel wikipedia, Anda akan melihat beberapa.
John Fisher

Sedihnya, saya cukup yakin mereka akan terlalu abstrak ..
mlvljr

4

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.


Tidak akan menggunakan dan IInt add(IInt a, IInt b);subrutin dalam program di mana Anda tahu sebelumnya itu adan bakan, katakan Int128: IIntcontoh 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)?
mlvljr

1
Maaf, tapi saya tidak bisa mengerti pertanyaan Anda.
Kate Gregory

Nah, misalkan, Anda sedang menulis sebuah program yang harus menambahkan 2 hingga 3. Anda melakukan ini dengan memanggil add(int, int)subrutin / fungsi. Ini akan cukup untuk memilikinya hanya return 2 + 3;dalam kasus ini. Dan mengapa Anda harus menggunakan rutin yang lebih "universal" (dengan return a + b;beroperasi pada parameter aktual a dan yang bdisediakan, dan dengan demikian benar - benar abstrak dari nilai-nilai mereka) - itu adalah pertanyaan (retorika) saya di atas. Semoga ini menjadi sedikit lebih jelas sekarang.
mlvljr

Komentar pertama saya cukup "membingungkan diri sendiri", saya setuju :)
mlvljr

4

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.


Memikirkan abstraksi sebagai sesuatu yang "terlalu indah untuk dipahami dengan jelas (atau, bahkan lebih, dijelaskan dalam istilah kering (matematis)" tidak membantu (pertama dan paling tidak) memahami apa itu dan (kedua) mengembangkan teknik-tekniknya. aplikasi dan penilaian (horor!) [tentang bagaimana dan dengan cara apa kode yang diberikan adalah abstrak].
mlvljr

3
Jika perubahan di satu tempat membuat Anda harus membuat beberapa perubahan di tempat lain, maka abstraksi Anda buruk. Pada intinya, saya tidak akan mengatakan bahwa saya atau orang lain tidak pernah keliru dengan terlalu banyak abstraksi, tetapi ada metode untuk kegilaan itu. Abstraksi yang baik adalah landasan dari kode yang digabungkan secara longgar. Dengan abstraksi yang tepat, perubahan menjadi sangat sederhana. Jadi ya, saya meletakkan abstraksi pada alas dan saya menghabiskan banyak waktu untuk menemukan yang tepat.
Jason Baker

@Jason Baker Biarkan teknik abstraksi kami cukup konkret untuk digunakan secara efektif ...
mlvljr

1
@Jason: "Jika perubahan di satu tempat membuat Anda harus membuat beberapa perubahan di tempat lain, maka abstraksi Anda buruk." Aku bersamamu di sana. Sepertinya saya dikelilingi oleh yang jahat.
Mike Dunlavey

1
Kedengarannya seperti Anda telah bekerja di tempat di mana para devs memiliki visi besar, dan tidak ada bos yang kuat yang membuat tim tetap fokus. Ketika saya menemukan diri saya dalam lingkungan seperti itu saya mulai mencari pekerjaan lain (anggaran proyek selalu berakhir, atau perusahaan yang cukup kecil => bangkrut). Saya melihat tweet baru-baru ini: 'kode spaghetti' vs 'kode lasagna', yang terakhir adalah ketika ada terlalu banyak lapisan.
yzorg

4

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 Listkelas dapat mengabstraksi detail dari implementasi linked-list - di mana alih-alih berpikir dalam hal memanipulasi nextdan previouspointer, 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 Listcontoh tersebut, enkapsulasi dapat digunakan untuk menyembunyikan detail implementasi dari daftar tertaut; dalam bahasa berorientasi objek, misalnya, Anda dapat membuat nextdan menunjuk previouspribadi, 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 Listkelas 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 Liststruktur dalam C, mengekspos ' next' dan ' prev' pointer ke dunia, tetapi juga menyediakan sebuah antarmuka, mengandung initList(),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.


Yah, sepertinya itu tentang apa yang sebenarnya saya inginkan (beberapa kata-kata umum yang tidak masuk akal / contoh-dilindungi pada "modular == abstrak == baik == Anda-bisa-tidak-pernah-memperkirakan-itu-hanya-berjuang" pandangan) , terima kasih (masih membaca)
mlvljr

Dan inilah moto provokatif dari jawaban saya yang akan datang (untuk pertanyaan saya sendiri) "Abstraksi bocor ketika pikiran menjadi lemah";)
mlvljr

2

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

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 .


+1, "Saya melakukan abstraksi!" akan menyenangkan untuk T-shirt;) Terima kasih atas tautan tentang morfisme (meskipun tidak secara langsung menyebut polis - satu di antara lusinan lainnya yang disebutkan;)) juga.
mlvljr

2

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


1

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.


Ya, ingat kertas itu. Paman Bob cerdas dalam memberi energi pada kerumunan dan membuat orang tertarik pada mekanisme OO.
mlvljr

Anehnya, saya lupa untuk memperbaiki (sekaligus) :)
mlvljr

1

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.


Seharusnya saya menekankan ini lebih baik, tapi saya tertarik bukan pada jenis abstraksi yang tidak memiliki rincian yang tidak perlu dari prototipe dunia nyata mereka, tetapi dengan demikian memberikan beberapa petunjuk bermanfaat pada desain sistem yang harus berurusan dengan benda-benda dunia nyata yang disebutkan di atas. (contohnya adalah membangun kelas Karyawan dengan beberapa properti Karyawan dunia nyata yang mungkin berguna dalam aplikasi bisnis). Yang saya tertarik adalah jenis abstraksi yang "membentengi" entitas perangkat lunak dari entitas lain yang berurusan dengannya (contohnya adalah Employerasumsi tentang Employee).
mlvljr

1
Anda tidak masuk akal. Memberikan petunjuk tentang merancang sistem nyata bukan tujuan untuk abstraksi. Jika Anda tidak tahu apa-apa tentang apa yang sedang dimodelkan, itu bukan masalah yang harus diselesaikan abstraksi.
whatsisname

Saya sedang berbicara tentang mengabstraksikan rincian objek dunia nyata yang akan ditangani oleh perangkat lunak - dalam proses pembuatan perangkat lunak itu. Menggunakan abstraksi (perangkat lunak) dari entitas dunia nyata untuk (kembali) mendesain bahwa hal dunia nyata itu tidak dimaksudkan (itu adalah "sistem perangkat lunak" sebagai "sistem" dalam "tetapi dengan demikian memberikan beberapa petunjuk bermanfaat pada desain sistem" di komentar saya di atas).
mlvljr

1

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 .


1
Jika bocor, maka jelas itu bukan abstraksi ... cukup, mari kita jujur.
mlvljr

2
@mlvljr Komputer bukan masalah matematika, sayangnya, jadi Anda harus mengizinkan beberapa tingkat kebocoran. Jika tidak ada yang lain, fakta bahwa perhitungan sedang dilakukan pada perangkat fisik menyiratkan kendala tertentu terhadap ruang lingkup masalah yang dapat dimodelkan. Secara teknis, teorema ketidaklengkapan menyiratkan hal-hal tertentu tidak dapat dibuktikan tentang sistem matematika secara internal, sehingga bahkan matematika memiliki "abstraksi bocor."
CodexArcanum

2
Anda selalu dapat menemukan situasi di mana abstraksi akan bocor. Tidak ada abstraksi yang sempurna. Ini hanyalah masalah seberapa banyak bocor dan apakah Anda dapat hidup dengannya.
Dima

@ CodexArcanum 1. Rutin mengambil intkurang 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 prototipe void (*) (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 bocor
mlvljr

Pengekangan pada MAX_INT_SIZE tidak diklarifikasi di mana pun dalam tanda tangan metode Anda. Kecuali jika Anda menggunakan bahasa yang memungkinkan pemrograman berbasis kontrak (seperti Eiffel), itu adalah kebocoran. Menyebutkan batasan dalam dokumentasi tidak masuk hitungan, karena dokumentasi berada di luar sistem. Dan bagaimana jika daya padam di tengah operasi? Bagaimana jika Anda harus mengirimkan data melalui jaringan dan ada latensi? Tidak ada paradigma pemrograman yang dapat menghilangkan fisik perangkat keras sistem.
CodexArcanum

1

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?


Hampir seperti itulah komentar saya terhadap jawaban Kate Gregory. ;) Yang menarik adalah, sementara program yang kurang umum dapat memanfaatkan yang lebih umum, menyediakan pengguna yang telah meminta yang pertama dengan yang kedua mungkin akan berguna ...
mlvljr

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.


Panggilan kode save_to_databasetidak 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.
mlvljr

1

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.


1

Tingkat tipuan ekstra.

Anda tidak ingin peduli apakah objek yang Anda gunakan adalah a Catatau a Dog, jadi Anda harus melalui tabel fungsi virtual untuk menemukan makeNoise()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 Monadabstrak Haskell atas efek komputasi dengan memanggil semuanya returndan >>=.


1

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:

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

Semoga itu bisa membantu.


+1, Ya, topik itu tampaknya benar-benar menghalangi banyak dari kita;) Saya berharap (akhirnya) melengkapi jawaban Anda dengan beberapa poin saya sendiri untuk memancing minat lebih banyak pada diskusi.
mlvljr

0

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.


1
+1, Tapi tidak selalu saya pikir (pikirkan detail yang benar-benar tidak perlu :)). Pertanyaan awal adalah: "Apakah ini tentang menghapus detail selamanya, melupakannya sementara atau bahkan menggunakannya dengan cara yang tidak diketahui?"
mlvljr

1
Saya tidak peduli berapa banyak foton yang melanda pelanggan saya hari ini.
flamingpenguin

0

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?


0

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.


0

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.