Latar Belakang:
Saya memiliki modul yang menyatakan sejumlah metode contoh
module UsefulThings
def get_file; ...
def delete_file; ...
def format_text(x); ...
end
Dan saya ingin memanggil beberapa metode ini dari dalam kelas. Bagaimana Anda biasanya melakukan ini di ruby adalah seperti ini:
class UsefulWorker
include UsefulThings
def do_work
format_text("abc")
...
end
end
Masalah
include UsefulThings
membawa semua metode dari UsefulThings
. Dalam hal ini saya hanya ingin format_text
dan secara eksplisit tidak mau get_file
dan delete_file
.
Saya dapat melihat beberapa solusi yang mungkin untuk ini:
- Entah bagaimana memohon metode secara langsung pada modul tanpa menyertakannya di mana saja
- Saya tidak tahu bagaimana / jika ini bisa dilakukan. (Karenanya pertanyaan ini)
- Entah bagaimana memasukkan
Usefulthings
dan hanya membawa beberapa metode itu- Saya juga tidak tahu bagaimana / jika ini bisa dilakukan
- Buat kelas proxy, termasuk
UsefulThings
di dalamnya, lalu delegasikanformat_text
ke instance proxy itu- Ini akan berhasil, tetapi kelas proxy anonim adalah peretasan. Yuck.
- Bagi modul menjadi 2 atau lebih modul yang lebih kecil
- Ini juga akan berhasil, dan mungkin merupakan solusi terbaik yang dapat saya pikirkan, tetapi saya lebih memilih untuk menghindarinya karena saya akan berakhir dengan proliferasi puluhan dan lusinan modul - mengelola ini akan memberatkan
Mengapa ada banyak fungsi yang tidak berhubungan dalam satu modul? Itu ApplicationHelper
dari aplikasi rel, yang tim kami telah memutuskan secara de facto sebagai tempat pembuangan untuk sesuatu yang tidak cukup spesifik untuk dimiliki di tempat lain. Sebagian besar metode utilitas mandiri yang digunakan di mana-mana. Saya dapat memecahnya menjadi pembantu yang terpisah, tetapi akan ada 30 dari mereka, semua dengan 1 metode masing-masing ... ini tampaknya tidak produktif
module UT; def add1; self+1; end; def add2; self+2; end; end
dan ingin menggunakan add1
tetapi tidak add2
di kelas Fixnum
. Bagaimana bisa membantu untuk memiliki fungsi modul untuk itu? Apakah saya melewatkan sesuatu?
Module#included
panggilan balik untuk memicu yanginclude
lain. Theformat_text
Metode dapat dipindahkan ke dalamnya modul sendiri, karena tampaknya berguna pada itu sendiri. Ini akan membuat manajemen sedikit kurang memberatkan.