什么是垫片?

时间:2010-01-22 09:11:44

标签: terminology definition vocabulary shim

Shim的定义是什么?

9 个答案:

答案 0 :(得分:78)

来自维基百科:

  

在计算机编程中, shim 是一个小型库,它透明地拦截API,更改传递的参数,处理操作本身或将操作重定向到其他位置。垫片通常在API的行为发生变化时出现,从而导致仍然依赖于旧功能的旧应用程序的兼容性问题。在这些情况下,旧的API仍然可以通过较新代码之上的瘦兼容层来支持。垫片还可用于在不同的软件平台上运行程序,而不是为它们开发的程序。

答案 1 :(得分:66)

维基百科中定义的术语“垫片”在技术上将根据其定义分类为“结构”设计模式。许多类型的“结构”设计模式在(有些人会说defacto)面向对象的软件设计模式参考"Design Patterns, Elements of Reusable Object-Oriented Software"更清楚地描述,更好地称为"Gang of Four"

"Gang of Four"文本概述了至少3种已建立的模式,称为“代理”,“适配器”和“外观”,它们都提供“垫片”类型功能。在大多数领域,通常使用和/或错过使用不同的首字母缩略词来导致相同的根概念导致人们混淆。使用“shim”一词来描述更具体的“结构”设计模式"Proxy""Adapter""Facade"当然是这种情况的一个明显例子。对于更具体类型的“结构”模式“代理”,“适配器”,“门面”以及可能的其他类型,“垫片”只是一个更通用的术语。

答案 2 :(得分:13)

至于单词的起源,quoth Apple的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

这似乎非常适合网页设计师使用这个术语。

答案 3 :(得分:13)

垫片用于.net 4.5 Microsoft Fakes框架to isolate your application from other assemblies for unit testing。垫片将调用转移到特定方法,以编写您作为测试的一部分编写的代码

答案 4 :(得分:10)

根据微软的文章"Demystifying Shims"

  

这是一个基于英语单词shim的隐喻,它是一个   用于描述一块木头或金属的工程术语   插入两个物体之间,使它们更好地配合在一起。在   计算机编程,垫片是透明的小型库   拦截API,更改传递的参数,处理   操作本身,或将操作重定向到其他地方。垫也可以   用于在不同的软件平台上运行程序   是为...开发的。

我认为这意味着垫片是任何代码库的通用术语,它充当中间人并部分或完全改变程序的行为或操作。像真正的中间人一样,它会影响传递给该程序的数据,或影响从该程序返回的数据。

本文使用Windows API作为示例,我发现以下句子相关:

  

应用程序通常不知道请求将转到   shim DLL而不是Windows本身,Windows并不知道   请求来自应用程序以外的来源(因为   填充DLL只是应用程序进程中的另一个DLL。)

为了概括这句话,制作“垫片三明治”的“面包”的两个程序不应该能够区分与对应程序交谈和与垫片交谈。

使用垫片的优点和缺点是什么?

再次,从文章:

  

您无需访问源代码即可修复应用程序   彻底改变它们。你需要额外的少量额外费用   管理费用......你可以解决问题   这种方式合理的申请数量。缺点是支持   大多数供应商不支持shimmed应用程序。你无法解决所有问题   使用垫片的应用程序。大多数人通常会考虑垫片   供应商停业的应用程序,软件不是   战略足以需要支持,或者他们只是想买一些   时间。

在这个问题的上下文中,在阅读上述链接后,“代理”,“适配器”和“外观”等术语对我来说更有意义(至少对我而言)。

答案 5 :(得分:10)

通过卡通进行简单解释

垫片的示例:

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

摘要

填充程序是一些代码,它负责(“拦截”)所询问的内容,而没有人对此有任何理智。这是一般概念。请参阅上面的答案以获取更多技术信息。

答案 6 :(得分:3)

正如我们在这里的许多回复中所看到的,垫片是一种在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原型添加方法),并且这些填充库非常智能,只有在当前实现缺少这些方法的情况下才能添加这些方法。

PS: 1)你会看到术语" Polyfill"与这些Javascript垫片有关。 Polyfill是一种更专业的垫片类型,用于提供不同浏览器级别规范的向前兼容性。顺便说一句,我上面的例子正好就是这样的例子。

2)垫片不仅限于此示例(添加将来版本中可用的功能)。有不同的用例也被认为是垫片。

3)如果您对如何实现此特定polyfill感到好奇,可以打开Javascript Array.find规范并滚动到页面末尾,在那里您将找到此方法的规范实现。

答案 7 :(得分:0)

SHIM是对所有服务执行的另一级安全检查,以保护上游系统。 SHIM Server会针对每个传入的请求(SOAP / RESTFUL),使用标头用户凭据验证每个传入的请求。

答案 8 :(得分:0)

垫片的另一个例子

小时候,我的祖母住在同一个城镇。那是一个小镇。每个人都认识。

我曾经给她写封信:

To:   Grand Ma
From: Ben

然后将其张贴到邮政信箱中.....用于送达她的信件必定会成功。我不知道也不在乎它是怎么发生的。这就引出了一个问题:信件是如何送达的?

这很容易:消息被填充。由于这是一个小镇,邮局的那个人知道谁写了这封信(Woop Woop的Ben),并且知道了奶奶的地址,因此对地址进行了更改和填充,以便该邮件可以正确地交付给她。

除了应用于代码外,这是相同的基本概念。

相关问题