Shim คืออะไร


คำตอบ:


92

จากวิกิพีเดีย:

ในการเขียนโปรแกรมคอมพิวเตอร์shimเป็นไลบรารีขนาดเล็กที่สกัดกั้น API อย่างโปร่งใสเปลี่ยนพารามิเตอร์ที่ส่งผ่านการจัดการการดำเนินการเองหรือเปลี่ยนเส้นทางการดำเนินการที่อื่น โดยทั่วไปแล้ว Shims จะเกิดขึ้นเมื่อพฤติกรรมของ API เปลี่ยนแปลงดังนั้นจึงทำให้เกิดปัญหาความเข้ากันได้สำหรับแอปพลิเคชันรุ่นเก่าที่ยังคงใช้งานได้มากกว่า ในกรณีเหล่านี้ API ที่เก่ากว่ายังสามารถรองรับเลเยอร์ความเข้ากันได้แบบบางที่ด้านบนของรหัสที่ใหม่กว่า Shims ยังสามารถใช้เพื่อเรียกใช้โปรแกรมบนแพลตฟอร์มซอฟต์แวร์ที่แตกต่างจากที่พัฒนาขึ้นมา


83
คำตอบนี้ไม่ต่างจากการค้นหา google จริง ๆ ในวิกิพีเดีย ตัวอย่างน่าจะดี
dance2die

4
ฟังดูเหมือนการใช้รูปแบบการออกแบบ Facade สำหรับการเชื่อมต่อกับไลบรารี
blz

84

คำว่า "shim" ตามที่นิยามไว้ใน Wikipedia จะถูกจำแนกทางเทคนิคตามคำจำกัดความของรูปแบบการออกแบบ "โครงสร้าง" รูปแบบการออกแบบ“ โครงสร้าง” หลายประเภทมีการอธิบายไว้ค่อนข้างชัดเจนในรูปแบบการออกแบบซอฟต์แวร์เชิงวัตถุ (บางคนบอกว่า defacto) อ้างอิงถึง"รูปแบบการออกแบบ, องค์ประกอบของซอฟต์แวร์เชิงวัตถุที่ใช้ซ้ำได้" ซึ่งรู้จักกันในชื่อ"แก๊งสี่" "แก๊งสี่"

ข้อความ"Gang of Four"แสดงอย่างน้อย 3 รูปแบบที่รู้จักกันดีคือ "Proxy", "Adaptor" และ "Facade" ซึ่งทั้งหมดมีฟังก์ชั่นการพิมพ์ "shim" ในสาขาส่วนใหญ่บ่อยครั้งที่การใช้งานและหรือการใช้คำย่อต่าง ๆ สำหรับแนวคิดรากเดียวกันที่ทำให้คนสับสน การใช้คำว่า "ชิม" เพื่ออธิบายรูปแบบการออกแบบ "โครงสร้าง" ที่เจาะจงยิ่งขึ้น"พร็อกซี" , "อะแด็ปเตอร์"และ"ซุ้ม"เป็นตัวอย่างที่ชัดเจนของสถานการณ์ประเภทนี้ "shim" เป็นคำทั่วไปสำหรับประเภทพร็อกซี "โครงสร้าง" ที่เจาะจงมากขึ้น "พร็อกซี", "อะแดปเตอร์", "ซุ้ม" และอื่น ๆ ที่เป็นไปได้


5
คำตอบนี้บ่งชี้ว่า shim เป็นรูปแบบการออกแบบ (หนึ่งในหลาย ๆ อย่าง) ตั้งชื่อรูปแบบการออกแบบที่คล้ายกันบางส่วนและแสดงแทนเจนต์ว่าผู้คนสับสนโดยย่ออย่างไร แต่จริงๆแล้วมันไม่ได้ตอบคำถามเดิมว่าชิมคืออะไรมันทำอะไรหรือใช้มันอย่างไร
Richie Thomas

53

คำอธิบายง่ายๆผ่านการ์ตูน

ตัวอย่างของ shim:

My Dog Ralph เป็นหนึ่งใน bash-tard ที่โชคดี

สรุป

หมายเหตุ: การเปรียบเทียบมีความตึงเครียด โดยปกติแล้วราล์ฟจะได้รับสิ่งที่เขาขออย่างแน่นอน แต่กลไกของวิธีการที่ได้มานั้นเป็นสิ่งที่เขาอาจไม่คาดคิด

ชิมเป็นรหัสที่ดูแลสิ่งที่ถาม (โดย 'การสกัดกั้น') โดยไม่มีใครฉลาดเกี่ยวกับมัน นี่คือแนวคิดทั่วไป ตอนนี้คุณควรจะสามารถอ่านและทำความเข้าใจกับรายการวิกิพีเดียใน shims


13

สำหรับต้นกำเนิดของคำว่าวิดเจ็ตพจนานุกรมของ 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

สิ่งนี้ดูเหมือนจะค่อนข้างเหมาะสมกับวิธีที่นักออกแบบเว็บไซต์ใช้คำนี้


13

shims ที่ใช้ใน .NET Framework 4.5 ไมโครซอฟท์ปลอม เพื่อแยกแอพลิเคชันของคุณจากการประกอบอื่น ๆ สำหรับการทดสอบหน่วย Shims โอนสายไปยังวิธีการเฉพาะเพื่อเขียนโค้ดที่คุณเขียนเป็นส่วนหนึ่งของการทดสอบ


12

อ้างอิงจากบทความของ Microsoft "Demystifying Shims" :

มันเป็นคำเปรียบเทียบตามคำภาษาอังกฤษ shim ซึ่งเป็นศัพท์ทางวิศวกรรมที่ใช้อธิบายชิ้นส่วนของไม้หรือโลหะที่แทรกระหว่างวัตถุสองชิ้นเพื่อให้เข้ากันได้ดียิ่งขึ้น ในการเขียนโปรแกรมคอมพิวเตอร์ shim คือไลบรารีขนาดเล็กที่สกัดกั้น API อย่างโปร่งใสเปลี่ยนพารามิเตอร์ที่ส่งผ่านจัดการการดำเนินการเองหรือเปลี่ยนเส้นทางการดำเนินการที่อื่น Shims ยังสามารถใช้สำหรับรันโปรแกรมบนแพลตฟอร์มซอฟต์แวร์ที่แตกต่างจากที่พัฒนาขึ้นมา

ฉันตีความสิ่งนี้เพื่อหมายความว่า shim เป็นคำทั่วไปสำหรับไลบรารีของรหัสใด ๆ ที่ทำหน้าที่เป็นคนกลางและเปลี่ยนพฤติกรรมหรือการทำงานของโปรแกรมบางส่วนหรือทั้งหมด เช่นคนกลางจริงอาจส่งผลต่อข้อมูลที่ส่งไปยังโปรแกรมนั้นหรือส่งผลต่อข้อมูลที่ส่งคืนจากโปรแกรมนั้น

บทความใช้ Windows API เป็นตัวอย่างและฉันพบประโยคต่อไปนี้ที่เกี่ยวข้อง:

แอปพลิเคชันโดยทั่วไปไม่ทราบว่าคำขอจะเป็น shim DLL แทนที่จะเป็น Windows และ Windows ไม่ทราบว่าคำขอมาจากแหล่งอื่นนอกเหนือจากแอปพลิเคชัน (เนื่องจาก shim DLL เป็นเพียง DLL อื่นในกระบวนการของแอปพลิเคชัน) .

เพื่อพูดให้เข้าใจถึงคำพูดนี้โปรแกรมทั้งสองที่สร้าง "ขนมปัง" ของ "ชิมแซนวิช" ไม่ควรแยกความแตกต่างระหว่างการพูดคุยกับโปรแกรมคู่กันและพูดคุยกับชิม

ข้อดีและข้อเสียของการใช้ shims คืออะไร

อีกครั้งจากบทความ:

คุณสามารถแก้ไขแอปพลิเคชันโดยไม่ต้องเข้าถึงซอร์สโค้ดหรือไม่ต้องแก้ไขเลย คุณมีค่าใช้จ่ายในการจัดการเพิ่มเติมเพียงเล็กน้อย ... และคุณสามารถแก้ไขแอปพลิเคชันในจำนวนที่เหมาะสมด้วยวิธีนี้ ข้อเสียคือการสนับสนุนในขณะที่ผู้ค้าส่วนใหญ่ไม่สนับสนุนแอปพลิเคชันที่ส่งมา คุณไม่สามารถแก้ไขทุกแอปพลิเคชันโดยใช้ shims ได้ คนส่วนใหญ่มักจะพิจารณาการใช้งานสำหรับแอพพลิเคชั่นที่ผู้ขายเลิกกิจการซอฟท์แวร์ไม่ได้มีกลยุทธ์เพียงพอที่จะรองรับความต้องการหรือพวกเขาเพียงต้องการซื้อเวลา

ในบริบทของคำถามนี้คำเช่น "พร็อกซี", "อะแดปเตอร์" และ "ซุ้ม" เหมาะสมกว่า (อย่างน้อยสำหรับฉัน) หลังจากอ่านลิงก์ด้านบนแล้ว


3

ดังที่เราเห็นได้จากการตอบสนองมากมายที่นี่ชิมเป็นอะแดปเตอร์ที่ให้การทำงานในระดับ API ซึ่งไม่จำเป็นต้องเป็นส่วนหนึ่งของ API นั้น กระทู้นี้มีการตอบสนองที่ดีและสมบูรณ์ดังนั้นฉันไม่ได้ขยายคำจำกัดความเพิ่มเติม

อย่างไรก็ตามฉันคิดว่าฉันสามารถเพิ่มตัวอย่างที่ดีซึ่งเป็น Javascript ES5 Shim ( https://github.com/es-shims/es5-shim ):

Javascript มีการพัฒนาจำนวนมากในช่วงไม่กี่ปีที่ผ่านมาและในบรรดาการเปลี่ยนแปลงอื่น ๆ ในข้อกำหนดภาษานั้นมีการเพิ่มวิธีการใหม่มากมายในวัตถุหลักของมัน

ตัวอย่างเช่นในข้อกำหนด ES2015 (aka ES5) findมีการเพิ่มวิธีการลงในArrayต้นแบบ ดังนั้นสมมติว่าคุณกำลังเรียกใช้รหัสของคุณโดยใช้เอ็นจิน JavasScript ก่อนหน้าสเปคนี้ (เช่น Node 0.12) ซึ่งยังไม่มีวิธีดังกล่าว ด้วยการโหลด ES5 shim วิธีการใหม่เหล่านี้จะถูกเพิ่มไปยังArrayต้นแบบช่วยให้คุณสามารถใช้งานได้แม้ว่าคุณจะไม่ได้ใช้จาวาสคริปต์ที่ใหม่กว่าก็ตาม

คุณอาจถามว่า: ทำไมบางคนถึงทำอย่างนั้นแทนที่จะอัพเกรดสภาพแวดล้อมเป็นเวอร์ชั่นที่ใหม่กว่า (สมมุติว่าโหนด 8)

มีหลายกรณีสถานการณ์จริงที่วิธีการที่เหมาะสม หนึ่งในตัวอย่างที่ดี:

สมมติว่าคุณมีระบบดั้งเดิมที่ทำงานในสภาพแวดล้อมแบบเก่าและคุณจำเป็นต้องใช้วิธีการใหม่ ๆ ในการปรับใช้ / แก้ไขการทำงาน การอัพเกรดสภาพแวดล้อมของคุณยังคงทำงานอยู่เนื่องจากมีปัญหาความเข้ากันได้ที่ต้องมีการเปลี่ยนแปลงรหัสและการทดสอบจำนวนมาก (องค์ประกอบที่สำคัญ)

ในตัวอย่างนี้คุณสามารถลองสร้างฟังก์ชั่นดังกล่าวในเวอร์ชันของคุณเองได้ แต่นั่นจะทำให้โค้ดของคุณยากต่อการอ่านมีความซับซ้อนมากขึ้นสามารถแนะนำบั๊กใหม่ ๆ และจะต้องมีการทดสอบเพิ่มเติมอีกมากมาย วางจำหน่ายในรุ่นถัดไป

แต่คุณสามารถใช้ shim นี้และใช้ประโยชน์จากวิธีการใหม่เหล่านี้โดยใช้ประโยชน์จากความจริงที่ว่าการแก้ไข / ฟังก์ชั่นนี้จะเข้ากันได้หลังจากการอัปเกรดเพราะคุณใช้วิธีที่ทราบกันแล้วว่ามีอยู่ใน และมีเหตุผลโบนัส: เนื่องจากวิธีการเหล่านี้เป็นภาษาพื้นเมืองของข้อกำหนดภาษาถัดไปมีโอกาสที่ดีที่พวกเขาจะทำงานได้เร็วกว่าการใช้งานใด ๆ ที่คุณสามารถทำได้ถ้าคุณพยายามทำให้รุ่นของคุณเอง

อีกสถานการณ์จริงที่ยินดีต้อนรับวิธีการดังกล่าวอยู่ในระดับเบราว์เซอร์ สมมติว่าคุณต้องรองรับเบราว์เซอร์รุ่นเก่าและต้องการใช้ประโยชน์จากคุณสมบัติใหม่เหล่านี้ Javascript เป็นภาษาที่ช่วยให้คุณสามารถเพิ่ม / แก้ไขวิธีการในวัตถุหลัก (เช่นการเพิ่มวิธีการต้นแบบ Array) และห้องสมุด shim เหล่านั้นฉลาดพอที่จะเพิ่มวิธีการดังกล่าวเฉพาะในกรณีที่การใช้งานในปัจจุบันขาดพวกเขา

PS: 1) คุณจะเห็นคำว่า "Polyfill" ที่เกี่ยวข้องกับ Javascript shims เหล่านี้ Polyfill เป็น shim ประเภทพิเศษที่ใช้เพื่อให้เข้ากันได้กับข้อกำหนดระดับเบราว์เซอร์ที่แตกต่างกัน โดยตัวอย่างของฉันข้างต้นหมายถึงตัวอย่างเช่น

2) Shims ไม่ได้ จำกัด เฉพาะตัวอย่างนี้ (เพิ่มฟังก์ชันการทำงานที่จะมีในรุ่นต่อไปในอนาคต) มีกรณีการใช้งานที่แตกต่างกันซึ่งจะถือว่าเป็น shim เช่นกัน

3) หากคุณสงสัยเกี่ยวกับวิธีการนำโพลีฟิลมาใช้งานคุณสามารถเปิดรายละเอียดจาวาสคริปต์Array.findและเลื่อนไปที่ท้ายสุดของหน้าซึ่งคุณจะพบการใช้งานที่ยอมรับได้สำหรับวิธีนี้


0

SHIM เป็นอีกระดับหนึ่งของการตรวจสอบความปลอดภัยซึ่งทำสำหรับบริการทั้งหมดเพื่อป้องกันระบบต้นน้ำ SHIM Server ตรวจสอบความถูกต้องทุกคำขอที่มีข้อมูลประจำตัวของผู้ใช้ส่วนหัวกับข้อมูลรับรองผู้ใช้ซึ่งจะถูกส่งผ่านในคำขอ (SOAP / RESTFUL)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.