O que é um calço?

Respostas:

92

Da Wikipedia:

Na programação de computadores, um shim é uma pequena biblioteca que intercepta de forma transparente uma API, alterando os parâmetros passados, manipulando a própria operação ou redirecionando a operação para outro local. Os calços geralmente ocorrem quando o comportamento de uma API é alterado, causando problemas de compatibilidade para aplicativos mais antigos que ainda dependem da funcionalidade mais antiga. Nesses casos, a API mais antiga ainda pode ser suportada por uma fina camada de compatibilidade sobre o código mais recente. Os calços também podem ser usados ​​para executar programas em diferentes plataformas de software para as quais foram desenvolvidos.

Prasoon Saurav
fonte
82
Esta resposta não é diferente de fazer uma pesquisa real no Google na wikipedia. Um exemplo seria bom.
dance2die
4
Isso soa como um uso do padrão de design do Facade para interfaces de bibliotecas.
blz
84

O termo "calço", conforme definido na Wikipedia, seria tecnicamente classificado, com base em sua definição, como um padrão de design "Estrutural". Os muitos tipos de padrões de projeto "Estruturais" são descritos com muita clareza nos (alguns diriam defacto), os padrões de design de software orientado a objetos referem-se a "Padrões de Design, Elementos de Software Orientado a Objetos Reutilizáveis", mais conhecidos como "Gangue dos Quatro" .

O texto "Gang of Four" descreve pelo menos três padrões bem estabelecidos, conhecidos como "Proxy", "Adapter" e "Facade", todos com funcionalidade do tipo "shim". Na maioria dos campos, muitas vezes o uso e a falta de acrônimos diferentes para o mesmo conceito raiz causam confusão nas pessoas. Usar a palavra "calço" para descrever os padrões de design "Estruturais" mais específicos " Proxy" , "Adaptador" e "Fachada" certamente é um exemplo claro desse tipo de situação. Um "calço" é simplesmente um termo mais geral para os tipos mais específicos de padrões "Estruturais", "Proxy", "Adaptador", "Fachada" e possivelmente outros.

Doug
fonte
5
Essa resposta indica que um calço é um padrão de design (um de muitos), nomeia alguns padrões de design semelhantes e explora como as pessoas se confundem com diferentes siglas. Mas na verdade não responde à pergunta original sobre o que é um calço, o que faz ou como é usado.
Richie Thomas
53

Explicação simples via desenho animado

Um exemplo de calço:

My Dog Ralph é um sortudo bash-tard (trocadilho duplo)

Resumo

Nota: a analogia é forçada. Normalmente, Ralph recebe exatamente o que ele pediu - mas a mecânica de COMO foi obtida é algo que ele não pode esperar.

Um shim é um código que cuida do que é solicitado (por 'interceptação'), sem que ninguém seja mais sábio sobre isso. Este é o conceito geral. Agora você deve poder ler e entender a entrada da wikipedia sobre calços.

BKSpurgeon
fonte
13

Quanto às origens da palavra, quoth widget Dicionário da 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

Isso parece se encaixar muito bem na maneira como os designers da web usam o termo.

Thilo
fonte
12

De acordo com o artigo da Microsoft "Desmistificando Calços" :

É uma metáfora baseada na palavra shim no idioma inglês, que é um termo de engenharia usado para descrever um pedaço de madeira ou metal que é inserido entre dois objetos para ajustá-los melhor. Na programação de computadores, um shim é uma pequena biblioteca que intercepta de forma transparente uma API, altera os parâmetros passados, manipula a própria operação ou redireciona a operação para outro local. Os calços também podem ser usados ​​para executar programas em diferentes plataformas de software para as quais foram desenvolvidos.

Interpreto que isso significa que um shim é um termo genérico para qualquer biblioteca de código que atua como intermediário e altera parcial ou completamente o comportamento ou a operação de um programa. Como um verdadeiro intermediário, ele pode afetar os dados transmitidos para esse programa ou afetar os dados retornados desse programa.

O artigo usa a API do Windows como exemplo e achei a seguinte frase relevante:

Geralmente, o aplicativo não sabe que a solicitação está indo para uma DLL de correção, e não para o próprio Windows, e o Windows não sabe que a solicitação é proveniente de uma fonte diferente da aplicação (porque a DLL de correção é apenas outra DLL dentro do processo do aplicativo) .

Para generalizar essa citação, os dois programas que fazem o "pão" do "sanduíche de calço" não devem ser capazes de diferenciar entre conversar com o programa de contrapartida e conversar com o calço.

Quais são alguns prós e contras do uso de calços?

Novamente, a partir do artigo:

Você pode corrigir aplicativos sem acesso ao código-fonte ou sem alterá-los. Você incorre em uma quantidade mínima de sobrecarga de gerenciamento adicional ... e pode corrigir um número razoável de aplicativos dessa maneira. A desvantagem é o suporte, pois a maioria dos fornecedores não oferece suporte a aplicativos com falhas. Você não pode corrigir todos os aplicativos usando calços. A maioria das pessoas normalmente considera calços para aplicativos em que o fornecedor está fora do negócio, o software não é estratégico o suficiente para exigir suporte ou apenas quer ganhar algum tempo.

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

Richie Thomas
fonte
3

Como pudemos ver em muitas respostas aqui, um shim é um tipo de adaptador que fornece funcionalidade no nível da API que não era necessariamente parte dessa API. Esse tópico tem muitas respostas boas e completas, então não estou expandindo ainda mais a definição.

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

O Javascript evoluiu muito nos últimos anos e, entre muitas outras alterações na especificação da linguagem, muitos novos métodos foram adicionados aos seus objetos principais.

Por exemplo, na especificação ES2015 (também conhecida como ES5), o método findfoi adicionado ao Arrayprotótipo. Então, digamos que você esteja executando seu código usando um mecanismo JavasScript antes desta especificação (ex: Nó 0.12), que ainda não oferece esse método. Ao carregar o shim ES5, esses novos métodos serão adicionados ao Arrayprotótipo, permitindo que você os utilize mesmo que não esteja executando uma 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)?

Existem muitos cenários de casos reais em que essa abordagem faz sentido. Um bom exemplo:

Digamos que você tenha um sistema legado que esteja sendo executado em um ambiente antigo e precise usar esses novos métodos para implementar / corrigir uma funcionalidade. A atualização do seu ambiente ainda está em andamento porque existem problemas de compatibilidade que exigem muitas alterações e testes de código (um componente crítico).

Neste exemplo, você pode tentar criar sua própria versão dessa funcionalidade, mas isso tornaria seu código mais difícil de ler, mais complexo, pode introduzir novos bugs e exigirá muitos testes adicionais apenas para cobrir uma funcionalidade que você sabe que será estar disponível na próxima versão.

Em vez disso, você pode usar esse calço e usar esses novos métodos, aproveitando o fato de que essa correção / funcionalidade será compatível após a atualização, porque você já está usando os métodos conhecidos por estarem disponíveis na próxima especificação. E há um motivo de bônus: como esses métodos são nativos da próxima especificação de idioma, há uma boa chance de que eles sejam executados mais rapidamente do que qualquer implementação que você poderia ter feito se tentasse criar sua própria versão.

Outro cenário real em que essa abordagem é bem-vinda é no nível do navegador. Digamos que você precise dar suporte ao navegador antigo e queira aproveitar esses recursos mais recentes. Javascript é uma linguagem que permite adicionar / modificar métodos em seus objetos principais (como adicionar métodos ao protótipo Array), e essas bibliotecas de shim são inteligentes o suficiente para adicionar tais métodos somente se a implementação atual estiver faltando.

PS: 1) Você verá o termo "Polyfill" relacionado a esses calços Javascript. O Polyfill é um tipo de calço mais especializado usado para fornecer compatibilidade direta em diferentes especificações no nível do navegador. A propósito, meu exemplo acima se refere exatamente a esse exemplo.

2) Os calços não se limitam a este exemplo (adicionando funcionalidade que estará disponível em uma versão futura). Existem diferentes casos de uso que também seriam considerados calços.

3) Se você estiver curioso sobre como esse polyfill específico é implementado, é possível abrir as especificações Javascript Array.find e rolar para o final da página, onde você encontrará uma implementação canônica para esse método.

David Rissato Cruz
fonte
0

SHIM é outro nível de verificação de segurança que é feito para todos os serviços, para proteger os sistemas upstream. O SHIM Server valida todas as solicitações recebidas, com credenciais de Usuário de Cabeçalhos, em relação às credenciais de usuário que são passadas na solicitação (SOAP / RESTFUL).

Nirbhay Rana
fonte