回答:
ウィキペディアから:
コンピュータープログラミングでは、shimは小さなライブラリーであり、APIを透過的にインターセプトし、渡されたパラメーターを変更し、操作自体を処理するか、操作を別の場所にリダイレクトします。シムは通常、APIの動作が変更されたときに発生し、それによって古い機能に依存する古いアプリケーションの互換性の問題を引き起こします。これらの場合でも、古いAPIは新しいコードの上にある薄い互換性レイヤーによってサポートされます。Shimsは、開発されたものとは異なるソフトウェアプラットフォームでプログラムを実行するためにも使用できます。
ウィキペディアで定義されている「シム」という用語は、その定義に基づいて、「構造」デザインパターンとして技術的に分類されます。多くのタイプの「構造」設計パターンは、「4つのギャング」としてよく知られている「設計パターン、再利用可能なオブジェクト指向ソフトウェアの要素」を参照する(一部はデファクトと呼ばれる)オブジェクト指向ソフトウェア設計パターンで非常に明確に記述されています。
「ギャングつの」文字輪郭「プロキシ」として知られている少なくとも3十分に確立されたパターンは、すべての「シム」タイプの機能を提供する「アダプター」と「外観」。ほとんどの分野では、多くの場合、人々を混乱させるのは、同じ根本概念に対してさまざまな頭字語を使用したり使用しなかったりすることです。「shim」という単語を使用して、より具体的な「構造」設計パターン「プロキシ」、「アダプタ」を説明する、「ファサード」を説明することは、このタイプの状況の明確な例です。「シム」は、より具体的なタイプの「構造」パターン「プロキシ」、「アダプタ」、「ファサード」、および場合によっては他のものを表す、より一般的な用語です。
シムの例:
注:類推は緊張しています。通常、ラルフは彼が要求したものを正確に取得します-しかし、それがどのように取得されたかのメカニズムは、彼が期待しないかもしれないものです。
Shimは、(「傍受」によって)質問された内容を処理するコードです。誰もそれについて賢くする必要はありません。これが一般的な概念です。これで、shimのWikipediaエントリを読んで理解できるようになります。
シムは.net 4.5 Microsoft Fakesフレームワークで使用され 、ユニットテストのためにアプリケーションを他のアセンブリから分離します。シムは、テストの一部として記述したコードへの特定のメソッドへの呼び出しを迂回させます
マイクロソフトの記事「シムの謎解き」によると:
これは、英語の単語シムに基づくメタファーです。シムは、2つのオブジェクトの間に挿入され、それらをよりよくフィットさせるために挿入される木片または金属片を説明するために使用されるエンジニアリング用語です。コンピュータープログラミングでは、shimは小さなライブラリであり、APIを透過的にインターセプトし、渡されたパラメーターを変更し、操作自体を処理するか、操作を別の場所にリダイレクトします。Shimsは、開発されたものとは異なるソフトウェアプラットフォームでプログラムを実行するためにも使用できます。
私はこれを、shimが仲介者として機能し、プログラムの動作または操作を部分的または完全に変更するコードライブラリの総称であると解釈します。真の仲介者のように、そのプログラムに渡されるデータや、そのプログラムから返されるデータに影響を与える可能性があります。
この記事ではWindows APIを例として使用しており、次の文が関連していることがわかりました。
アプリケーションは通常、要求がWindows自体ではなくshim DLLに送られることを認識していません。また、Windowsは、要求がアプリケーション以外のソースから送られていることを認識していません(shim DLLはアプリケーションのプロセス内の単なる別のDLLであるため) 。
この引用を一般化するために、「シムサンドイッチ」の「パン」を作成する2つのプログラムは、対応するプログラムと話すこととシムと話すことを区別できないはずです。
シムを使用することの長所と短所は何ですか?
繰り返しますが、記事から:
ソースコードにアクセスせずに、またはまったく変更せずに、アプリケーションを修正できます。最小限の追加の管理オーバーヘッドが発生します...この方法で、適切な数のアプリケーションを修正できます。ほとんどのベンダーはシム化されたアプリケーションをサポートしていないため、欠点はサポートです。シムを使用してすべてのアプリケーションを修正することはできません。ほとんどの人は通常、ベンダーが廃業しているアプリケーション、サポートを必要とするほどソフトウェアが戦略的でない、または単に時間を購入したいシムを検討します。
この質問のコンテキストでは、「プロキシ」、「アダプタ」、「ファサード」などの用語は、上記のリンクを読んだ後、(少なくとも私にとって)より意味があります。
ここで多くの応答からわかるように、shimは、必ずしもそのAPIの一部ではないAPIレベルで機能を提供する一種のアダプターです。このスレッドには多くの優れた完全な応答があるため、定義をさらに拡張することはしません。
ただし、Javascript ES5 Shim(https://github.com/es-shims/es5-shim)などの良い例を追加できると思います。)。
Javascriptはここ数年で大きく進化しており、言語仕様に対する他の多くの変更の中で、コアオブジェクトに多くの新しいメソッドが追加されています。
たとえば、ES2015仕様(別名ES5)では、メソッドfind
がArray
プロトタイプに追加されています。そのため、この仕様より前のJavasScriptエンジン(例:ノード0.12)を使用してコードを実行しているとしましょう。このエンジンはまだそのメソッドを提供していません。ES5シムをロードすると、これらの新しいメソッドがArray
プロトタイプにれ、新しいJavaScript仕様で実行していない場合でも利用できるようになります。
あなたは尋ねるかもしれません:なぜ誰かが環境を新しいバージョン(ノード8としましょう)にアップグレードする代わりにそれをするのですか?
そのアプローチが理にかなっている実際のケースのシナリオはたくさんあります。1つの良い例:
古い環境で実行されているレガシーシステムがあり、そのような新しいメソッドを使用して機能を実装/修正するとします。多くのコード変更とテスト(重要なコンポーネント)を必要とする互換性の問題があるため、環境のアップグレードはまだ進行中の作業です。
この例では、そのような機能の独自のバージョンを作成しようとすることができますが、コードが読みにくくなり、より複雑になり、新しいバグが発生する可能性があり、知っている機能をカバーするためだけに多くの追加テストが必要になります次のリリースで利用可能になる予定です。
代わりに、このシムを使用して、これらの新しい方法を利用できます。この修正/機能は、アップグレード後に互換性があるという事実を利用しています。これは、次の仕様で利用できることがわかっている方法をすでに使用しているためです。また、ボーナスの理由もあります。これらのメソッドは次の言語仕様にネイティブであるため、独自のバージョンを作成しようとした場合に実行できるどの実装よりも速く実行される可能性が高くなります。
このようなアプローチが歓迎されるもう1つの実際のシナリオは、ブラウザーレベルです。古いブラウザをサポートする必要があり、これらの新しい機能を利用したいとします。JavaScriptは、コアオブジェクトのメソッドを追加/変更できるようにする言語です(Arrayプロトタイプへのメソッドの追加など)。これらのシムライブラリは、現在の実装にメソッドが不足している場合にのみ、そのようなメソッドを追加するのに十分スマートです。
PS:1)これらのJavascriptシムに関連する「ポリフィル」という用語が表示されます。ポリフィルは、さまざまなブラウザーレベルの仕様での上位互換性を提供するために使用される、より特殊なタイプのシムです。ちなみに、上記の私の例は、まさにそのような例を参照しています。
2)Shimsはこの例に限定されません(将来のリリースで利用可能になる機能が追加されます)。シムと見なされるさまざまなユースケースもあります。
3)この特定のポリフィルの実装方法に興味がある場合は、Javascript Array.find仕様を開いて、このメソッドの標準的な実装が見つかるページの最後までスクロールできます。