Что такое Shim?

Какое определение Shim?

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

Что касается начала слова, то виджет словаря Google 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

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

Ответ 5

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

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

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

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

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

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

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

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

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

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

Ответ 6

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

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

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

Резюме

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

Ответ 7

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

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

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

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

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

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

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

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

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

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

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

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

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

Ответ 8

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