O que é um Shim?

Qual é a definição de um Shim?

Author: hippietrail, 2010-01-22

7 answers

Da Wikipédia:

Na programação informática, a shim. é uma pequena biblioteca que intercepta de forma transparente uma API, alterando os parâmetros passados, lidando com a operação em si, ou redirecionando a operação em outro lugar. Shims normalmente ocorrem quando o comportamento de uma API muda, causando problemas de compatibilidade para aplicações mais antigas que ainda dependem da funcionalidade mais antiga. Nestes casos, a API mais antiga ainda pode ser suportada por uma fina camada de compatibilidade em cima do código mais recente. Shims também pode ser usado para executar programas em diferentes plataformas de software do que eles foram desenvolvidos para.

 77
Author: Prasoon Saurav, 2010-01-22 09:14:14

Quanto às origens da palavra, o widget Dicionário de quoth Apple

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
Isto parece encaixar - se muito bem com a forma como os web designers usam o termo.
 13
Author: Thilo, 2010-01-22 09:22:47

Os Shims são usados no. net 4.5 Microsoft Fakes framework para isolar a sua aplicação de outros conjuntos de testes unitários. Os Shims desviam as chamadas para métodos específicos para codificar que escreves como parte do teu teste

 11
Author: Michael Freidgeim, 2012-10-20 12:43:42
De acordo com o artigo da Microsoft [[2]] "desmistificar Shims":
É uma metáfora baseada na palavra em língua inglesa shim, que é uma termo de engenharia utilizado para descrever um pedaço de madeira ou metal que é inserido entre dois objectos para que se encaixem melhor. Em programação de computador, um shim é uma pequena biblioteca que transparentemente intercepta uma API, altera os parâmetros passados, lida com a operação em si, ou redireciona a operação em outro lugar. Shims também pode ser usado para executar programas em diferentes plataformas de software do que eles foram desenvolvidos para.

Eu interpreto isso como significando que um shim é um termo genérico para qualquer biblioteca de código que age como um intermediário e muda parcial ou completamente o comportamento ou operação de um programa. Como um verdadeiro intermediário, ele pode afetar os dados passados a esse programa, ou afetar os dados retornados desse programa.

O artigo usa a API do Windows como exemplo, e eu encontrei a seguinte frase relevante:

A aplicação não tem conhecimento geral de que o pedido vai para um shim DLL em vez de para o próprio Windows, e Windows não está ciente de que o pedido é proveniente de uma fonte diferente da aplicação (porque o shim DLL é apenas mais um DLL dentro do processo da aplicação).

Para generalizar esta citação, os dois programas que fazem o " pão " do "sanduíche de shim" não devem ser capazes de diferenciar entre falar com os seus programa de contraparte e a falar com o shim.

O que são prós e contras de usar shims?

De novo, do artigo:

Você pode corrigir aplicações sem acesso ao código fonte, ou sem a mudá-los. Você incorrer em uma quantidade mínima de adicional despesas de gestão... e você pode consertar um um número razoável de aplicações desta forma. A desvantagem é o apoio como a maioria dos vendedores não suporta aplicações shimmed. Você não pode consertar todos aplicação com shims. A maioria das pessoas normalmente considera shims para aplicações onde o fornecedor está fora do negócio, o software não é estratégico o suficiente para precisar de apoio, ou só querem comprar alguns. tempo.

No contexto desta questão, termos como" proxy"," adaptador "e" fachada " fazem mais sentido (pelo menos para mim) depois de ter lido o link acima.

 9
Author: Richie Thomas, 2017-10-12 14:31:28

Como podemos ver em muitas respostas aqui, um shim é uma espécie de adaptador que fornece funcionalidade a nível de API que não fazia necessariamente parte dessa API. Este tópico tem um monte de respostas boas e completas, então eu não estou expandindo a definição ainda mais.

No entanto, acho que posso adicionar um bom exemplo, que é o Javascript ES5 Shim ( https://github.com/es-shims/es5-shim):

Javascript evoluiu muito nos últimos anos, e entre muitas outras mudanças para a especificação da linguagem, um monte de novos métodos foram adicionados aos seus objetos centrais.

Por exemplo, na especificação ES2015 (também conhecido por ES5), o método find foi adicionado ao protótipo Array. Então vamos dizer que você está executando seu código usando um motor JavaScript antes desta especificação (Ex: nó 0.12) que ainda não oferece esse método. Ao carregar o ES5 shim, estes novos métodos serão adicionados ao protótipo Array, permitindo-lhe fazer uso deles mesmo que não esteja em execução numa especificação JavaScript mais recente.

Você pode perguntar: Por que alguém faria isso em vez de atualizar o ambiente para uma versão mais recente (digamos, nó 8)?

Há muitos casos reais em que essa abordagem faz sentido. Um bom exemplo: Vamos dizer que você tem um sistema legado que está funcionando em um ambiente antigo, e você precisa usar esses novos métodos para implementar/corrigir uma funcionalidade. O upgrade do seu ambiente ainda um trabalho em progresso, porque há problemas de compatibilidade que requerem muitas alterações de código e testes (Um componente crítico).

Neste exemplo, você pode tentar criar a sua própria versão de tal funcionalidade, mas isso tornaria o seu código mais difícil de ler, mais complexo, pode introduzir novos bugs e irá requerer toneladas de testes adicionais apenas para cobrir uma funcionalidade que você sabe que estará disponível no próximo lançamento.

Em vez disso, você pode usar este shim e fazer uso destes novos métodos, aproveitando o fato que esta correção / funcionalidade será compatível após a atualização, porque você já está usando os métodos conhecidos para estar disponível na próxima Especificação. E há uma razão bônus: uma vez que estes métodos são nativos para o próximo especificação de linguagem, há uma boa chance de que eles vão correr mais rápido do que qualquer implementação que você poderia ter feito se você tentou fazer sua própria versão.

Outro cenário real em que essa abordagem é bem-vinda é ao nível do navegador. Digamos que precisas suporte antigo navegador e quer tirar partido destes recursos mais recentes. Javascript é uma linguagem que lhe permite adicionar/modificar métodos em seus objetos principais (como adicionar métodos para Array prototype), e essas bibliotecas shim são inteligentes o suficiente para adicionar tais métodos apenas se a implementação atual estiver faltando deles.

PS: 1) você verá o termo "Polifill" relacionado a estes shims Javascript. Polifill é um tipo mais especializado de shim que é usado para fornecer compatibilidade para a frente em especificações diferentes do nível do navegador. A propósito, o meu exemplo acima refere-se exactamente a esse exemplo.

2) Os Shims não se limitam a este exemplo (adicionando funcionalidades que estarão disponíveis numa versão futura). Existem diferentes casos de uso que seriam considerados como um shim também.

3) Se estiver curioso sobre como este polifill específico é implementado, poderá abrir o Array Javascript .encontre as especificações e vá até ao fim da página onde encontrará um canónico implementação deste método.

 2
Author: David Rissato Cruz, 2018-05-02 17:45:17
Se a explicação wiki matou algumas células cerebrais, então talvez este seja eaiser para entender: A explicação geral do conceito através dos desenhos animados

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

Resumo

Um "shim" é um código que trata do que é pedido (por "intercepção"), sem que ninguém se aperceba disso. Este é o conceito geral. Por favor, consulte as respostas acima para algo mais técnico.
 0
Author: BKSpurgeon, 2018-08-02 11:28:30