ทุ่งลิง
Monkey patchคือการแก้ไขโค้ดขณะทำงาน (ไม่ใช่โค้ดต้นฉบับ ) ของภาษาโปรแกรมแบบไดนามิกและข้อมูล (ข้อมูล/โค้ด) ที่ใช้ในการแก้ไขโค้ดขณะทำงานก็คือ Monkey patching นั่นเอง Monkey patching จะเพิ่มหรือแทนที่ส่วนประกอบของโปรแกรม เช่นเมธอดคลาสแอตทริบิวต์และฟังก์ชันในหน่วยความจำ การแก้ไขโค้ดขณะทำงานช่วยให้สามารถปรับเปลี่ยนพฤติกรรมของซอฟต์แวร์จากภายนอก ได้โดยไม่ต้องดูแลรักษาโค้ดต้นฉบับเวอร์ชันที่แก้ไขแล้ว
คำว่าmonkey patchดูเหมือนจะมาจากคำเดิมคือguerrilla patchซึ่งหมายถึงการเปลี่ยนแปลงโค้ดอย่างลับๆ – และอาจไม่เข้ากันกับ patch อื่นๆ – ในระหว่างรันไทม์ คำว่าguerrillaซึ่งออกเสียงคล้ายกับgorillaจึงกลายเป็นmonkeyอาจเพื่อทำให้ patch ฟังดูไม่น่ากลัว[ 1 ]
แม้ว่าชื่อจะบ่งบอกเช่นนั้น แต่บางครั้ง monkey patch ก็เป็นวิธีการขยายโปรแกรมอย่างเป็นทางการ ตัวอย่างเช่น เว็บเบราว์เซอร์อย่างFirefoxและInternet Explorerเคยสนับสนุนวิธีการนี้ แม้ว่าปัจจุบันเบราว์เซอร์ (รวมถึง Firefox) จะรองรับการขยายในรูปแบบที่แตกต่างกันก็ตาม[ 2 ]
Monkey patch มีความหมายแตกต่างกันไปตามบริบท ในRuby [ 3 ] Python [ 4 ] และ ภาษา อื่นๆ monkey patch หมายถึงการ แก้ไข คลาสหรือโมดูลแบบไดนามิกในขณะรันไทม์เท่านั้น โดยมีแรงจูงใจจากความตั้งใจที่จะแก้ไขโค้ดของบุคคลที่สามที่มีอยู่เพื่อแก้ปัญหาบั๊กหรือฟีเจอร์ที่ไม่ทำงานตามที่ต้องการ รูปแบบอื่นๆ ของการแก้ไขคลาสในขณะรันไทม์มีชื่อเรียกที่แตกต่างกัน ตัวอย่างเช่น ในZopeและPloneแพตช์ความปลอดภัยมักจะส่งมอบโดยใช้การแก้ไขคลาสแบบไดนามิก แต่เรียกว่าhot fixes
ข้อผิดพลาด
ข้อควรระวังบางประการของการแก้ไขโค้ดแบบ Monkey Patching:
- ความไม่เข้ากัน
การออกเวอร์ชันใหม่ของซอฟต์แวร์ที่แก้ไขแล้วอาจทำให้การแก้ไขนั้นใช้การไม่ได้ ด้วยเหตุนี้ การแก้ไขแบบ monkey patch จึงอาจมีเงื่อนไขและจะถูกนำไปใช้เฉพาะเมื่อเหมาะสมเท่านั้น[ 5 ]
- การเขียนทับ
หากมีการแก้ไข วิธีเดียวกัน หลายครั้ง จะมีการใช้เฉพาะการ แก้ไขครั้งสุดท้ายเท่านั้น การแก้ไขอื่นๆ จะไม่มีผลใดๆ เว้นแต่จะมีการเขียน monkey patches ด้วยรูปแบบเช่นalias_method_chain [ 6 ]
- ความสับสน
การแก้ไขโค้ดแบบ Monkey Patch ทำให้เกิดความไม่สอดคล้องกันระหว่างโค้ดต้นฉบับและพฤติกรรมจริง ซึ่งอาจทำให้ผู้พัฒนาสับสน ตัวอย่างเช่นเคอร์เนล Linuxตรวจจับโมดูลที่เป็นกรรมสิทธิ์และโมดูลของบุคคลที่สามอื่นๆ เช่น ไดรเวอร์ Nvidiaซึ่งทำการแก้ไขโครงสร้างเคอร์เนล เพื่อไม่ให้ผู้พัฒนาเสียเวลาไปกับการพยายามแก้ไขปัญหาที่พวกเขาไม่สามารถแก้ไขได้[ 7 ]
- ความวุ่นวาย
การแก้ไขแบบ Monkey Patch อาจมีโค้ดที่เป็นอันตรายที่โจมตีโปรแกรม หรือการแก้ไขอื่นๆ ตัวอย่างเช่น ในปี 2552 Giorgio Maone ผู้พัฒนาNoScriptได้โจมตี ส่วนขยาย Adblock Plusสำหรับ Firefox โดยเพิ่มข้อยกเว้นเพื่อให้โฆษณาบนเว็บไซต์ของเขาทำงานได้ โค้ดที่ก่อกวนยังทำให้แน่ใจว่าหากผู้ใช้พยายามลบข้อยกเว้น ข้อยกเว้นเหล่านั้นจะถูกเพิ่มเข้ามาอีกครั้ง สงครามที่ทวีความรุนแรงขึ้นเกิดขึ้นจากการผลักดันกฎ Adblock ใหม่ให้กับผู้ใช้ ตามด้วย Maone ที่ก่อวินาศกรรม ซึ่งในที่สุดก็ทำให้ Mozilla ต้องเข้ามาแทรกแซงเพื่อเปลี่ยนแปลงนโยบายเกี่ยวกับส่วนเสริม[ 8 ]
ตัวอย่าง
โค้ดต่อไปนี้จะแก้ไขค่าของpiในไลบรารีคณิตศาสตร์มาตรฐานของ Python เพื่อให้สอดคล้องกับกฎหมาย pi ของรัฐอินเดียนา
>>> นำเข้าโมดูลmath >>> math.pi 3.141592653589793 >>> math.pi = 3.2 # แก้ไขค่า Pi ในโมดูลmath โดยตรง>>> math.pi 3.2ครั้งต่อไปที่ Python เริ่มทำงาน ค่าของ pi จะเป็นค่าเดิมก่อนการแก้ไข: 3.141592653589793.