Pola desain jembatan memisahkan implementasi dari antarmuka program.
Mengapa ini menguntungkan?
design-patterns
David Faux
sumber
sumber
Jawaban:
Ini memungkinkan Anda untuk mengubah implementasi terlepas dari antarmuka. Ini membantu menangani perubahan persyaratan.
Contoh klasiknya adalah mengganti implementasi penyimpanan di bawah antarmuka dengan sesuatu yang lebih besar, lebih baik, lebih cepat, lebih kecil, atau berbeda tanpa harus mengubah sisa sistem.
sumber
Selain jawaban Daniel, memisahkan antarmuka dari implementasi melalui konsep-konsep seperti polimorfisme memungkinkan Anda untuk membuat beberapa implementasi dari antarmuka yang sama yang melakukan hal serupa dengan cara yang berbeda.
Misalnya, banyak bahasa memiliki konsep streaming di suatu tempat di pustaka standar. Aliran adalah sesuatu yang menyimpan data untuk akses serial. Ini memiliki dua operasi dasar: Baca (memuat jumlah X byte berikutnya dari stream) dan Tulis (tambahkan jumlah X byte data ke stream), dan terkadang yang ketiga, Carilah (reset "posisi saat ini" dari stream ke lokasi baru).
Itu konsep yang cukup sederhana, tetapi pikirkan semua hal yang dapat Anda lakukan dengannya. Yang paling jelas adalah berinteraksi dengan file pada disk. Aliran file memungkinkan Anda membaca data dari file atau menulisnya. Tetapi bagaimana jika Anda ingin mengirim data melalui koneksi jaringan saja?
Jika Anda mengandalkan implementasi secara langsung, Anda harus menulis dua rutinitas yang sangat berbeda untuk menyimpan data yang sama ke file atau mengirimkannya melalui jaringan. Tetapi jika Anda memiliki antarmuka aliran, Anda dapat membuat dua implementasi yang berbeda (
FileStream
danNetworkStream
) yang merangkum rincian spesifik dari pengiriman data ke mana harus pergi, dan kemudian Anda hanya perlu menulis kode yang berhubungan dengan menyimpan file sekali . Tiba-tibaSaveToFile
danSendOverNetwork
rutinitas Anda jauh lebih sederhana: mereka hanya mengatur aliran dari jenis yang sesuai dan meneruskannya keSaveData
rutin, yang menerima antarmuka aliran - tidak perlu peduli apa jenisnya, asalkan dapat melakukan Tulis operasi - dan simpan data ke aliran.Itu juga berarti bahwa jika format data Anda berubah, Anda tidak perlu mengubahnya di berbagai tempat. Jika Anda memusatkan kode penyimpanan data Anda dalam satu rutinitas yang mengambil aliran, maka itu satu-satunya tempat yang perlu diperbarui, sehingga Anda tidak dapat secara tidak sengaja memperkenalkan bug dengan hanya mengubah satu tempat ketika Anda perlu mengubah keduanya. Jadi memisahkan antarmuka dari implementasi dan menggunakan polimorfisme membuat kode yang lebih mudah dibaca dan dipahami, dan itu cenderung memiliki bug.
sumber
IStream
Antarmuka, Anda harus menemukan kembali seluruh rangkaian fungsi untuk setiap aliran. Tetapi jika Anda mulai dengan kelas aliran abstrak dasar, ini dapat menampung semua kondisi umum dan fungsionalitas, dan kemudian membiarkan keturunan menerapkan fitur yang berbeda.Anda benar-benar memiliki dua pertanyaan yang sangat berbeda di sini, meskipun mereka saling berhubungan.
Pertanyaan yang lebih umum adalah yang ada di judul, mengapa Anda memisahkan antarmuka dari implementasi secara umum. Pertanyaan kedua adalah mengapa pola jembatan bermanfaat. Mereka terkait karena pola jembatan adalah cara khusus untuk memisahkan antarmuka dari implementasi, yang memiliki beberapa konsekuensi spesifik lainnya juga.
Pertanyaan umum adalah sesuatu yang vital untuk dipahami oleh setiap programmer. Inilah yang mencegah perubahan dalam program agar tidak menyebar di mana-mana. Saya tidak bisa membayangkan manusia bisa memprogram tanpa menggunakan ini.
Ketika Anda menulis pernyataan tambahan sederhana dalam bahasa pemrograman, itu sudah merupakan abstraksi, (bahkan jika itu tidak menggunakan operator overloading untuk menambahkan matriks atau sesuatu seperti itu) yang melewati cukup banyak kode lain sebelum akhirnya dieksekusi pada sirkuit di komputer Anda. Jika tidak ada pemisahan antarmuka (katakanlah, "3 + 5"), dari implementasi (banyak kode mesin), maka Anda harus mengubah kode Anda setiap kali implementasi berubah (seperti Anda ingin menjalankan pada prosesor baru).
Bahkan dalam aplikasi CRUD yang sederhana, setiap tanda tangan metode, dalam arti luas, antarmuka untuk penerapannya.
Semua jenis abstraksi ini memiliki tujuan dasar yang sama - memiliki kode panggilan yang menyatakan maksudnya dengan cara yang paling abstrak yang memberikan pelaksana informasi sebanyak yang diperlukan. Itu memberikan kopling minimal yang mungkin di antara mereka, dan membatasi efek riak ketika kode perlu diubah sebanyak mungkin.
Kedengarannya mudah, tetapi dalam praktiknya menjadi rumit.
Pola jembatan adalah cara khusus untuk memisahkan bit implementasi tertentu ke dalam antarmuka. Diagram kelas dari pola lebih informatif daripada deskripsi. Ini lebih seperti cara untuk memiliki modul pluggable daripada jembatan, tetapi mereka menamainya jembatan karena sering digunakan di mana modul telah dibuat sebelum antarmuka. Jadi membuat antarmuka umum untuk implementasi serupa yang ada semacam "jembatan" perbedaan dan memungkinkan Anda kode untuk bekerja dengan salah satu implementasi.
Jadi, katakan Anda ingin menulis add-on ke pengolah kata, tetapi Anda ingin itu bekerja pada beberapa pengolah kata. Anda dapat membuat antarmuka yang mengabstraksi fungsionalitas berbasis pengolah kata yang Anda butuhkan (dan yang harus dapat diterapkan oleh setiap pengolah kata karena Anda tidak dapat mengubahnya), dan satu pelaksana antarmuka itu untuk setiap pengolah kata yang ingin Anda dukung. Kemudian aplikasi Anda dapat memanggil antarmuka itu dan tidak khawatir tentang detail setiap pengolah kata.
Ini sebenarnya sedikit lebih rinci dari itu, karena setiap kelas mungkin benar-benar hirarki kelas (jadi, mungkin tidak hanya ada pengolah kata abstrak, tetapi Dokumen abstrak, TextSelection abstrak, dll, dengan implementasi konkret untuk masing-masing), tapi itu ide yang sama.
Ini agak seperti fasad, kecuali dalam hal ini lapisan abstraksi difokuskan pada penyediaan antarmuka yang sama untuk beberapa sistem yang mendasarinya.
Ini terkait dengan Inversion Of Control, karena pelaksana beton akan diteruskan ke metode atau konstruktor dan akan menentukan implementasi aktual yang disebut.
sumber