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 memanipulasi next
dan previous
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 membuat next
dan menunjuk previous
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, 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.