พื้นหลัง:
ฉันมีโมดูลที่ประกาศจำนวนวิธีการอินสแตนซ์
module UsefulThings
def get_file; ...
def delete_file; ...
def format_text(x); ...
end
และฉันต้องการเรียกวิธีการเหล่านี้บางอย่างจากภายในชั้นเรียน ปกติคุณทำเช่นนี้ในทับทิมเป็นเช่นนี้:
class UsefulWorker
include UsefulThings
def do_work
format_text("abc")
...
end
end
ปัญหา
include UsefulThings
นำในทุกUsefulThings
วิธีการจาก ในกรณีนี้ผมเพียงต้องการformat_text
และชัดเจนไม่ต้องการและget_file
delete_file
ฉันสามารถดูวิธีแก้ปัญหาที่เป็นไปได้หลายประการดังนี้:
- อย่างใดเรียกวิธีการโดยตรงในโมดูลโดยไม่รวมที่ใดก็ได้
- ฉันไม่ทราบว่าสามารถทำได้หรือไม่ (ดังนั้นคำถามนี้)
- อย่างใดรวมถึง
Usefulthings
และนำวิธีการบางอย่างเท่านั้น- ฉันก็ไม่รู้เหมือนกันว่าจะทำสิ่งนี้ได้อย่างไร
- สร้างคลาสพร็อกซีรวม
UsefulThings
ไว้ในนั้นจากนั้นมอบสิทธิ์format_text
ให้อินสแตนซ์ของพร็อกซีนั้น- สิ่งนี้จะได้ผล แต่คลาสพร็อกซีที่ไม่ระบุชื่อเป็นแฮ็ก yuck
- แบ่งโมดูลออกเป็น 2 โมดูลหรือเล็กกว่า
- สิ่งนี้จะได้ผลและอาจเป็นทางออกที่ดีที่สุดที่ฉันสามารถนึกได้ แต่ฉันต้องการหลีกเลี่ยงเพราะฉันต้องจบด้วยโมดูลที่เพิ่มจำนวนมากขึ้นเรื่อย ๆ - การจัดการสิ่งนี้จะเป็นภาระ
ทำไมมีฟังก์ชั่นที่ไม่เกี่ยวข้องจำนวนมากในโมดูลเดียว? มันApplicationHelper
มาจากแอพพลิเคชั่นรางซึ่งทีมงานของเราได้ตัดสินใจยกเลิกการทุ่มตลาดสำหรับสิ่งที่ไม่เฉพาะเจาะจงมากพอที่จะอยู่ที่อื่น วิธีการยูทิลิตี้แบบสแตนด์อโลนส่วนใหญ่ที่ใช้ในทุกที่ ฉันสามารถแบ่งมันออกเป็นผู้ช่วยเหลือแยกกันได้ แต่จะมี 30 วิธีด้วยวิธี 1 วิธี ... นี่ดูเหมือนจะไม่เกิดผล
module UT; def add1; self+1; end; def add2; self+2; end; end
และคุณต้องการที่จะใช้add1
แต่ไม่ในชั้นเรียนadd2
Fixnum
มันจะช่วยให้มีฟังก์ชั่นโมดูลสำหรับสิ่งนั้นได้อย่างไร ฉันพลาดอะไรไปรึเปล่า?
Module#included
โทรกลับเพื่อเรียกinclude
อีกคนหนึ่งformat_text
วิธีการจะถูกย้ายไปลงในโมดูลของตัวเองเพราะมันน่าจะเป็นประโยชน์ในการเป็นของตัวเอง สิ่งนี้จะทำให้การจัดการเป็นภาระน้อยลงเล็กน้อย