ฉันสามารถใช้อะไรแทนส่วนต่อประสานใน Ruby (หรือภาษาไดนามิกอื่น ๆ ) ได้บ้าง


9

เป้าหมายของฉันคือการกำหนดสัญญาระหว่างชั้นเรียน

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

ตัวอย่างเช่นใน Java ฉันสามารถกำหนดอินเตอร์เฟส Persistor ด้วยวิธีการเช่น get () และ save () จากนั้นกำหนดคลาส JdbcPersistor ด้วยวิธีการทั้งหมดที่ฉันต้องการเพื่อคงอยู่ในฐานข้อมูล และบางที RestPersistor อีกอันที่มีวิธีการอื่นสำหรับการบันทึกใน restserver ระยะไกล

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


ผมคิดว่านี่เป็นใน StackOverflow ...
Thorsten Müller

2
@thorsten Stack ล้นสำหรับปัญหาการใช้งานเฉพาะ (เช่นมีปัญหาในรหัส) คำถามการออกแบบโปรแกรมทั่วไปอยู่ในหัวข้อที่นี่ใน Programmers.SE

@ Mark: ขอบคุณสำหรับการแก้ไข ฉันคิดว่ามันเจาะจงเกินไปสำหรับ Ruby (และไม่ได้รับประโยคสุดท้ายของ Uberto) ดังนั้นฉันจึงอัพเดทความรู้เกี่ยวกับคำถามที่พบบ่อย (ยังหาทางของฉันที่นี่)
thorsten müller

+1 คำถามที่ยอดเยี่ยม ฉันสนใจว่ามีวิธีอื่นนอกเหนือจากการเขียนอ่านและทำเอกสารให้ทันสมัยอยู่เสมอหรือใช้การประชุมที่โง่เขลาเช่นการใช้วิธีการเสริมภายในที่มีขีดล่างหรืออะไรทำนองนั้น
Joonas Pulakka

+1 อย่างไรก็ตาม PLT แร็กเก็ตได้รับการสนับสนุนสำหรับสัญญาและเป็นแบบไดนามิก การเพิ่มสิ่งที่คล้ายกับทับทิมจะเป็นโครงการที่น่าสนใจ
Larry Coleman

คำตอบ:


5

นี้ได้รับการตอบในบริบทของอินเตอร์เฟซ C # และ Ruby on StackOverflow นี้: /programming/3505521/in-ruby-what-is-the-equivalent-to-an-interface-in-c

สรุป: ไม่มีสิ่งใดเทียบเท่าใน Ruby เนื่องจากการพิมพ์เป็ดทำให้จำเป็นต้องใช้อินเตอร์เฟสที่เป็นทางการ ให้ลองทดสอบการปฏิบัติตาม "อินเทอร์เฟซ" หรือสัญญาโดยใช้respond_to?แทน


2
ใช่ แต่นี่ไม่ได้เป็นการป้องกันโค้ดในการเข้าถึงวิธีที่ไม่ควรใช้
Uberto

2

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


1

ใน Perl 5 ทั้งMooseและMooจัดเตรียมบทบาท (หรือลักษณะ) ที่อาจต้องใช้วิธีการบางอย่าง Moose ยังมาพร้อมกับระบบชนิดรันไทม์ที่ให้คุณกำหนด a duck_typeซึ่งเป็นอ็อบเจกต์ประกาศที่มีชุดเมธอดที่จำเป็น

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

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