Apa itu Shim?

Jawaban:

94

Dari Wikipedia:

Dalam pemrograman komputer, shim adalah pustaka kecil yang secara transparan mencegat API, mengubah parameter yang diteruskan, menangani operasi itu sendiri, atau mengarahkan operasi ke tempat lain. Shim biasanya muncul saat perilaku API berubah, sehingga menyebabkan masalah kompatibilitas untuk aplikasi lama yang masih mengandalkan fungsionalitas lama. Dalam kasus ini, API yang lebih lama masih dapat didukung oleh lapisan kompatibilitas tipis di atas kode yang lebih baru. Shims juga dapat digunakan untuk menjalankan program pada platform perangkat lunak yang berbeda dari yang mereka kembangkan.

Prasoon Saurav
sumber
95
Jawaban ini tidak berbeda dengan melakukan pencarian google yang sebenarnya di wikipedia. Sebuah contoh akan menyenangkan.
dance2die
5
Ini terdengar seperti penggunaan pola desain Facade untuk perpustakaan antarmuka.
blz
87

Istilah "shim" sebagaimana didefinisikan di Wikipedia secara teknis diklasifikasikan, berdasarkan definisinya, sebagai pola desain "Struktural". Banyak jenis pola desain "Struktural" yang cukup jelas dijelaskan dalam (beberapa akan mengatakan defacto) referensi pola desain perangkat lunak berorientasi objek "Pola Desain, Elemen Perangkat Lunak Berorientasi Objek yang Dapat Digunakan Kembali" lebih dikenal sebagai "Gang of Four" .

The "Gang of Four" garis teks setidaknya 3 pola mapan dikenal sebagai, "Proxy", "Adapter" dan "Facade" yang semuanya memberi “shim” fungsi jenis. Di sebagian besar bidang, sering kali penggunaan dan atau kesalahan penggunaan akronim yang berbeda untuk konsep dasar yang sama menyebabkan kebingungan orang. Menggunakan kata "shim" untuk mendeskripsikan pola desain "Struktural" yang lebih spesifik " Proxy" , "Adaptor", dan "Fasad" tentu saja merupakan contoh jelas dari jenis situasi ini. Sebuah "shim" hanyalah istilah yang lebih umum untuk jenis yang lebih spesifik dari pola "Struktural" "Proxy", "Adapter", "Facade" dan mungkin lainnya.

Doug
sumber
5
Jawaban ini menunjukkan bahwa shim adalah pola desain (salah satu dari banyak), menyebutkan beberapa pola desain yang mirip, dan bersinggungan tentang bagaimana orang menjadi bingung dengan akronim yang berbeda. Tapi itu tidak benar-benar menjawab pertanyaan asli tentang apa itu shim, apa fungsinya, atau bagaimana satu digunakan.
Richie Thomas
64

Penjelasan Sederhana melalui Kartun

Contoh shim:

My Dog Ralph adalah salah satu lucky bash-tard (permainan kata ganda dimaksudkan)

Ringkasan

Sebuah shim adalah beberapa kode yang menangani apa yang diminta (dengan 'intersepsi'), tanpa ada yang lebih bijak tentangnya.

Catatan: Seperti kebanyakan analogi, ini tidak sempurna: biasanya Ralph akan mendapatkan PERSIS apa yang dia minta - tetapi mekanisme BAGAIMANA hal itu diperoleh adalah sesuatu yang Ralph tidak pedulikan.

Contoh Shim

Contoh shim adalah rbenv (alat ruby ​​yang rapi). Panggilan ke perintah ruby ​​adalah "shimmed". yaitu ketika Anda menjalankan bundle install, rbenv mencegat pesan itu, dan merutekan ulang sesuai dengan versi tertentu dari Ruby yang Anda jalankan. Jika itu tidak masuk akal, pikirkan saja ibu dewa peri yang menyadap pesan dan memberikan hasil yang tepat.

BKSpurgeon
sumber
2
Analogi yang fantastis. Terima kasih!
AleksandrH
2
Jawaban Terbaik. Terima kasih!
Ieshaan Saxena
Ini adalah penjelasan terbaik yang pernah saya lihat dalam waktu lama untuk pola desain apa pun. Anda harus membuatnya untuk semua pola, itu bagus.
SteveC
14

Adapun asal kata, mengutip widget Kamus Apple

noun
   a washer or thin strip of material used to align parts, 
   make them fit, or reduce wear.

verb ( shimmed, shimming) [ trans. ]
   wedge (something) or fill up (a space) with a shim.

ORIGIN early 18th cent.: of unknown origin

Ini tampaknya sangat cocok dengan bagaimana desainer web menggunakan istilah tersebut.

Thilo
sumber
13

Menurut artikel Microsoft "Demystifying Shims" :

Ini adalah metafora yang didasarkan pada kata bahasa Inggris shim, yang merupakan istilah teknik yang digunakan untuk mendeskripsikan sepotong kayu atau logam yang disisipkan di antara dua benda agar lebih pas. Dalam pemrograman komputer, shim adalah pustaka kecil yang secara transparan mencegat API, mengubah parameter yang diteruskan, menangani operasi itu sendiri, atau mengarahkan ulang operasi ke tempat lain. Shims juga dapat digunakan untuk menjalankan program pada platform perangkat lunak yang berbeda dari yang mereka kembangkan.

Saya menafsirkan ini berarti bahwa shim adalah istilah umum untuk pustaka kode apa pun yang bertindak sebagai perantara dan sebagian atau seluruhnya mengubah perilaku atau pengoperasian program. Seperti perantara sejati, ini dapat memengaruhi data yang diteruskan ke program itu, atau memengaruhi data yang dikembalikan dari program itu.

Artikel tersebut menggunakan Windows API sebagai contoh, dan saya menemukan kalimat berikut ini relevan:

Aplikasi secara umum tidak menyadari bahwa permintaan tersebut menuju ke DLL shim dan bukan ke Windows itu sendiri, dan Windows tidak menyadari bahwa permintaan tersebut berasal dari sumber selain aplikasi (karena shim DLL hanyalah DLL lain di dalam proses aplikasi) .

Untuk menggeneralisasi kutipan ini, dua program yang membuat "roti" dari "sandwich shim" seharusnya tidak dapat membedakan antara berbicara dengan program mitra mereka dan berbicara dengan shim.

Apa saja pro dan kontra menggunakan shims?

Sekali lagi, dari artikel:

Anda dapat memperbaiki aplikasi tanpa akses ke kode sumber, atau tanpa mengubahnya sama sekali. Anda dikenai biaya pengelolaan tambahan yang minimal ... dan Anda dapat memperbaiki sejumlah aplikasi yang wajar dengan cara ini. Sisi negatifnya adalah dukungan karena sebagian besar vendor tidak mendukung aplikasi shim. Anda tidak dapat memperbaiki setiap aplikasi menggunakan shims. Kebanyakan orang biasanya mempertimbangkan shims untuk aplikasi di mana vendor bangkrut, perangkat lunak tidak cukup strategis untuk memerlukan dukungan, atau mereka hanya ingin mengulur waktu.

Dalam konteks pertanyaan ini, istilah seperti "proxy", "adaptor", dan "fasad" menjadi lebih masuk akal (setidaknya bagi saya) setelah membaca tautan di atas.

Richie Thomas
sumber
3

Seperti yang bisa kita lihat dalam banyak respons di sini, shim adalah semacam adaptor yang menyediakan fungsionalitas pada level API yang belum tentu menjadi bagian dari API itu. Utas ini memiliki banyak tanggapan yang baik dan lengkap, jadi saya tidak akan memperluas definisi lebih jauh.

Namun, saya rasa saya bisa menambahkan contoh yang bagus, yaitu Javascript ES5 Shim ( https://github.com/es-shims/es5-shim ):

Javascript telah berkembang pesat selama beberapa tahun terakhir, dan di antara banyak perubahan lain pada spesifikasi bahasa, banyak metode baru telah ditambahkan ke objek intinya.

Misalnya, dalam spesifikasi ES2015 (alias ES5), metode findtersebut telah ditambahkan ke Arrayprototipe. Jadi katakanlah Anda menjalankan kode Anda menggunakan mesin JavasScript sebelum spesifikasi ini (contoh: Node 0.12) yang belum menawarkan metode itu. Dengan memuat shim ES5, metode baru ini akan ditambahkan ke Arrayprototipe, memungkinkan Anda untuk menggunakannya bahkan jika Anda tidak menjalankan spesifikasi JavaScript yang lebih baru.

Anda mungkin bertanya: mengapa seseorang melakukan itu daripada mengupgrade lingkungan ke versi yang lebih baru (katakanlah Node 8)?

Ada banyak skenario kasus nyata di mana pendekatan tersebut masuk akal. Satu contoh bagus:

Katakanlah Anda memiliki sistem lama yang berjalan di lingkungan lama, dan Anda perlu menggunakan metode baru tersebut untuk mengimplementasikan / memperbaiki fungsionalitas. Upgrade lingkungan Anda masih dalam proses karena ada masalah kompatibilitas yang memerlukan banyak perubahan kode dan pengujian (komponen penting).

Dalam contoh ini, Anda dapat mencoba membuat versi Anda sendiri dari fungsionalitas tersebut, tetapi itu akan membuat kode Anda lebih sulit dibaca, lebih kompleks, dapat memperkenalkan bug baru dan akan membutuhkan banyak tes tambahan hanya untuk mencakup fungsionalitas yang Anda tahu itu akan terjadi. tersedia di rilis berikutnya.

Sebaliknya, Anda dapat menggunakan shim ini dan memanfaatkan metode baru ini, memanfaatkan fakta bahwa perbaikan / fungsionalitas ini akan kompatibel setelah peningkatan, karena Anda sudah menggunakan metode yang diketahui tersedia dalam spesifikasi berikutnya. Dan ada alasan bonus: karena metode ini asli untuk spesifikasi bahasa berikutnya, ada kemungkinan besar metode ini akan berjalan lebih cepat daripada implementasi apa pun yang dapat Anda lakukan jika Anda mencoba membuat versi sendiri.

Skenario nyata lainnya di mana pendekatan semacam itu disambut baik di tingkat browser. Katakanlah Anda perlu mendukung browser lama dan ingin memanfaatkan fitur-fitur yang lebih baru ini. Javascript adalah bahasa yang memungkinkan Anda untuk menambahkan / memodifikasi metode dalam objek intinya (seperti menambahkan metode ke prototipe Array), dan pustaka shim tersebut cukup pintar untuk menambahkan metode tersebut hanya jika implementasi saat ini kurang dari mereka.

PS: 1) Anda akan melihat istilah "Polyfill" terkait dengan shim Javascript ini. Polyfill adalah jenis shim yang lebih khusus yang digunakan untuk menyediakan kompatibilitas ke depan dalam spesifikasi tingkat browser yang berbeda. Omong-omong, contoh saya di atas mengacu pada contoh seperti itu.

2) Shim tidak terbatas pada contoh ini (menambahkan fungsionalitas yang akan tersedia di rilis mendatang). Ada beberapa kasus penggunaan berbeda yang akan dianggap ganjil juga.

3) Jika Anda penasaran tentang bagaimana polyfill spesifik ini diimplementasikan, Anda dapat membuka spesifikasi Javascript Array.find dan menggulir ke akhir halaman di mana Anda akan menemukan implementasi kanonik untuk metode ini.

David Rissato Cruz
sumber
0

SHIM adalah tingkat pemeriksaan keamanan lain yang dilakukan untuk semua layanan, untuk melindungi sistem hulu. SHIM Server memvalidasi setiap permintaan yang masuk, dengan kredensial Pengguna Header, terhadap kredensial pengguna, yang diteruskan dalam permintaan (SOAP / RESTFUL).

Nirbhay Rana
sumber