Qu'est-ce qu'une cale?

Réponses:

92

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.

Prasoon Saurav
la source
83
Cette réponse n'est pas différente de faire une véritable recherche google sur wikipedia. Un exemple serait bien.
dance2die
4
Cela ressemble à une utilisation du modèle de conception de façade pour l'interfaçage des bibliothèques.
blz
84

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.

Doug
la source
5
Cette réponse indique qu'une cale est un modèle de conception (l'un des nombreux), nomme des modèles de conception similaires et va dans une tangente sur la façon dont les gens se confondent avec différents acronymes. Mais cela ne répond pas réellement à la question initiale de savoir ce qu'est une cale, ce qu'elle fait ou comment elle est utilisée.
Richie Thomas
53

Explication simple via Cartoon

Un exemple de cale:

Mon chien Ralph est un chanceux bash-tard (double jeu de mots)

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.

BKSpurgeon
la source
14

Quant aux origines du mot, 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 manière dont les concepteurs Web utilisent le terme.

Thilo
la source
12

Selon l'article de Microsoft "Demystifying Shims" :

C'est une métaphore basée sur le mot anglais shim, qui est un terme d'ingénierie utilisé pour décrire un morceau de bois ou de métal qui est inséré entre deux objets pour mieux les assembler. En programmation informatique, un shim est une petite bibliothèque qui intercepte de manière transparente une API, modifie les paramètres passés, gère l'opération elle-même ou redirige l'opération ailleurs. 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.

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:

L'application ne sait généralement pas que la requête va à une DLL de shim au lieu de Windows lui-même, et Windows ne sait pas que la requête provient d'une source autre que l'application (car la DLL de shim est juste une autre DLL dans le processus de l'application) .

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:

Vous pouvez réparer les applications sans accéder au code source, ou sans les modifier du tout. Vous engagez un minimum de frais de gestion supplémentaires ... et vous pouvez corriger un nombre raisonnable d'applications de cette façon. L'inconvénient est le support car la plupart des fournisseurs ne prennent pas en charge les applications shimmed. Vous ne pouvez pas réparer toutes les applications à l'aide de shims. La plupart des gens envisagent généralement des cales pour les applications où le fournisseur est en faillite, le logiciel n'est pas suffisamment stratégique pour nécessiter une assistance ou ils veulent simplement gagner du temps.

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.

Richie Thomas
la source
3

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 finda été ajoutée au Arrayprototype. 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 au Arrayprototype, 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.

David Rissato Cruz
la source
0

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).

Nirbhay Rana
la source