什么是Shim?

221

什么是Shim的定义?


请参见以下问题...https://dev59.com/Dmkw5IYBdhLWcg3w_fiJ - SteveC
8个回答

194
简单通过卡通解释

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

摘要

Shim是一种代码,它在“拦截”请求时悄悄处理。

Shim的示例

一个Shim的示例是rbenv(一个ruby工具)。对ruby命令的调用被“shimmed”。也就是说,当你运行bundle install时,rbenv会拦截该消息,并根据你所运行的特定版本的Ruby重新路由它。如果这不太清楚,请尝试这个示例,或者想象仙女教母拦截消息并提供适当的结果。

就是这样!

关于这个示例的重要澄清

注意:就像大多数类比一样,这并不完美:通常拉尔夫会得到他所要求的东西 - 但是如何获得它的机制对拉尔夫来说并不重要。如果拉尔夫要求狗粮,一个好的垫片会提供狗粮。
我想避免语义争论等等。这是我的想法:谈论适配器、外观、代理、四人帮模式 - 概念上太复杂了。引入代码?在没有概念基础的情况下,教学上有风险。百科全书/词典解释?无聊、复杂、耗时阅读 - 通常没有用例。所以我简化成了一个卡通:希望你能快速/轻松地以一种“有趣”的方式理解并继续前进 - 如果你喜欢学术定义,请参考维基百科关于垫片的条目
因为我收到了关于类比的抱怨。我就像... ¯¯\(ツ)/¯¯ 创造概念、找到照片、修图这些东西需要时间,让它“有趣”,它从来就不是一个完美的科学/学术定义的图画。

14
我感谢这个简化的例子 - 感谢你(和 Ralph)提供它!希望牛排很好吃。 - matsuninja
首先,我们可以通过查阅“shim”的一般定义来了解它。这并不需要太复杂的解释。 - undefined

97

根据维基百科的定义,术语“shim”从技术上讲可以被归类为“结构型”设计模式。许多类型的“结构型”设计模式在(有些人会说是事实上的)面向对象软件设计模式参考书《可重用的面向对象软件元素》("Design Patterns, Elements of Reusable Object-Oriented Software")中非常清楚地描述了,这本书更为人所知的名字是"Gang of Four"

"四人帮"的文本概述了至少3个被称为“代理”,“适配器”和“外观”的成熟模式,它们都提供了“垫片”类型的功能。在大多数领域中,常常是使用不同缩写词来描述相同的根概念,这会导致人们困惑。使用“垫片”一词来描述更具体的“结构型”设计模式"代理", "适配器""外观",肯定是这种情况的一个明显例子。“垫片”只是更具体的“结构型”模式“代理”,“适配器”,“外观”和可能其他模式的更普遍的术语。


12
这个回答表明,shim是一种设计模式(众多设计模式之一),列举了一些类似的设计模式,并离题地谈到了人们如何被不同的首字母缩写所困惑。但它实际上并没有回答原始问题,即shim是什么,它的作用是什么,以及如何使用它。 - Richie Thomas

30
根据微软文章"Demystifying Shims"
它是基于英语单词“shim”的隐喻,该单词是一个工程术语,用于描述插入在两个对象之间的一块木头或金属以使它们更好地配合。在计算机编程中,shim是一个小型库,其透明地拦截API,更改传递的参数,处理操作本身或将操作重定向到其他位置。Shim也可用于在与其开发环境不同的软件平台上运行程序。
因此,shim是指任何充当中间人并部分或完全更改程序行为或操作的代码库的通用术语。像真正的中间人一样,它可以影响传递给该程序的数据或影响从该程序返回的数据。
Windows API就是一个例子:
应用程序通常不知道请求是发送到一个shim DLL而不是Windows本身,而Windows也不知道请求来自于除了应用程序之外的其他来源(因为shim DLL只是应用程序进程中的另一个DLL)。
因此,制作“shim三明治”的两个程序不应该能够区分与其对等的程序和与shim的通信。
使用shim的一些优缺点是什么?
同样来自文章:
您可以在没有访问源代码或根本不更改它们的情况下修复应用程序。您会产生最少量的额外管理开销……并且您可以通过这种方式修复合理数量的应用程序。缺点是支持,因为大多数供应商不支持shimmed应用程序。您无法使用shim修复每个应用程序。大多数人通常认为shim适用于供应商已经停业、软件不足以必须获得支持或者他们只是想买点时间的应用程序。

15

至于这个词的起源,引用苹果公司的字典小部件所说:

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

这似乎与网页设计师使用该术语的方式相当吻合。


13

4
正如我们在这里看到的许多回复一样,shim是一种适配器,它在API级别上提供了不一定是该API的一部分的功能。这个线程有很多好的和完整的回答,所以我不再进一步扩展定义。
然而,我认为我可以举一个很好的例子,那就是Javascript ES5 Shim (https://github.com/es-shims/es5-shim):
在过去的几年中,Javascript发生了很大的变化,在语言规范的许多其他变化之中,许多新的方法已经被添加到其核心对象中。
例如,在ES2015规范(又名ES5)中,方法find已被添加到Array原型中。所以假设你正在运行使用早于此规范的JavasScript引擎的代码(例如Node 0.12),它尚未提供该方法。通过加载ES5 shim,这些新方法将被添加到Array原型中,即使你没有在较新的Javascript规范上运行,也可以使用它们。
你可能会问:为什么有人不升级环境到更新版本(比如Node 8),而要这样做呢?
在很多实际情况下,这种方法是有意义的。一个好的例子:
假设你有一个老旧系统运行在旧环境中,你需要使用新的方法来实现/修复功能。但环境升级还在进行中,因为存在兼容性问题,需要大量的代码更改和测试(一个关键组件)。
在这个例子中,你可以尝试制作自己的版本来实现这样的功能,但这会使你的代码更难读懂、更加复杂,可能会引入新的错误,并且需要大量额外的测试才能覆盖一个功能,而你知道这个功能将在下一个发布版本中可用。
相反,你可以使用这个shim并利用这些新的方法,利用这个事实,即这个修复/功能将在升级后与之兼容,因为你已经使用了下一个规范中已知的方法。还有一个额外的原因:由于这些方法是下一个语言规范的本地方法,所以它们运行得比你自己制作的任何实现都要快。
另一个真实的场景是在浏览器层面上采用这种方法。比如说你需要支持旧版本的浏览器,但又想利用这些新功能。Javascript 是一种语言,可以让你添加/修改其核心对象(比如向数组原型中添加方法),而这些 shim 库足够智能,只有在当前实现缺少这些方法时才会添加这些方法。
PS: 1)你会看到与这些 Javascript shims 相关的术语“Polyfill”。Polyfill 是一种更专业的 shim 类型,用于提供不同浏览器级别规范的向前兼容性。顺便说一下,我上面的例子就是这样一个例子。 2)Shims 不仅限于此例(添加将来版本中可用的功能)。还有其他的使用情况也可以被认为是 shim。 3)如果你对这个特定的 polyfill 是如何实现的感到好奇,你可以打开 Javascript Array.find 规范,滚动到页面底部,你会找到这个方法的一个规范实现。

0

当前设置:

一月


client app(v1) -> server A (returns a response itself)


现在你有一个更高级的服务器,名为B。你想摆脱服务器A。你打算怎么做?

client app(v2) -> server B (returns response)
client app(v1) -> server A (returns response)


你能把A服务器降低一下吗?
不行!因为你的移动应用程序的旧版本仍在使用中。那么你应该怎么办呢?
十二月份(将A服务器转换为一个shim)。

client app (v1) -> server A - > server B -> server A 
client app (v2) - > server B


你需要在服务器上进行更改。基本上,服务器A不再像一个真正的服务器那样工作。它只是一个虚假的前端。你必须保留它,因为你无法在某人的手机上更新旧版本的应用程序的URL。
这个虚假的前端被称为"shim"。
这个"shim"有什么优势呢?
- 平台团队和客户团队可以根据各自的时间表弃用服务器。 - 你可以停止对旧服务器的开发,因为它只是将事物转发到新服务器。
你能关闭服务器A吗?
不行。因为它仍然被旧版本的应用程序调用。只有当你强制用户升级到新版本的应用程序时,你才能关闭它。

-2

SHIM是为了保护上游系统而针对所有服务进行的另一级别的安全检查。SHIM服务器会针对每个传入的请求,使用Header用户凭证来验证请求中传递的用户凭证(SOAP / RESTFUL)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接