심이 란?


답변:


92

Wikipedia에서 :

컴퓨터 프로그래밍에서 shim 은 API를 투명하게 가로 채고 전달 된 매개 변수를 변경하거나 작업 자체를 처리하거나 다른 곳으로 작업을 리디렉션하는 작은 라이브러리입니다. Shim은 일반적으로 API의 동작이 변경 될 때 발생하므로 이전 기능에 여전히 의존하는 이전 응용 프로그램의 호환성 문제가 발생합니다. 이 경우 이전 API는 최신 코드 위에 얇은 호환성 계층에서 계속 지원할 수 있습니다. Shim은 또한 개발 된 것과 다른 소프트웨어 플랫폼에서 프로그램을 실행하는 데 사용될 수 있습니다.


83
이 답변은 Wikipedia에서 실제 Google 검색을 수행하는 것과 다르지 않습니다. 좋은 예가 될 것입니다.
dance2die

4
인터페이스 라이브러리에 Facade 디자인 패턴을 사용하는 것 같습니다.
blz

84

Wikipedia에 정의 된 "심"이라는 용어는 그 정의에 따라 "구조"디자인 패턴으로 기술적으로 분류됩니다. 많은 유형의 "구조적"디자인 패턴은 객체 지향 소프트웨어 디자인 패턴 참조 "디자인 패턴, 재사용 가능한 객체 지향 소프트웨어의 요소 "인 "Gang of Four"에 더 잘 설명되어 있습니다.

"갱 네의" 적어도 3 잘 개 설립 패턴, "프록시", "어댑터"모두가 "심"유형의 기능을 제공하는 "외관"로 알려진 텍스트 설명합니다. 대부분의 분야에서 사람들의 혼동을 유발하는 동일한 근본 개념에 대해 다른 약어를 사용하거나 그리워하는 경우가 종종 있습니다. 보다 구체적인 "구조적"디자인 패턴 "Proxy" , "Adapter""Facade "를 설명하기 위해 "shim"이라는 단어를 사용하는 것은 확실히 이러한 유형의 상황에 대한 명확한 예입니다. "심"은보다 구체적인 유형의 "구조적"패턴 "프록시", "어댑터", "파사드"및 기타 가능성에 대한보다 일반적인 용어입니다.


5
이 답변은 심이 디자인 패턴 (많은 것 중 하나)이고 유사한 디자인 패턴의 이름을 나타내며 사람들이 다른 두문자어에 의해 어떻게 혼란스러워하는지에 대한 접선을 나타냅니다. 그러나 실제로 심이 무엇인지, 무엇을하는지, 어떻게 사용되는지에 대한 원래의 질문에 대답하지 않습니다.
Richie Thomas

53

만화를 통한 간단한 설명

심의 예 :

My Dog Ralph는 행운의 bash-tard입니다.

요약

참고 : 유추가 왜곡됩니다. 일반적으로 Ralph는 그가 요구 한 것을 정확히 얻을 것입니다. 그러나 그것을 얻는 방법은 그가 예상하지 못한 것입니다.

심 (Shim)은 누군가가 아무리 현명하지 않아도 ( '인터 셉션'으로) 요청 된 내용을 처리하는 코드입니다. 이것이 일반적인 개념입니다. 이제 심에 대한 위키 백과 항목을 읽고 이해할 수 있어야합니다.


13

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

이것은 웹 디자이너가이 용어를 사용하는 방법에 아주 잘 맞는 것 같습니다.



12

Microsoft의 기사 "Demystifying Shims" 에 따르면 :

영어 단어 shim을 기반으로 한 은유입니다. 두 단어 사이에 삽입되어 서로 잘 맞도록 나무 또는 금속 조각을 설명하는 데 사용되는 엔지니어링 용어입니다. 컴퓨터 프로그래밍에서 shim은 API를 투명하게 가로 채고 전달 된 매개 변수를 변경하거나 작업 자체를 처리하거나 다른 곳으로 작업을 리디렉션하는 작은 라이브러리입니다. Shim은 개발 된 것과 다른 소프트웨어 플랫폼에서 프로그램을 실행하는 데에도 사용할 수 있습니다.

나는 이것을 shim이 중개인 역할을하고 프로그램의 동작이나 작동을 부분적으로 또는 완전히 변경하는 모든 코드 라이브러리에 대한 일반적인 용어임을 의미합니다. 진정한 중개인과 마찬가지로 해당 프로그램에 전달 된 데이터 또는 해당 프로그램에서 반환 된 데이터에 영향을 줄 수 있습니다.

이 기사에서는 Windows API를 예로 사용했으며 다음 문장과 관련이 있음을 알았습니다.

응용 프로그램은 일반적으로 요청이 Windows 자체가 아닌 shim DLL로 이동한다는 것을 인식하지 못하며 Windows는 응용 프로그램 이외의 소스에서 요청이 들어오는 것을 인식하지 못합니다 (shim DLL은 응용 프로그램 프로세스 내의 다른 DLL이기 때문에) .

이 인용을 일반화하기 위해 "심 샌드위치"의 "빵"을 만드는 두 프로그램은 상대방 프로그램과 대화하는 것과 심과 대화하는 것을 구별 할 수 없어야합니다.

심 사용의 장단점은 무엇입니까?

다시 기사에서 :

소스 코드에 액세스하지 않거나 전혀 변경하지 않고 응용 프로그램을 수정할 수 있습니다. 최소한의 추가 관리 오버 헤드가 발생하며이 방법으로 합리적인 수의 응용 프로그램을 수정할 수 있습니다. 단점은 대부분의 공급 업체가 shimed 응용 프로그램을 지원하지 않기 때문에 지원됩니다. shim을 사용하여 모든 응용 프로그램을 수정할 수는 없습니다. 대부분의 사람들은 일반적으로 공급 업체가 운영되지 않는 응용 프로그램에 대한 shim을 고려하거나 소프트웨어가 지원을 필요로 할만큼 전략적이지 못하거나 시간을 벌고 싶어합니다.

이 질문의 맥락에서, "프록시", "어댑터"및 "파사드"와 같은 용어는 위의 링크를 읽은 후 (적어도 나에게) 더 의미가 있습니다.


3

여기서 많은 응답에서 알 수 있듯이 shim은 API 수준에서 기능을 제공하는 일종의 어댑터로, 반드시 해당 API의 일부는 아닙니다. 이 스레드에는 많은 훌륭한 응답이 있으므로 정의를 더 확장하지는 않습니다.

그러나 Javascript ES5 Shim ( https://github.com/es-shims/es5-shim ) 인 좋은 예를 추가 할 수 있다고 생각합니다 .

Javascript는 지난 몇 년 동안 많은 발전을 거쳤으며 언어 사양에 대한 많은 다른 변경 중에서도 많은 새로운 방법이 핵심 객체에 추가되었습니다.

예를 들어 ES2015 사양 (일명 ES5)에서이 방법 findArray프로토 타입 에 추가되었습니다 . 따라서이 방법을 아직 제공하지 않는이 사양 (예 : 노드 0.12) 이전에 JavasScript 엔진을 사용하여 코드를 실행한다고 가정 해 봅시다. ES5 shim을로드하면이 새로운 메소드가 Array프로토 타입에 추가되어 최신 JavaScript 사양으로 실행하지 않더라도 사용할 수 있습니다.

당신은 물을 수 있습니다 : 누군가가 환경을 최신 버전으로 업그레이드하는 대신 왜 그렇게 할 것입니까 (노드 8이라고합시다)?

이러한 접근 방식이 적합한 실제 사례 시나리오가 많이 있습니다. 좋은 예가 하나 있습니다 :

이전 환경에서 실행되는 레거시 시스템이 있고 기능을 구현 / 수정하려면 이러한 새로운 방법을 사용해야한다고 가정 해 봅시다. 많은 코드 변경 및 테스트 (중요한 구성 요소)가 필요한 호환성 문제가 있기 때문에 환경 업그레이드가 여전히 진행 중입니다.

이 예제에서는 이러한 기능의 자체 버전을 만들려고 시도 할 수 있지만 코드를 읽기 어렵고 복잡하게 만들 수 있으며 새로운 버그가 발생할 수 있으며 알고있는 기능을 다루기 위해 수많은 추가 테스트가 필요합니다. 다음 릴리스에서 사용할 수 있습니다.

대신 다음 사양에서 사용 가능한 것으로 알려진 방법을 이미 사용하고 있기 때문에 업그레이드 후에이 수정 / 기능이 호환된다는 사실을 이용하여이 shim을 사용하고 새로운 방법을 사용할 수 있습니다. 그리고 보너스 이유가 있습니다. 이러한 방법은 다음 언어 사양에 고유하기 때문에 자신의 버전을 만들려고 시도했을 때 수행 할 수있는 구현보다 더 빠르게 실행될 가능성이 높습니다.

그러한 접근이 환영받는 또 다른 실제 시나리오는 브라우저 수준입니다. 이전 브라우저를 지원해야하며 이러한 새로운 기능을 활용하고 싶다고 가정 해 봅시다. Javascript는 핵심 개체에 메소드를 추가 / 수정할 수있는 언어이며 (예 : Array 프로토 타입에 메소드 추가), 해당 shim 라이브러리는 현재 구현에 부족한 경우에만 이러한 메소드를 추가 할 수있을 정도로 똑똑합니다.

PS : 1)이 Javascript shim과 관련된 "Polyfill"이라는 용어가 표시됩니다. Polyfill은 다른 브라우저 수준 사양에서 순방향 호환성을 제공하는 데 사용되는보다 전문화 된 shim 유형입니다. 그건 그렇고, 위의 예는 정확히 그러한 예를 나타냅니다.

2) 심은이 예제로 제한되지 않습니다 (향후 릴리스에서 사용할 수있는 기능 추가). 심으로 간주되는 다른 사용 사례도 있습니다.

3)이 특정 폴리 필이 어떻게 구현되는지 궁금하다면 Javascript Array.find 스펙을 열고이 메소드에 대한 표준 구현을 찾을 수있는 페이지 끝으로 스크롤하십시오.


0

SHIM은 업스트림 시스템을 보호하기 위해 모든 서비스에 대해 수행되는 또 다른 수준의 보안 검사입니다. SHIM 서버는 요청에 전달 된 사용자 자격 증명에 대해 헤더 사용자 자격 증명을 사용하여 들어오는 모든 요청의 유효성을 검사합니다 (SOAP / RESTFUL).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.