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

Ответы:

92

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

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

Прасун Саурав
источник
83
Этот ответ ничем не отличается от реального поиска в Википедии. Пример был бы хорош.
dance2die
4
Это похоже на использование шаблона проектирования Фасад для взаимодействия библиотек.
Blz
84

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

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

Doug
источник
5
Этот ответ указывает на то, что прокладка является шаблоном проектирования (одним из многих), называет некоторые сходные шаблоны проектирования и рассказывает о том, как люди путают разные аббревиатуры. Но на самом деле это не отвечает на первоначальный вопрос о том, что такое прокладка, что она делает или как ее используют.
Ричи Томас
53

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

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

My Dog Ralph - один счастливчик (двойной каламбур)

Резюме

Примечание: аналогия натянута. Обычно Ральф получит ТОЧНО то, о чем он просил, - но механика КАК это было получено - это то, чего он не мог ожидать.

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

BKSpurgeon
источник
14

Что касается происхождения слова, quoth виджет 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, изменяет передаваемые параметры, обрабатывает саму операцию или перенаправляет операцию в другое место. Шиммы также можно использовать для запуска программ на разных программных платформах, для которых они не были разработаны.

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

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

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

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

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

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

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

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

Ричи Томас
источник
3

Как мы могли видеть во многих ответах здесь, прокладка - это своего рода адаптер, который обеспечивает функциональность на уровне 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 и прокрутить до конца страницы, где вы найдете каноническую реализацию для этого метода.

Дэвид Риссато Круз
источник
0

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

Нирбхай Рана
источник