답변:
Wikipedia에서 :
컴퓨터 프로그래밍에서 shim 은 API를 투명하게 가로 채고 전달 된 매개 변수를 변경하거나 작업 자체를 처리하거나 다른 곳으로 작업을 리디렉션하는 작은 라이브러리입니다. Shim은 일반적으로 API의 동작이 변경 될 때 발생하므로 이전 기능에 여전히 의존하는 이전 응용 프로그램의 호환성 문제가 발생합니다. 이 경우 이전 API는 최신 코드 위에 얇은 호환성 계층에서 계속 지원할 수 있습니다. Shim은 또한 개발 된 것과 다른 소프트웨어 플랫폼에서 프로그램을 실행하는 데 사용될 수 있습니다.
Wikipedia에 정의 된 "심"이라는 용어는 그 정의에 따라 "구조"디자인 패턴으로 기술적으로 분류됩니다. 많은 유형의 "구조적"디자인 패턴은 객체 지향 소프트웨어 디자인 패턴 참조 "디자인 패턴, 재사용 가능한 객체 지향 소프트웨어의 요소 "인 "Gang of Four"에 더 잘 설명되어 있습니다.
"갱 네의" 적어도 3 잘 개 설립 패턴, "프록시", "어댑터"모두가 "심"유형의 기능을 제공하는 "외관"로 알려진 텍스트 설명합니다. 대부분의 분야에서 사람들의 혼동을 유발하는 동일한 근본 개념에 대해 다른 약어를 사용하거나 그리워하는 경우가 종종 있습니다. 보다 구체적인 "구조적"디자인 패턴 "Proxy" , "Adapter" 및 "Facade "를 설명하기 위해 "shim"이라는 단어를 사용하는 것은 확실히 이러한 유형의 상황에 대한 명확한 예입니다. "심"은보다 구체적인 유형의 "구조적"패턴 "프록시", "어댑터", "파사드"및 기타 가능성에 대한보다 일반적인 용어입니다.
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
이것은 웹 디자이너가이 용어를 사용하는 방법에 아주 잘 맞는 것 같습니다.
Shim은 .net 4.5 Microsoft Fakes 프레임 워크에서 사용되어 단위 테스트를 위해 다른 어셈블리와 응용 프로그램을 분리합니다 . Shims는 테스트의 일부로 작성한 코드를 작성하기 위해 특정 메소드에 대한 호출을 전환합니다.
Microsoft의 기사 "Demystifying Shims" 에 따르면 :
영어 단어 shim을 기반으로 한 은유입니다. 두 단어 사이에 삽입되어 서로 잘 맞도록 나무 또는 금속 조각을 설명하는 데 사용되는 엔지니어링 용어입니다. 컴퓨터 프로그래밍에서 shim은 API를 투명하게 가로 채고 전달 된 매개 변수를 변경하거나 작업 자체를 처리하거나 다른 곳으로 작업을 리디렉션하는 작은 라이브러리입니다. Shim은 개발 된 것과 다른 소프트웨어 플랫폼에서 프로그램을 실행하는 데에도 사용할 수 있습니다.
나는 이것을 shim이 중개인 역할을하고 프로그램의 동작이나 작동을 부분적으로 또는 완전히 변경하는 모든 코드 라이브러리에 대한 일반적인 용어임을 의미합니다. 진정한 중개인과 마찬가지로 해당 프로그램에 전달 된 데이터 또는 해당 프로그램에서 반환 된 데이터에 영향을 줄 수 있습니다.
이 기사에서는 Windows API를 예로 사용했으며 다음 문장과 관련이 있음을 알았습니다.
응용 프로그램은 일반적으로 요청이 Windows 자체가 아닌 shim DLL로 이동한다는 것을 인식하지 못하며 Windows는 응용 프로그램 이외의 소스에서 요청이 들어오는 것을 인식하지 못합니다 (shim DLL은 응용 프로그램 프로세스 내의 다른 DLL이기 때문에) .
이 인용을 일반화하기 위해 "심 샌드위치"의 "빵"을 만드는 두 프로그램은 상대방 프로그램과 대화하는 것과 심과 대화하는 것을 구별 할 수 없어야합니다.
심 사용의 장단점은 무엇입니까?
다시 기사에서 :
소스 코드에 액세스하지 않거나 전혀 변경하지 않고 응용 프로그램을 수정할 수 있습니다. 최소한의 추가 관리 오버 헤드가 발생하며이 방법으로 합리적인 수의 응용 프로그램을 수정할 수 있습니다. 단점은 대부분의 공급 업체가 shimed 응용 프로그램을 지원하지 않기 때문에 지원됩니다. shim을 사용하여 모든 응용 프로그램을 수정할 수는 없습니다. 대부분의 사람들은 일반적으로 공급 업체가 운영되지 않는 응용 프로그램에 대한 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이라고합시다)?
이러한 접근 방식이 적합한 실제 사례 시나리오가 많이 있습니다. 좋은 예가 하나 있습니다 :
이전 환경에서 실행되는 레거시 시스템이 있고 기능을 구현 / 수정하려면 이러한 새로운 방법을 사용해야한다고 가정 해 봅시다. 많은 코드 변경 및 테스트 (중요한 구성 요소)가 필요한 호환성 문제가 있기 때문에 환경 업그레이드가 여전히 진행 중입니다.
이 예제에서는 이러한 기능의 자체 버전을 만들려고 시도 할 수 있지만 코드를 읽기 어렵고 복잡하게 만들 수 있으며 새로운 버그가 발생할 수 있으며 알고있는 기능을 다루기 위해 수많은 추가 테스트가 필요합니다. 다음 릴리스에서 사용할 수 있습니다.
대신 다음 사양에서 사용 가능한 것으로 알려진 방법을 이미 사용하고 있기 때문에 업그레이드 후에이 수정 / 기능이 호환된다는 사실을 이용하여이 shim을 사용하고 새로운 방법을 사용할 수 있습니다. 그리고 보너스 이유가 있습니다. 이러한 방법은 다음 언어 사양에 고유하기 때문에 자신의 버전을 만들려고 시도했을 때 수행 할 수있는 구현보다 더 빠르게 실행될 가능성이 높습니다.
그러한 접근이 환영받는 또 다른 실제 시나리오는 브라우저 수준입니다. 이전 브라우저를 지원해야하며 이러한 새로운 기능을 활용하고 싶다고 가정 해 봅시다. Javascript는 핵심 개체에 메소드를 추가 / 수정할 수있는 언어이며 (예 : Array 프로토 타입에 메소드 추가), 해당 shim 라이브러리는 현재 구현에 부족한 경우에만 이러한 메소드를 추가 할 수있을 정도로 똑똑합니다.
PS : 1)이 Javascript shim과 관련된 "Polyfill"이라는 용어가 표시됩니다. Polyfill은 다른 브라우저 수준 사양에서 순방향 호환성을 제공하는 데 사용되는보다 전문화 된 shim 유형입니다. 그건 그렇고, 위의 예는 정확히 그러한 예를 나타냅니다.
2) 심은이 예제로 제한되지 않습니다 (향후 릴리스에서 사용할 수있는 기능 추가). 심으로 간주되는 다른 사용 사례도 있습니다.
3)이 특정 폴리 필이 어떻게 구현되는지 궁금하다면 Javascript Array.find 스펙을 열고이 메소드에 대한 표준 구현을 찾을 수있는 페이지 끝으로 스크롤하십시오.