심이 란?
Shim 정의
Wikipedia에서 :
컴퓨터 프로그래밍에서 shim 은 API를 투명하게 가로 채고 전달 된 매개 변수를 변경하거나 작업 자체를 처리하거나 다른 곳으로 작업을 리디렉션하는 작은 라이브러리입니다. Shim은 일반적으로 API의 동작이 변경 될 때 발생하므로 이전 기능에 여전히 의존하는 이전 응용 프로그램의 호환성 문제가 발생합니다. 이 경우 이전 API는 최신 코드 위에 얇은 호환성 계층에서 계속 지원할 수 있습니다. Shim은 또한 개발 된 것과 다른 소프트웨어 플랫폼에서 프로그램을 실행하는 데 사용될 수 있습니다.
Wikipedia에 정의 된 "심"이라는 용어는 그 정의에 따라 "구조"디자인 패턴으로 기술적으로 분류됩니다. 많은 유형의 "구조적"디자인 패턴은 객체 지향 소프트웨어 디자인 패턴 참조 "디자인 패턴, 재사용 가능한 객체 지향 소프트웨어의 요소 "인 "Gang of Four" 로 잘 알려져 있습니다.
"갱 네의" 적어도 3 잘 개 설립 패턴, "프록시", "어댑터"모두가 "심"유형의 기능을 제공하는 "외관"로 알려진 텍스트 설명합니다. 대부분의 분야에서 사람들의 혼동을 유발하는 동일한 근본 개념에 대해 다른 두문자어를 사용하거나 그리워하는 경우가 종종 있습니다. 보다 구체적인 "구조적"디자인 패턴 "Proxy" , "Adapter" 및 "Facade "를 설명하기 위해 "shim"이라는 단어를 사용하는 것은 확실히 이러한 유형의 상황에 대한 명확한 예입니다. "심"은보다 구체적인 유형의 "구조적"패턴 "프록시", "어댑터", "파사드"및 기타 가능성에 대한보다 일반적인 용어입니다.
만화를 통한 간단한 설명
심의 예 :
요약
심 (Shim)은 누군가가 현명하지 않고 요청한 내용 ( '인터 셉션')을 처리하는 코드입니다. 이것이 일반적인 개념입니다. 보다 기술적 인 내용은 위의 답변을 참조하십시오.
Shim은 .net 4.5 Microsoft Fakes 프레임 워크에서 사용되어 단위 테스트를 위해 다른 어셈블리와 응용 프로그램을 분리합니다 . Shims는 테스트의 일부로 작성한 코드를 작성하기 위해 특정 메소드에 대한 호출을 전환합니다.
quoth 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
이것은 웹 디자이너가이 용어를 사용하는 방법에 아주 잘 맞는 것 같습니다.
Microsoft의 기사 "Demystifying Shims" 에 따르면 :
영어 단어 shim을 기반으로 한 은유입니다.이 단어는 두 개체 사이에 삽입되어 더 잘 맞도록 나무 또는 금속 조각을 설명하는 데 사용되는 엔지니어링 용어입니다. 컴퓨터 프로그래밍에서 shim은 API를 투명하게 가로 채고 전달 된 매개 변수를 변경하거나 작업 자체를 처리하거나 다른 곳으로 작업을 리디렉션하는 작은 라이브러리입니다. Shim은 개발 된 것과 다른 소프트웨어 플랫폼에서 프로그램을 실행하는 데에도 사용할 수 있습니다.
나는 이것이 심이 중개인 역할을하고 프로그램의 동작이나 작동을 부분적으로 또는 완전히 변경하는 코드 라이브러리의 일반적인 용어임을 의미한다고 해석합니다. 진정한 중개인과 마찬가지로 해당 프로그램에 전달 된 데이터 또는 해당 프로그램에서 반환 된 데이터에 영향을 줄 수 있습니다.
이 기사에서는 Windows API를 예로 사용했으며 다음 문장과 관련이 있음을 알았습니다.
응용 프로그램은 일반적으로 요청이 Windows 자체가 아닌 shim DLL로 이동한다는 것을 인식하지 못하며 Windows는 응용 프로그램 이외의 소스에서 요청이 전송되고 있음을 인식하지 못합니다 (shim DLL은 응용 프로그램 프로세스 내의 다른 DLL이기 때문에) .
이 인용을 일반화하기 위해 "심 샌드위치"의 "빵"을 만드는 두 프로그램은 상대방 프로그램과 대화하는 것과 심과 대화하는 것을 구별 할 수 없어야합니다.
심 사용의 장단점은 무엇입니까?
다시 기사에서 :
소스 코드에 액세스하지 않거나 전혀 변경하지 않고 응용 프로그램을 수정할 수 있습니다. 최소한의 추가 관리 오버 헤드가 발생하며이 방법으로 합리적인 수의 응용 프로그램을 수정할 수 있습니다. 단점은 대부분의 공급 업체가 shimed 응용 프로그램을 지원하지 않기 때문에 지원됩니다. 심을 사용하여 모든 응용 프로그램을 수정할 수는 없습니다. 대부분의 사람들은 일반적으로 공급 업체가 운영되지 않는 응용 프로그램에 대한 shim을 고려하거나 소프트웨어가 지원을 필요로 할만큼 전략적이지 못하거나 시간을 벌고 싶어합니다.
이 질문의 맥락에서, "프록시", "어댑터"및 "파사드"와 같은 용어는 위의 링크를 읽은 후 (적어도 나에게) 더 의미가 있습니다.
여기서 많은 응답에서 알 수 있듯이 shim은 API 수준에서 기능을 제공하는 일종의 어댑터로, 반드시 해당 API의 일부는 아닙니다. 이 스레드에는 많은 훌륭한 응답이 있으므로 정의를 더 확장하지는 않습니다.
그러나 Javascript ES5 Shim ( https://github.com/es-shims/es5-shim ) 인 좋은 예를 추가 할 수 있다고 생각합니다 .
Javascript는 지난 몇 년 동안 많은 발전을 거쳤으며 언어 사양에 대한 많은 다른 변경 중에서도 많은 새로운 방법이 핵심 객체에 추가되었습니다.
예를 들어 ES2015 사양 (일명 ES5)에서이 방법 find
이 Array
프로토 타입 에 추가되었습니다 . 따라서이 방법을 아직 제공하지 않는이 사양 (예 : 노드 0.12) 이전의 JavasScript 엔진을 사용하여 코드를 실행한다고 가정 해 봅시다. ES5 shim을로드하면이 새로운 메소드가 Array
프로토 타입에 추가되어 최신 JavaScript 사양으로 실행하지 않더라도 사용할 수 있습니다.
당신은 물을 수 있습니다 : 누군가가 환경을 최신 버전으로 업그레이드하는 대신 왜 그렇게합니까 (노드 8이라고합시다)?
이러한 접근 방식이 적합한 실제 사례 시나리오가 많이 있습니다. 좋은 예가 하나 있습니다 :
Let's say you have a legacy system that is running in an old environment, and you need to use such new methods to implement/fix a functionality. The upgrade of your environment still a work in progress because there are compatibility issues that require a lot of code changes and tests (a critical component).
In this example, you could try to craft your own version of such functionality, but that would make your code harder to read, more complex, can introduce new bugs and will require tons of additional tests just to cover a functionality that you know it will be available in the next release.
Instead, you can use this shim and make use of these new methods, taking advantage of the fact that this fix/functionality will be compatible after the upgrade, because you are already using the methods known to be available in the next specification. And there is a bonus reason: since these methods are native to the next language specification, there is a good chance that they will run faster than any implementation that you could have done if you tried to make your own version.
Another real scenario where such approach is welcome is at browser level. Let's say you need to support old browser and want to take advantage of these newer features. Javascript is a language that allows you to add/modify methods in its core objects (like adding methods to Array prototype), and those shim libraries are smart enough to add such methods only if the current implementation is lacking of them.
PS: 1) You will see the term "Polyfill" related to these Javascript shims. Polyfill is a more specialized type of shim that is used to provide forward compatibility in different browser level specifications. By the way, my example above refers exactly to such example.
2) Shims are not limited to this example (adding functionality that will be available in a future release). There are different use cases that would be considered to be a shim as well.
3) If you are curious about how this specific polyfill is implemented, you can open Javascript Array.find specs and scroll to the end of the page where you will find a canonical implementation for this method.
SHIM is another level of security check which is done for all the services, to protect upstream systems. SHIM Server validates every incoming request, with Headers User credentials, against the user credentials, which are passed in the request(SOAP / RESTFUL).
참고URL : https://stackoverflow.com/questions/2116142/what-is-a-shim
'IT story' 카테고리의 다른 글
앵커 링크에 alt 태그를 사용하는 것이 맞습니까? (0) | 2020.07.20 |
---|---|
팬더 : 여러 열의 두 데이터 프레임을 병합 (결합) (0) | 2020.07.20 |
.NET 어셈블리에 텍스트 파일을 포함시키는 방법은 무엇입니까? (0) | 2020.07.20 |
PuTTY를 통해 Vi (Vim)에서 숫자 키패드 사용 (0) | 2020.07.20 |
AngularJS-$ http.post가 JSON 대신 요청 매개 변수를 보내는 방법은 무엇입니까? (0) | 2020.07.20 |