Quelle est la définition d'un Shim?
la source
De Wikipedia:
En programmation informatique, un shim est une petite bibliothèque qui intercepte de manière transparente une API, en modifiant les paramètres passés, en gérant l'opération elle-même ou en redirigeant l'opération ailleurs. Les shims surviennent généralement lorsque le comportement d'une API change, provoquant ainsi des problèmes de compatibilité pour les applications plus anciennes qui reposent toujours sur les fonctionnalités plus anciennes. Dans ces cas, l'ancienne API peut toujours être prise en charge par une fine couche de compatibilité en plus du code le plus récent. Les shims peuvent également être utilisés pour exécuter des programmes sur des plates-formes logicielles différentes de celles pour lesquelles ils ont été développés.
Le terme «cale» tel que défini dans Wikipédia serait techniquement classé, sur la base de sa définition, comme un 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) des modèles de conception de logiciels orientés objet "Design Patterns, Elements of Reusable Object-Oriented Software" mieux connu sous le nom de "Gang of Four" .
Le texte "Gang of Four" décrit au moins 3 modèles bien établis connus sous le nom de "Proxy", "Adapter" et "Facade" qui fournissent tous des fonctionnalités de type "shim". Dans la plupart des domaines, il arrive souvent que l'utilisation et / ou l'absence d'acronymes différents pour le même concept racine cause de la confusion chez les gens. L'utilisation du mot «cale» pour décrire les modèles de conception «structurels» plus spécifiques « Proxy» , «Adapter» et «Façade» est certainement un exemple clair de ce type de situation. Un «shim» est simplement un terme plus général pour les types plus spécifiques de motifs «structurels» «Proxy», «Adapter», «Façade» et éventuellement d'autres.
la source
Explication simple via Cartoon
Un exemple de cale:
Résumé
Remarque: l'analogie est tendue. Habituellement, Ralph obtiendra EXACTEMENT ce qu'il a demandé - mais la mécanique de la façon dont il a été obtenu est quelque chose auquel il ne pouvait pas s'attendre.
Un shim est un code qui s'occupe de ce qui est demandé (par «interception»), sans que personne n'en soit plus sage. C'est le concept général. Vous devriez maintenant pouvoir lire et comprendre l'entrée wikipedia sur les shims.
la source
Quant aux origines du mot, dit le widget Dictionnaire d'Apple
Cela semble bien correspondre à la manière dont les concepteurs Web utilisent le terme.
la source
Les shims sont utilisés dans le framework .net 4.5 Microsoft Fakes pour isoler votre application des autres assemblys pour les tests unitaires . Les shims détournent les appels vers des méthodes spécifiques vers du code que vous écrivez dans le cadre de votre test
la source
Selon l'article de Microsoft "Demystifying Shims" :
J'interprète cela comme signifiant qu'un shim est un terme générique pour toute bibliothèque de code qui agit comme un intermédiaire et modifie partiellement ou complètement le comportement ou le fonctionnement d'un programme. Comme un véritable intermédiaire, il peut affecter les données transmises à ce programme ou affecter les données renvoyées par ce programme.
L'article utilise l'API Windows comme exemple, et j'ai trouvé la phrase suivante pertinente:
Pour généraliser cette citation, les deux programmes qui font le "pain" du "shim sandwich" ne doivent pas être capables de faire la différence entre parler à leur programme homologue et parler au shim.
Quels sont les avantages et les inconvénients de l'utilisation de cales?
Encore une fois, d'après l'article:
Dans le contexte de cette question, des termes comme «proxy», «adaptateur» et «façade» ont plus de sens (du moins pour moi) après avoir lu le lien ci-dessus.
la source
Comme nous avons pu le voir dans de nombreuses réponses ici, un shim est une sorte d'adaptateur qui fournit des fonctionnalités au niveau de l'API qui ne faisaient pas nécessairement partie de cette API. Ce fil a beaucoup de bonnes réponses complètes, donc je n'élargis pas davantage la définition.
Cependant, je pense que je peux ajouter un bon exemple, qui est 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 de base.
Par exemple, dans la spécification ES2015 (alias ES5), la méthode
find
a été ajoutée auArray
prototype. Supposons que vous exécutiez votre code en utilisant un moteur JavasScript antérieur à cette spécification (ex: Node 0.12) qui n'offre pas encore cette méthode. En chargeant le shim ES5, ces nouvelles méthodes seront ajoutées auArray
prototype, vous permettant de les utiliser même si vous n'utilisez 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 Node 8)?
Il existe de nombreux scénarios de cas réels où cette approche a du sens. Un bon exemple:
Disons que vous avez un système hérité qui s'exécute dans un ancien environnement et que vous devez utiliser ces nouvelles méthodes pour implémenter / réparer une fonctionnalité. La mise à niveau de votre environnement est toujours en cours car il y a des problèmes de compatibilité qui nécessitent beaucoup de changements de code et de tests (un composant critique).
Dans cet exemple, vous pouvez essayer de créer votre propre version de cette fonctionnalité, mais cela rendrait votre code plus difficile à lire, plus complexe, pourrait introduire de nouveaux bogues et nécessiterait des tonnes de tests supplémentaires juste pour couvrir une fonctionnalité dont vous savez qu'elle le fera. être disponible dans la prochaine version.
Au lieu de cela, vous pouvez utiliser ce shim et utiliser ces nouvelles méthodes, en tirant parti du fait que ce correctif / 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: puisque ces méthodes sont natives de la spécification de langage suivante, il y a de fortes chances qu'elles s'exécutent plus rapidement que toute implémentation que vous auriez pu faire si vous aviez essayé de créer votre propre version.
Un autre scénario réel où une telle approche est la bienvenue est au niveau du navigateur. Disons que vous devez prendre en charge l'ancien navigateur et que vous souhaitez profiter de ces nouvelles fonctionnalités. Javascript est un langage qui vous permet d'ajouter / modifier des méthodes dans ses objets de base (comme l'ajout de méthodes au prototype Array), et ces bibliothèques de shim sont suffisamment intelligentes pour ajouter de telles méthodes uniquement si l'implémentation actuelle en manque.
PS: 1) Vous verrez le terme "Polyfill" lié à ces shims Javascript. Polyfill est un type de cale plus spécialisé qui est utilisé pour fournir une compatibilité ascendante dans différentes spécifications de niveau de navigateur. À propos, 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 un shim.
3) Si vous êtes curieux de savoir comment ce polyfill spécifique est implémenté, vous pouvez ouvrir les spécifications Javascript Array.find et faire défiler jusqu'à la fin de la page où vous trouverez une implémentation canonique pour cette méthode.
la source
SHIM est un autre niveau de contrôle de sécurité qui est effectué pour tous les services, pour protéger les systèmes en amont. SHIM Server valide chaque demande entrante, avec les informations d'identification de l'utilisateur d'en-têtes, par rapport aux informations d'identification de l'utilisateur, qui sont transmises dans la demande (SOAP / RESTFUL).
la source