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