Что такое Шим? - PullRequest
       27

Что такое Шим?

113 голосов
/ 22 января 2010

Каково определение Шим?

Ответы [ 8 ]

83 голосов
/ 22 января 2010

Из Википедии:

В компьютерном программировании shim - это небольшая библиотека, которая прозрачно перехватывает API, изменяет передаваемые параметры, обрабатывает саму операцию или перенаправляет операцию в другое место. Оболочки обычно возникают при изменении поведения API, что вызывает проблемы совместимости для более старых приложений, которые все еще полагаются на более старую функциональность. В этих случаях более старый API все еще может поддерживаться тонким слоем совместимости поверх более нового кода. Шиммы также можно использовать для запуска программ на разных программных платформах, для которых они не были разработаны.

69 голосов
/ 04 июля 2015

Термин «прокладка», как он определен в Википедии, технически будет классифицирован на основе его определения как «структурный» шаблон проектирования. Множество типов «структурных» шаблонов проектирования довольно четко описаны в (иногда можно сказать, де-факто) объектно-ориентированных шаблонах проектирования программного обеспечения, которые ссылаются «Шаблоны проектирования, элементы многоразового объектно-ориентированного программного обеспечения» , более известном как "Банда четырех" .

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. Как минимум, 3 хорошо известных шаблона, известные как "Proxy", "Adapter" и "Facade". В большинстве областей зачастую использование или сокращение использования разных сокращений для одной и той же корневой концепции вызывает путаницу среди людей. Использование слова «прокладка» для описания более конкретных «структурных» шаблонов проектирования «Прокси» , «Адаптер» и «Фасад» , безусловно, является ярким примером такого типа ситуации. «Подкладка» - это просто более общий термин для более конкретных типов «Структурных» шаблонов «Прокси», «Адаптер», «Фасад» и, возможно, других.

14 голосов
/ 02 августа 2018

Простое объяснение через мультфильм

Пример прокладки:

My Dog Ralph is one lucky bash-tard (double pun intended)

Резюме

Шим - это некоторый код, который заботится о том, что спросили (путем «перехвата»), и никто не знает об этом. Это общая концепция. Пожалуйста, обратитесь к ответам выше для чего-то более технического.

13 голосов
/ 20 октября 2012

Оболочки используются в .net 4.5 Microsoft Fakes framework для изоляции вашего приложения от других сборок для модульного тестирования . Шимс перенаправляет вызовы определенных методов в код, который вы пишете как часть вашего теста

13 голосов
/ 22 января 2010

Что касается происхождения слова, используйте виджет 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

Кажется, это вполне соответствует тому, как веб-дизайнеры используют этот термин.

10 голосов
/ 21 марта 2017

Согласно статье Microsoft «Демистификация Шимс» :

Это метафора, основанная на английском слове shim, которое является инженерный термин, используемый для описания куска дерева или металла, который вставляется между двумя объектами, чтобы они лучше совмещались. В компьютерное программирование - это небольшая библиотека, которая прозрачно перехватывает API, изменяет передаваемые параметры, обрабатывает сама операция, или перенаправляет операцию в другое место. Шимс также может использоваться для запуска программ на разных программных платформах, чем они были разработаны для.

Я понимаю, что это означает, что шим является общим термином для любой библиотеки кода, которая действует как посредник и частично или полностью меняет поведение или работу программы. Как настоящий посредник, он может влиять на данные, передаваемые в эту программу, или влиять на данные, возвращаемые из этой программы.

В статье в качестве примера используется API-интерфейс Windows, и я нашел релевантным следующее предложение:

Приложение, как правило, не знает, что запрос Shim DLL вместо самой Windows, и Windows не знает, что запрос поступает из источника, отличного от приложения (потому что shim DLL - это просто еще одна DLL внутри процесса приложения).

Чтобы обобщить эту цитату, две программы, которые делают "хлеб" из "бутерброда с шимом", не должны различать разговор с их программой-партнером и разговор с шим.

Какие плюсы и минусы использования прокладок?

Опять из статьи:

Вы можете исправить приложения без доступа к исходному коду или без меняя их вообще. Вы несете минимальное количество дополнительных накладные расходы на управление ... и вы можете исправить разумное количество приложений таким образом. Недостатком является поддержка как большинство поставщиков не поддерживают приложения с шиммированием. Вы не можете исправить каждый приложение с использованием прокладок. Большинство людей обычно считают прокладки для приложения, где поставщик не работает, программное обеспечение не достаточно стратегический, чтобы требовать поддержки, или они просто хотят купить время.

В контексте этого вопроса такие термины, как «прокси», «адаптер» и «фасад» имеют больше смысла (по крайней мере для меня) после прочтения вышеуказанной ссылки.

3 голосов
/ 02 мая 2018

Как мы могли видеть во многих ответах здесь, прокладка - это своего рода адаптер, обеспечивающий функциональность на уровне API, которая не обязательно была частью этого API. В этой теме много хороших и полных ответов, поэтому я не буду расширять определение.

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

Javascript сильно изменился за последние несколько лет, и среди многих других изменений в спецификации языка было добавлено много новых методов в его основные объекты.

Например, в спецификации ES2015 (он же ES5) метод find был добавлен к прототипу Array. Итак, предположим, что вы выполняете свой код с использованием движка JavasScript до этой спецификации (например, Node 0.12), который пока не предлагает этот метод. При загрузке прокладки ES5 эти новые методы будут добавлены в прототип Array, что позволит вам использовать их, даже если вы не используете более новую спецификацию JavaScript.

Вы можете спросить: почему кто-то делает это вместо обновления среды до более новой версии (скажем, Узел 8)?

Существует много реальных сценариев, в которых такой подход имеет смысл. Один хороший пример:

Допустим, у вас есть устаревшая система, работающая в старой среде, и вам необходимо использовать такие новые методы для реализации / исправления функциональности. Обновление вашей среды все еще находится в стадии разработки, поскольку существуют проблемы совместимости, которые требуют большого количества изменений кода и тестов (критический компонент).

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

Вместо этого вы можете использовать эту прокладку и использовать эти новые методы, используя тот факт, что это исправление / функциональность будет совместимым после обновления, поскольку вы уже используете методы, о которых известно, что они будут доступны в следующей спецификации. , И есть бонусная причина: поскольку эти методы являются родными для следующей спецификации языка, есть большая вероятность, что они будут работать быстрее, чем любая реализация, которую вы могли бы сделать, если бы попытались создать свою собственную версию.

Еще один реальный сценарий, где такой подход приветствуется, - на уровне браузера. Допустим, вам нужна поддержка старого браузера и вы хотите воспользоваться этими новыми функциями. Javascript - это язык, который позволяет добавлять / изменять методы в его основных объектах (например, добавлять методы в прототип Array), и эти библиотеки shim достаточно умны, чтобы добавлять такие методы, только если в текущей реализации их нет.

PS: 1) Вы увидите термин «Polyfill», связанный с этими прокладками Javascript. Polyfill - это более специализированный тип прокладок, который используется для обеспечения прямой совместимости в различных спецификациях уровня браузера. Кстати, мой пример выше относится именно к такому примеру.

2) Прокладки не ограничиваются этим примером (добавление функциональности, которая будет доступна в будущем выпуске). Существуют различные варианты использования, которые также считаются прокладкой.

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

0 голосов
/ 14 декабря 2018

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

...