Що таке Шим?


Відповіді:


92

З Вікіпедії:

У комп’ютерному програмуванні шим - це невелика бібліотека, яка прозоро перехоплює API, змінюючи передані параметри, обробляючи саму операцію або перенаправляючи операцію в інше місце. Шини зазвичай виникають, коли поведінка API змінюється, тим самим викликаючи проблеми сумісності для старих додатків, які все ще покладаються на більш стару функціональність. У цих випадках старіший API все ще може підтримуватися тонким шаром сумісності поверх нового коду. Шими можна також використовувати для запуску програм на різних програмних платформах, ніж вони були розроблені.


83
Ця відповідь не відрізняється від фактичного пошуку Google у Вікіпедії. Приклад був би непоганим.
dance2die

4
Це звучить як використання схеми дизайну фасадів для взаємодії бібліотек.
blz

84

Термін "шим", визначений у Вікіпедії, технічно класифікується, виходячи з його визначення, як "структурна" модель дизайну. Багато типів "структурних" моделей дизайну досить чітко описані в (дехто б сказав дефакто) об'єктно-орієнтованому посиланні на дизайн програмного забезпечення "Шаблони дизайну, елементи багаторазового об'єктно-орієнтованого програмного забезпечення", більш відомі як "Банда чотирьох" .

Текст "Банди з чотирьох" окреслює щонайменше 3 добре встановлені шаблони, відомі як "Проксі", "Адаптер" та "Фасад", які забезпечують функціональність типу "shim". У більшості полів часто трапляється використання або скорочення використання різних абревіатур для однієї кореневої концепції, що викликає плутанину людей. Використання слова "shim" для опису більш конкретних "структурних" моделей дизайну "Proxy" , "Adapter" і "Facade", безумовно, є наочним прикладом такого типу ситуації. "Шим" - це просто більш загальний термін для більш конкретних типів "структурних" шаблонів "проксі", "адаптер", "фасад" та, можливо, інших.


5
Ця відповідь вказує на те, що шим - це модель дизайну (одна з багатьох), називає деякі подібні шаблони дизайну та відзначає дотичну інформацію про те, як люди плутаються в різних абревіатурах. Але це насправді не відповідає початковому питанню, що таке лайка, що вона робить, або як вона використовується.
Річі Томас

53

Просте пояснення через мультфільм

Приклад шимми:

My Dog Ralph - один щасливий баш-тард (призначений подвійний каламбур)

Підсумок

Примітка: аналогія напружена. Зазвичай Ральф отримає ТОЧНО те, про що він просив - але механіку ЯК це було отримано - це те, чого він може не очікувати.

Шим - це якийсь код, який піклується про запитання ("перехоплення"), без того, щоб хтось мудріший з цього приводу. Це загальна концепція. Тепер ви повинні мати можливість читати та розуміти запис вікіпедії на лайках.


13

Що стосується походження слова, погладьте віджет Apple's Dictionary

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

Це, здається, добре відповідає тому, як веб-дизайнери використовують цей термін.



12

Згідно зі статтею Microsoft "Демістифікуючі лайми" :

Це метафора, заснована на англомовному слові shim, який є інженерним терміном, який використовується для опису шматка дерева або металу, який вставляється між двома предметами, щоб зробити їх краще з’єднаними разом. У комп’ютерному програмуванні шим - це невелика бібліотека, яка прозоро перехоплює API, змінює передані параметри, обробляє саму операцію або перенаправляє операцію в інше місце. Шини можна також використовувати для запуску програм на різних програмних платформах, ніж вони були розроблені.

Я інтерпретую це так, що шим - це загальний термін для будь-якої бібліотеки коду, який виступає посередником і частково або повністю змінює поведінку або роботу програми. Як і справжній посередник, він може впливати на дані, передані цій програмі, або впливати на дані, повернені з цієї програми.

У статті використовується приклад API API, і я знайшов відповідне таке речення:

Програма, як правило, не знає, що запит переходить до shim DLL замість самої Windows, а Windows не знає, що запит надходить з іншого джерела, ніж додаток (оскільки shim DLL - це лише ще одна DLL всередині процесу програми) .

Щоб узагальнити цю цитату, дві програми, які складають "хліб" із "шим сендвіч", не повинні мати змогу розмежовувати розмову зі своєю програмою-колегою та розмову з лайком.

Які існують плюси та мінуси використання шимми?

Знову із статті:

Ви можете виправити програми, не маючи доступу до вихідного коду або зовсім не змінюючи їх. У вас виникає мінімальна кількість додаткових витрат на управління ... і ви можете зафіксувати розумну кількість програм таким чином. Мінусом є підтримка, оскільки більшість постачальників не підтримують прошиті програми. Ви не можете виправити кожну програму за допомогою прокладки. Більшість людей, як правило, вважають лайми для програм, де постачальник не працює, програмне забезпечення не є достатньо стратегічним, щоб потребувати підтримки, або вони просто хочуть придбати трохи часу.

У контексті цього питання такі терміни, як "проксі", "адаптер" та "фасад" мають більше сенсу (принаймні для мене) після того, як прочитали вищенаведене посилання.


3

Як ми могли бачити в багатьох відповідях тут, shim - це такий собі адаптер, який забезпечує функціональність на рівні API, який не обов'язково був частиною цього API. Цей потік має багато хороших та повних відповідей, тому я не розширюю визначення далі.

Однак, я думаю, я можу додати хороший приклад: Javascript ES5 Shim ( https://github.com/es-shims/es5-shim ):

Javascript значно розвинувся протягом останніх кількох років, і серед багатьох інших змін до специфікації мови було додано багато нових методів до основних її об'єктів.

Наприклад, у специфікації ES2015 (він же ES5) метод findбув доданий до Arrayпрототипу. Отже, скажімо, що ви використовуєте свій код за допомогою механізму JavasScript до цієї специфікації (наприклад: Вузол 0,12), який ще не пропонує цей метод. Завантажуючи шину ES5, ці нові методи будуть додані до Arrayпрототипу, що дозволить вам використовувати їх, навіть якщо ви не працюєте за більш новою специфікацією JavaScript.

Ви можете запитати: навіщо хтось робити це замість того, щоб оновити середовище до нової версії (скажімо, Вузол 8)?

Існує безліч реальних сценаріїв, коли такий підхід має сенс. Один хороший приклад:

Скажімо, у вас є застаріла система, яка працює в старому середовищі, і вам потрібно використовувати такі нові методи для реалізації / виправлення функціоналу. Оновлення вашого середовища все ще триває, оскільки є проблеми сумісності, які вимагають багато змін коду та тестів (критична складова).

У цьому прикладі ви можете спробувати створити власну версію такої функціональності, але це зробить ваш код складнішим для читання, складнішим, може ввести нові помилки та зажадає багато додаткових тестів лише для того, щоб покрити функціонал, який ви знаєте, що це буде буде доступний у наступному випуску.

Натомість ви можете використовувати цю шиму та використовувати ці нові методи, скориставшись тим, що це виправлення / функціональність буде сумісним після оновлення, оскільки ви вже використовуєте методи, відомі, що доступні в наступній специфікації. І є причина бонусу: оскільки ці методи є новою специфікацією для наступної мови, є велика ймовірність, що вони запустяться швидше, ніж будь-яка реалізація, яку ви могли зробити, якби спробували зробити власну версію.

Ще один реальний сценарій, коли такий підхід вітається, є на рівні браузера. Скажімо, вам потрібно підтримувати старий браузер і хочете скористатися цими новими функціями. Javascript - це мова, яка дозволяє додавати / змінювати методи в її основних об'єктах (наприклад, додавання методів до прототипу Array), і ці бібліотеки shim досить розумні, щоб додати такі методи лише в тому випадку, якщо поточної реалізації їх не вистачає.

PS: 1) Ви побачите термін "Polyfill", пов'язаний з цими трибунами Javascript. Polyfill - це більш спеціалізований тип обшивки, який використовується для забезпечення сумісності вперед у різних специфікаціях рівня браузера. До речі, мій приклад вище відноситься саме до такого прикладу.

2) Шими не обмежуються цим прикладом (додавання функціональних можливостей, які будуть доступні в майбутньому випуску). Існують різні випадки використання, які також вважатимуться лайкою.

3) Якщо вам цікаво, як реалізується цей конкретний поліфайл, ви можете відкрити специфікації Javascript Array.find та прокрутити до кінця сторінки, де ви знайдете канонічну реалізацію цього методу.


0

SHIM - це ще один рівень перевірки безпеки, який проводиться для всіх служб для захисту висхідних систем. Сервер SHIM перевіряє кожен вхідний запит із обліковими записами користувача заголовків щодо облікових даних користувачів, переданих у запиті (SOAP / RESTFUL).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.