Shim là gì?


Câu trả lời:


92

Từ Wikipedia:

Trong lập trình máy tính, shim là một thư viện nhỏ có thể chặn API một cách trong suốt, thay đổi các tham số được truyền, xử lý chính hoạt động hoặc chuyển hướng hoạt động ở nơi khác. Shims thường xuất hiện khi hành vi của API thay đổi, do đó gây ra sự cố tương thích cho các ứng dụng cũ vẫn dựa vào chức năng cũ hơn. Trong những trường hợp này, API cũ hơn vẫn có thể được hỗ trợ bởi một lớp tương thích mỏng bên trên mã mới hơn. Shims cũng có thể được sử dụng để chạy các chương trình trên các nền tảng phần mềm khác nhau mà chúng được phát triển.


82
Câu trả lời này không khác gì thực hiện tìm kiếm google thực tế trên wikipedia. Một ví dụ sẽ tốt đẹp.
dance2die

4
Điều này nghe có vẻ như việc sử dụng mẫu thiết kế Facade để giao thoa các thư viện.
blz

84

Thuật ngữ "shim" như được định nghĩa trong Wikipedia về mặt kỹ thuật sẽ được phân loại, dựa trên định nghĩa của nó, như là một mẫu thiết kế "Kết cấu". Nhiều kiểu mẫu thiết kế của cấu trúc mạng được mô tả khá rõ ràng trong mô hình thiết kế phần mềm hướng đối tượng (một số người sẽ nói là defacto) tham khảo "Mẫu thiết kế, các yếu tố của phần mềm hướng đối tượng có thể tái sử dụng" được gọi là "Gang of Four" .

Văn bản "Gang of Four" phác thảo ít nhất 3 mẫu được thiết lập tốt, được gọi là "Proxy", "Adaptor" và "Facade", tất cả đều cung cấp chức năng loại kiểu shim shim. Trong hầu hết các lĩnh vực, việc sử dụng và bỏ lỡ việc sử dụng các từ viết tắt khác nhau cho cùng một khái niệm gốc khiến mọi người nhầm lẫn. Sử dụng từ "shim shim" để mô tả các mẫu thiết kế "Proxy" , "Bộ điều hợp""Mặt tiền" cụ thể hơn là một ví dụ rõ ràng về loại tình huống này. "Shim" đơn giản là một thuật ngữ chung hơn cho các loại "Cấu trúc" cụ thể hơn "Proxy", "Adaptor", "Facade" và có thể các loại khác.


5
Câu trả lời này chỉ ra rằng shim là một mẫu thiết kế (một trong số rất nhiều), đặt tên cho một số mẫu thiết kế tương tự và tiếp tục nói về cách mọi người bị nhầm lẫn bởi các từ viết tắt khác nhau. Nhưng nó không thực sự trả lời câu hỏi ban đầu về shim là gì, nó làm gì hoặc sử dụng như thế nào.
Richie Thomas

53

Giải thích đơn giản qua phim hoạt hình

Một ví dụ về shim:

My Dog Ralph là một bash-tard may mắn (ý định chơi chữ kép)

Tóm lược

Lưu ý: sự tương tự bị căng thẳng. Thông thường Ralph sẽ nhận được CHÍNH XÁC những gì anh ta yêu cầu - nhưng cơ chế của CÁCH nó thu được là điều mà anh ta có thể không mong đợi.

Một shim là một số mã quan tâm đến những gì được hỏi (bằng cách 'đánh chặn'), mà không có ai khôn ngoan hơn về nó. Đây là khái niệm chung. Bây giờ bạn sẽ có thể đọc và hiểu mục wikipedia trên shims.


13

Về nguồn gốc của từ, tiện ích từ điển của 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

Điều này có vẻ phù hợp khá tốt với cách các nhà thiết kế web sử dụng thuật ngữ này.



12

Theo bài viết của Microsoft "Làm sáng tỏ miếng chêm" :

Đó là một phép ẩn dụ dựa trên từ shim trong tiếng Anh, đây là một thuật ngữ kỹ thuật được sử dụng để mô tả một miếng gỗ hoặc kim loại được chèn vào giữa hai vật thể để làm cho chúng khớp với nhau tốt hơn. Trong lập trình máy tính, shim là một thư viện nhỏ có thể chặn API một cách trong suốt, thay đổi các tham số được truyền, tự xử lý hoạt động hoặc chuyển hướng hoạt động ở nơi khác. Shims cũng có thể được sử dụng để chạy các chương trình trên các nền tảng phần mềm khác nhau mà chúng được phát triển.

Tôi giải thích điều này có nghĩa là shim là một thuật ngữ chung cho bất kỳ thư viện mã nào hoạt động như một người trung gian và thay đổi một phần hoặc hoàn toàn hành vi hoặc hoạt động của một chương trình. Giống như một người trung gian thực sự, nó có thể ảnh hưởng đến dữ liệu được truyền đến chương trình đó hoặc ảnh hưởng đến dữ liệu được trả về từ chương trình đó.

Bài viết sử dụng API Windows làm ví dụ và tôi thấy câu sau có liên quan:

Ứng dụng thường không biết rằng yêu cầu sẽ chuyển sang DLL tạm thời thay vì Windows và Windows không biết rằng yêu cầu đến từ một nguồn khác ngoài ứng dụng (vì DLL shim chỉ là một DLL khác trong quy trình của ứng dụng) .

Để khái quát hóa trích dẫn này, hai chương trình tạo ra "bánh mì" của "bánh sandwich shim" không thể phân biệt giữa nói chuyện với chương trình đối tác của họ và nói chuyện với shim.

Một số ưu và nhược điểm của việc sử dụng miếng chêm là gì?

Một lần nữa, từ bài viết:

Bạn có thể sửa các ứng dụng mà không cần truy cập vào mã nguồn hoặc không thay đổi chúng. Bạn phải chịu một lượng tối thiểu chi phí quản lý bổ sung ... và bạn có thể sửa một số lượng ứng dụng hợp lý theo cách này. Nhược điểm là hỗ trợ vì hầu hết các nhà cung cấp không hỗ trợ các ứng dụng lung linh. Bạn không thể sửa mọi ứng dụng bằng miếng chêm. Hầu hết mọi người thường xem xét các miếng chêm cho các ứng dụng mà nhà cung cấp không hoạt động, phần mềm không đủ chiến lược để yêu cầu hỗ trợ hoặc họ chỉ muốn mua một thời gian.

Trong ngữ cảnh của câu hỏi này, các thuật ngữ như "proxy", "bộ chuyển đổi" và "mặt tiền" có ý nghĩa hơn (ít nhất là với tôi) sau khi đọc liên kết trên.


3

Như chúng ta có thể thấy trong nhiều phản hồi ở đây, shim là một loại bộ điều hợp cung cấp chức năng ở cấp API mà không nhất thiết phải là một phần của API đó. Chủ đề này có rất nhiều phản hồi tốt và đầy đủ, vì vậy tôi không mở rộng định nghĩa hơn nữa.

Tuy nhiên, tôi nghĩ rằng tôi có thể thêm một ví dụ hay, đó là Javascript ES5 Shim ( https://github.com/es-shims/es5-shim ):

Javascript đã phát triển rất nhiều trong vài năm qua và trong số nhiều thay đổi khác đối với đặc tả ngôn ngữ, rất nhiều phương thức mới đã được thêm vào các đối tượng cốt lõi của nó.

Ví dụ, trong đặc tả ES2015 (còn gọi là ES5), phương thức findđã được thêm vào Arraynguyên mẫu. Vì vậy, giả sử bạn đang chạy mã của mình bằng công cụ JavasScript trước thông số kỹ thuật này (ví dụ: Nút 0.12) chưa cung cấp phương thức đó. Bằng cách tải shim ES5, các phương thức mới này sẽ được thêm vào Arraynguyên mẫu, cho phép bạn sử dụng chúng ngay cả khi bạn không chạy trên một đặc tả JavaScript mới hơn.

Bạn có thể hỏi: tại sao ai đó sẽ làm điều đó thay vì nâng cấp môi trường lên phiên bản mới hơn (giả sử là Nút 8)?

Có rất nhiều tình huống thực tế trong đó cách tiếp cận đó có ý nghĩa. Một ví dụ điển hình:

Giả sử bạn có một hệ thống cũ đang chạy trong môi trường cũ và bạn cần sử dụng các phương pháp mới như vậy để thực hiện / sửa chữa một chức năng. Việc nâng cấp môi trường của bạn vẫn đang được tiến hành vì có những vấn đề tương thích đòi hỏi nhiều thay đổi và kiểm tra mã (một thành phần quan trọng).

Trong ví dụ này, bạn có thể thử tạo phiên bản chức năng như vậy, nhưng điều đó sẽ khiến mã của bạn khó đọc hơn, phức tạp hơn, có thể đưa ra các lỗi mới và sẽ yêu cầu hàng tấn thử nghiệm bổ sung chỉ để bao quát một chức năng mà bạn biết nó sẽ có sẵn trong phiên bản tiếp theo.

Thay vào đó, bạn có thể sử dụng shim này và sử dụng các phương thức mới này, lợi dụng thực tế là sửa lỗi / chức năng này sẽ tương thích sau khi nâng cấp, vì bạn đã sử dụng các phương thức đã biết có sẵn trong thông số kỹ thuật tiếp theo. Và có một lý do bổ sung: vì các phương thức này có nguồn gốc từ đặc tả ngôn ngữ tiếp theo, rất có thể chúng sẽ chạy nhanh hơn bất kỳ triển khai nào bạn có thể thực hiện nếu bạn cố gắng tạo phiên bản của riêng mình.

Một kịch bản thực tế khác mà cách tiếp cận như vậy được chào đón là ở cấp trình duyệt. Giả sử bạn cần hỗ trợ trình duyệt cũ và muốn tận dụng các tính năng mới hơn này. Javascript là ngôn ngữ cho phép bạn thêm / sửa đổi các phương thức trong các đối tượng cốt lõi của nó (như thêm các phương thức vào nguyên mẫu Array) và các thư viện shim đó đủ thông minh để thêm các phương thức đó chỉ khi việc triển khai hiện tại thiếu chúng.

PS: 1) Bạn sẽ thấy thuật ngữ "Polyfill" liên quan đến các miếng chêm Javascript này. Polyfill là một loại shim chuyên dụng hơn được sử dụng để cung cấp khả năng tương thích về phía trước trong các thông số kỹ thuật cấp trình duyệt khác nhau. Nhân tiện, ví dụ của tôi ở trên đề cập chính xác đến ví dụ như vậy.

2) Shims không giới hạn trong ví dụ này (thêm chức năng sẽ có trong phiên bản tương lai). Có nhiều trường hợp sử dụng khác nhau cũng sẽ được coi là một shim.

3) Nếu bạn tò mò về cách triển khai polyfill cụ thể này, bạn có thể mở thông số Javascript Array.find và cuộn đến cuối trang nơi bạn sẽ tìm thấy triển khai chính tắc cho phương pháp này.


0

SHIM là một cấp độ kiểm tra bảo mật khác được thực hiện cho tất cả các dịch vụ, để bảo vệ các hệ thống thượng nguồn. SHIM Server xác thực mọi yêu cầu đến, với thông tin xác thực Người dùng, đối với thông tin đăng nhập của người dùng, được thông qua trong yêu cầu (SOAP / RESTFUL).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.