Antworten:
Aus Wikipedia:
Bei der Computerprogrammierung ist ein Shim eine kleine Bibliothek, die eine API transparent abfängt, die übergebenen Parameter ändert, die Operation selbst behandelt oder die Operation an eine andere Stelle umleitet. Shims treten normalerweise auf, wenn sich das Verhalten einer API ändert, wodurch Kompatibilitätsprobleme für ältere Anwendungen verursacht werden, die immer noch auf älteren Funktionen basieren. In diesen Fällen kann die ältere API weiterhin von einer dünnen Kompatibilitätsschicht über dem neueren Code unterstützt werden. Shims können auch verwendet werden, um Programme auf anderen Softwareplattformen auszuführen, als sie entwickelt wurden.
Der in Wikipedia definierte Begriff "Shim" würde aufgrund seiner Definition technisch als "strukturelles" Entwurfsmuster klassifiziert. Die vielen Arten von "strukturellen" Entwurfsmustern sind in der (einige würden defacto) objektorientierten Software-Entwurfsmusterreferenz "Entwurfsmuster, Elemente wiederverwendbarer objektorientierter Software", besser bekannt als "Viererbande ", ziemlich klar beschrieben .
Der "Gang of Four" -Text beschreibt mindestens drei gut etablierte Muster, die als "Proxy", "Adapter" und "Facade" bekannt sind und alle Funktionen vom Typ "Shim" bieten. In den meisten Bereichen ist es oftmals die Verwendung und / oder Fehlverwendung verschiedener Akronyme für dasselbe Wurzelkonzept, die zu Verwirrung bei den Menschen führt. Die Verwendung des Wortes "Shim" zur Beschreibung der spezifischeren "strukturellen" Entwurfsmuster "Proxy" , "Adapter" und "Fassade" ist sicherlich ein klares Beispiel für diese Art von Situation. Ein "Shim" ist einfach ein allgemeinerer Begriff für die spezifischeren Arten von "strukturellen" Mustern "Proxy", "Adapter", "Fassade" und möglicherweise andere.
Ein Beispiel für eine Unterlegscheibe:
Hinweis: Die Analogie ist angespannt. Normalerweise bekommt Ralph genau das, wonach er gefragt hat - aber die Mechanik, wie es erhalten wurde, ist etwas, das er vielleicht nicht erwartet.
Ein Shim ist ein Code, der sich darum kümmert, was gefragt wird (durch "Abfangen"), ohne dass jemand darüber klüger ist. Dies ist das allgemeine Konzept. Jetzt sollten Sie in der Lage sein, den Wikipedia-Eintrag über Unterlegscheiben zu lesen und zu verstehen.
Bezüglich der Ursprünge des Wortes, sagt Apples Wörterbuch-Widget
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
Dies scheint ziemlich gut dazu zu passen, wie Webdesigner den Begriff verwenden.
Shims werden in .net 4.5 Microsoft Fakes Framework verwendet , um Ihre Anwendung für Unit-Tests von anderen Assemblys zu isolieren . Shims leiten Aufrufe an bestimmte Methoden um, um Code zu codieren, den Sie im Rahmen Ihres Tests schreiben
Laut Microsofts Artikel "Demystifying Shims" :
Es ist eine Metapher, die auf dem englischsprachigen Wort Shim basiert. Dieser technische Begriff beschreibt ein Stück Holz oder Metall, das zwischen zwei Objekten eingefügt wird, damit sie besser zusammenpassen. Bei der Computerprogrammierung ist ein Shim eine kleine Bibliothek, die eine API transparent abfängt, die übergebenen Parameter ändert, die Operation selbst handhabt oder die Operation an eine andere Stelle umleitet. Shims können auch zum Ausführen von Programmen auf anderen Softwareplattformen verwendet werden, als sie entwickelt wurden.
Ich interpretiere dies so, dass ein Shim ein Oberbegriff für jede Codebibliothek ist, die als Vermittler fungiert und das Verhalten oder den Betrieb eines Programms teilweise oder vollständig ändert. Wie ein echter Mittelsmann kann dies Auswirkungen auf die an dieses Programm übergebenen Daten oder auf die von diesem Programm zurückgegebenen Daten haben.
Der Artikel verwendet die Windows-API als Beispiel, und ich fand den folgenden Satz relevant:
Der Anwendung ist im Allgemeinen nicht bekannt, dass die Anforderung an eine Shim-DLL anstatt an Windows selbst gesendet wird, und Windows ist nicht bekannt, dass die Anforderung von einer anderen Quelle als der Anwendung stammt (da die Shim-DLL nur eine andere DLL im Prozess der Anwendung ist). .
Um dieses Zitat zu verallgemeinern, sollten die beiden Programme, die das "Brot" des "Shim-Sandwichs" herstellen, nicht in der Lage sein, zwischen Gesprächen mit ihrem Gegenprogramm und Gesprächen mit dem Shim zu unterscheiden.
Was sind einige Vor- und Nachteile der Verwendung von Unterlegscheiben?
Nochmals aus dem Artikel:
Sie können Anwendungen reparieren, ohne auf den Quellcode zuzugreifen oder sie überhaupt zu ändern. Sie verursachen nur einen minimalen zusätzlichen Verwaltungsaufwand ... und können auf diese Weise eine angemessene Anzahl von Anwendungen reparieren. Der Nachteil ist die Unterstützung, da die meisten Anbieter keine Shimmed-Anwendungen unterstützen. Sie können nicht jede Anwendung mit Unterlegscheiben reparieren. Die meisten Leute ziehen normalerweise Shims für Anwendungen in Betracht, bei denen der Anbieter nicht im Geschäft ist, die Software nicht strategisch genug ist, um Support zu benötigen, oder sie möchten einfach nur etwas Zeit kaufen.
Im Zusammenhang mit dieser Frage sind Begriffe wie "Proxy", "Adapter" und "Fassade" (zumindest für mich) nach dem Lesen des obigen Links sinnvoller.
Wie wir in vielen Antworten hier sehen konnten, ist ein Shim eine Art Adapter, der Funktionen auf API-Ebene bereitstellt, die nicht unbedingt Teil dieser API waren. Dieser Thread hat viele gute und vollständige Antworten, daher werde ich die Definition nicht weiter erweitern.
Ich denke jedoch, ich kann ein gutes Beispiel hinzufügen, nämlich das Javascript ES5 Shim ( https://github.com/es-shims/es5-shim ):
Javascript hat sich in den letzten Jahren stark weiterentwickelt, und neben vielen anderen Änderungen an der Sprachspezifikation wurden seinen Kernobjekten viele neue Methoden hinzugefügt.
In der ES2015-Spezifikation (auch bekannt als ES5) wurde die Methode beispielsweise find
dem Array
Prototyp hinzugefügt . Angenommen, Sie führen Ihren Code vor dieser Spezifikation (z. B. Knoten 0.12) mit einer JavasScript-Engine aus, die diese Methode noch nicht bietet. Durch das Laden des ES5-Shims werden diese neuen Methoden zum Array
Prototyp hinzugefügt , sodass Sie sie auch dann verwenden können, wenn Sie nicht mit einer neueren JavaScript-Spezifikation arbeiten.
Sie könnten fragen: Warum sollte jemand das tun, anstatt die Umgebung auf eine neuere Version zu aktualisieren (sagen wir Knoten 8)?
Es gibt viele reale Szenarien, in denen dieser Ansatz sinnvoll ist. Ein gutes Beispiel:
Angenommen, Sie haben ein Legacy-System, das in einer alten Umgebung ausgeführt wird, und Sie müssen solche neuen Methoden verwenden, um eine Funktionalität zu implementieren / zu reparieren. Das Upgrade Ihrer Umgebung ist noch in Arbeit, da es Kompatibilitätsprobleme gibt, die viele Codeänderungen und -tests erfordern (eine wichtige Komponente).
In diesem Beispiel könnten Sie versuchen, eine eigene Version dieser Funktionalität zu erstellen. Dies würde jedoch das Lesen Ihres Codes erschweren, komplexer machen, neue Fehler verursachen und unzählige zusätzliche Tests erfordern, nur um eine Funktionalität abzudecken, von der Sie wissen, dass sie es tun wird in der nächsten Version verfügbar sein.
Stattdessen können Sie diesen Shim verwenden und diese neuen Methoden verwenden, wobei Sie die Tatsache ausnutzen, dass dieser Fix / diese Funktionalität nach dem Upgrade kompatibel ist, da Sie bereits die Methoden verwenden, von denen bekannt ist, dass sie in der nächsten Spezifikation verfügbar sind. Und es gibt einen Bonusgrund: Da diese Methoden in der nächsten Sprachspezifikation enthalten sind, besteht eine gute Chance, dass sie schneller ausgeführt werden als jede Implementierung, die Sie hätten durchführen können, wenn Sie versucht hätten, Ihre eigene Version zu erstellen.
Ein weiteres reales Szenario, in dem ein solcher Ansatz erwünscht ist, ist auf Browserebene. Angenommen, Sie müssen den alten Browser unterstützen und diese neueren Funktionen nutzen. Javascript ist eine Sprache, mit der Sie Methoden in ihren Kernobjekten hinzufügen / ändern können (z. B. Methoden zum Array-Prototyp hinzufügen). Diese Shim-Bibliotheken sind intelligent genug, um solche Methoden nur hinzuzufügen, wenn die aktuelle Implementierung keine enthält.
PS: 1) Sie werden den Begriff "Polyfill" sehen, der sich auf diese Javascript-Shims bezieht. Polyfill ist eine speziellere Art von Shim, die verwendet wird, um Vorwärtskompatibilität in verschiedenen Spezifikationen auf Browserebene bereitzustellen. Mein Beispiel oben bezieht sich übrigens genau auf ein solches Beispiel.
2) Unterlegscheiben sind nicht auf dieses Beispiel beschränkt (Hinzufügen von Funktionen, die in einer zukünftigen Version verfügbar sein werden). Es gibt verschiedene Anwendungsfälle, die ebenfalls als Unterlegscheibe betrachtet werden.
3) Wenn Sie neugierig sind, wie diese spezielle Polyfüllung implementiert wird, können Sie die Javascript Array.find- Spezifikationen öffnen und zum Ende der Seite scrollen, wo Sie eine kanonische Implementierung für diese Methode finden.
SHIM ist eine weitere Sicherheitsstufe, die für alle Dienste durchgeführt wird, um vorgelagerte Systeme zu schützen. SHIM Server überprüft jede eingehende Anforderung mit Header-Benutzeranmeldeinformationen anhand der Benutzeranmeldeinformationen, die in der Anforderung übergeben werden (SOAP / RESTFUL).