web-dev-qa-db-fra.com

Qu'est-ce qu'un Shim?

Quelle est la définition d'un Shim?

102
Nanook

De Wikipedia:

En programmation informatique, un shim est une petite bibliothèque qui intercepte de manière transparente une API, modifie les paramètres transmis, gère l'opération elle-même ou redirige l'opération ailleurs. Les shims surviennent généralement lorsque le comportement d'une API change, ce qui pose des problèmes de compatibilité pour les applications plus anciennes qui reposent toujours sur les fonctionnalités les plus anciennes. Dans ces cas, l'ancienne API peut toujours être prise en charge par une couche de compatibilité mince en plus du code le plus récent. Shims peut également être utilisé pour exécuter des programmes sur des plates-formes logicielles différentes de celles pour lesquelles ils ont été développés.

79
Prasoon Saurav

Le terme "cale" tel que défini dans Wikipedia serait techniquement classé, en fonction de sa définition, en tant que modèle de conception "structurel". Les nombreux types de modèles de conception «structurels» sont assez clairement décrits dans la référence (certains diraient de facto) de modèles de conception orientés logiciels "Modèles de conception, éléments d'un logiciel orienté objet réutilisable" mieux connue sous le nom de " Gang of Four "

Le texte "Gang of Four" décrit au moins 3 modèles bien établis appelés "Proxy", "Adaptateur" et "Façade" qui fournissent tous une fonctionnalité de type "shim". Dans la plupart des domaines, on utilise souvent des acronymes différents pour le même concept racine, ce qui crée de la confusion chez les personnes. Utiliser le mot "shim" pour décrire les modèles de conception "Structural" plus spécifiques "Proxy" , "Adaptateur" et "Façade" est certainement un exemple clair de ce type de situation. Un "shim" est simplement un terme plus général désignant les types plus spécifiques de motifs "structurels" "Proxy", "Adaptateur", "Façade" et éventuellement d'autres.

61
Doug

Quant aux origines de la Parole, dit le widget Dictionnaire d'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

Cela semble bien correspondre à la façon dont les concepteurs Web utilisent le terme.

13
Thilo

Les shims sont utilisés dans .net 4.5 Microsoft Fakes framework pour isoler votre application des autres assemblys pour les tests unitaires . Shims dirige les appels vers des méthodes spécifiques vers le code que vous écrivez dans le cadre de votre test

11
Michael Freidgeim

Selon l'article de Microsoft "Demystifying Shims" :

C’est une métaphore basée sur le mot anglais Shim, qui est un terme technique utilisé pour décrire une pièce de bois ou de métal qui est inséré entre deux objets pour les rendre plus cohérents. Dans programmation informatique, un shim est une petite bibliothèque qui transparente intercepte une API, modifie les paramètres passés, gère le fichier opération elle-même ou redirige l'opération ailleurs. Shims peut aussi être utilisé pour exécuter des programmes sur différentes plates-formes logicielles que celles-ci ont été développés pour.

J'interprète cela comme signifiant qu'une cale est un terme générique désignant toute bibliothèque de code jouant le rôle d'intermédiaire et modifiant partiellement ou totalement le comportement ou le fonctionnement d'un programme. Comme un véritable intermédiaire, cela peut affecter les données transmises à ce programme ou les données renvoyées par ce programme.

L'article utilise l'API Windows comme exemple et j'ai trouvé la phrase suivante pertinente:

L’application ignore généralement que la demande est dirigée vers un shim DLL au lieu de Windows lui-même et Windows ignore que le fichier La requête provient d’une source autre que l’application (car le shim DLL est simplement un autre DLL dans le processus de l’application).

Pour généraliser cette citation, les deux programmes qui constituent le "pain" du "sandwich à la cale" ne devraient pas pouvoir faire la différence entre parler à leur programme homologue et parler à la cale.

Quels sont les avantages et les inconvénients de l'utilisation de cales?

Encore une fois, de l'article:

Vous pouvez réparer des applications sans accès au code source ou sans les changer du tout. Vous engagez une quantité minimale de les frais généraux de gestion ... et vous pouvez réparer un nombre raisonnable d'applications de cette façon. L'inconvénient est le support en tant que la plupart des fournisseurs ne prennent pas en charge les applications shimmed. Vous ne pouvez pas réparer tous les application utilisant des cales. La plupart des gens considèrent généralement les cales pour Pour les applications où le fournisseur est en faillite, le logiciel n’est pas suffisamment stratégique pour nécessiter un soutien, ou ils veulent juste en acheter temps.

Dans le contexte de cette question, des termes tels que "proxy", "adaptateur" et "façade" ont plus de sens (du moins pour moi) après avoir lu le lien ci-dessus.

9
Richie Thomas

Le concept général - Explication simple via Cartoon

Un exemple de cale:

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

Résumé

Un shim est un code qui prend en charge ce qui est demandé (par «interception»), sans que personne ne soit plus sage à ce sujet. C'est le concept général. Veuillez vous référer aux réponses ci-dessus pour quelque chose de plus technique.

6
BKSpurgeon

Comme nous avons pu le constater dans de nombreuses réponses, un shim est une sorte d’adaptateur qui fournit une fonctionnalité au niveau de l’API qui ne faisait pas nécessairement partie de cette API. Ce fil a beaucoup de réponses positives et complètes, je ne vais donc pas élargir davantage la définition.

Cependant, je pense pouvoir ajouter un bon exemple, à savoir le Javascript ES5 Shim ( https://github.com/es-shims/es5-shim ):

Javascript a beaucoup évolué au cours des dernières années et, parmi de nombreux autres changements apportés à la spécification du langage, de nombreuses nouvelles méthodes ont été ajoutées à ses objets principaux.

Par exemple, dans la spécification ES2015 (ou ES5), la méthode find a été ajoutée au prototype Array. Supposons donc que vous exécutez votre code avec un moteur JavasScript antérieur à cette spécification (ex: Node 0.12) qui n'offre pas encore cette méthode. En chargeant le module ES5, ces nouvelles méthodes seront ajoutées au prototype Array, ce qui vous permettra de les utiliser même si vous n'exécutez pas une spécification JavaScript plus récente.

Vous pourriez vous demander: pourquoi quelqu'un ferait-il cela au lieu de mettre à niveau l'environnement vers une version plus récente (disons le noeud 8)?

Il existe de nombreux scénarios de cas réels dans lesquels cette approche est logique. Un bon exemple:

Supposons que votre système existant fonctionne dans un ancien environnement et que vous devez utiliser ces nouvelles méthodes pour implémenter/corriger une fonctionnalité. La mise à niveau de votre environnement reste un travail en cours car des problèmes de compatibilité nécessitent de nombreux changements de code et des tests (composant essentiel).

Dans cet exemple, vous pouvez essayer de créer votre propre version d'une telle fonctionnalité, mais cela rendrait votre code plus difficile à lire, plus complexe, peut introduire de nouveaux bogues et nécessitera des tonnes de tests supplémentaires pour couvrir une fonctionnalité que vous savez qu'il sera utile. être disponible dans la prochaine version.

Au lieu de cela, vous pouvez utiliser ce correctif et utiliser ces nouvelles méthodes, en tirant parti du fait que ce correctif/cette fonctionnalité sera compatible après la mise à niveau, car vous utilisez déjà les méthodes connues pour être disponibles dans la spécification suivante. Et il y a une raison supplémentaire: comme ces méthodes sont natives de la prochaine spécification de langue, il y a de fortes chances pour qu'elles s'exécutent plus rapidement que toute implémentation que vous auriez pu réaliser si vous aviez essayé de créer votre propre version.

Un autre scénario réel dans lequel une telle approche est la bienvenue est au niveau du navigateur. Supposons que vous deviez prendre en charge un ancien navigateur et que vous souhaitiez tirer parti de ces nouvelles fonctionnalités. Javascript est un langage qui vous permet d’ajouter/modifier des méthodes dans ses objets centraux (comme l’ajout de méthodes au prototype Array), et ces bibliothèques de shim sont suffisamment intelligentes pour n’ajouter de telles méthodes que si leur implémentation actuelle en manque. 

PS: 1) Vous verrez le terme "Polyfill" en rapport avec ces shims Javascript. Polyfill est un type de cale plus spécialisé utilisé pour assurer la compatibilité en aval dans différentes spécifications de niveau de navigateur. En passant, mon exemple ci-dessus se réfère exactement à un tel exemple.

2) Les shims ne sont pas limités à cet exemple (ajout de fonctionnalités qui seront disponibles dans une prochaine version). Il existe différents cas d'utilisation qui seraient également considérés comme une cale.

3) Si vous êtes curieux de savoir comment ce polyfill spécifique est implémenté, vous pouvez ouvrir Javascript Array.find specs et faire défiler jusqu’à la fin de la page où vous trouverez une implémentation canonique pour cette méthode.

3

SHIM est un autre niveau de contrôle de sécurité qui est effectué pour tous les services, afin de protéger les systèmes en amont. Le serveur SHIM valide chaque demande entrante, avec les informations d'identification de l'utilisateur d'en-tête, par rapport aux informations d'identification de l'utilisateur, qui sont transmises dans la demande (SOAP/RESTFUL).

0
Nirbhay Rana