Was ist die Definition eines Shim?
terminology
definition
vocabulary
shim
Nanook
quelle
quelle
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.
quelle
Einfache Erklärung über Cartoon
Ein Beispiel für eine Unterlegscheibe:
Zusammenfassung
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.
quelle
Bezüglich der Ursprünge des Wortes, sagt Apples Wörterbuch-Widget
Dies scheint ziemlich gut dazu zu passen, wie Webdesigner den Begriff verwenden.
quelle
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
quelle
Laut Microsofts Artikel "Demystifying Shims" :
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:
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:
Im Zusammenhang mit dieser Frage sind Begriffe wie "Proxy", "Adapter" und "Fassade" (zumindest für mich) nach dem Lesen des obigen Links sinnvoller.
quelle
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
demArray
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 zumArray
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.
quelle
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).
quelle