Tło:
Mam moduł, który deklaruje kilka metod instancji
module UsefulThings
def get_file; ...
def delete_file; ...
def format_text(x); ...
end
I chcę wywołać niektóre z tych metod z poziomu klasy. Sposób, w jaki zwykle robisz to w Ruby, wygląda tak:
class UsefulWorker
include UsefulThings
def do_work
format_text("abc")
...
end
end
Problem
include UsefulThingswprowadza wszystkie metody z UsefulThings. W tym przypadku chcę tylko format_texti wyraźnie nie chcę get_filei delete_file.
Widzę kilka możliwych rozwiązań tego problemu:
- W jakiś sposób wywołuje metodę bezpośrednio w module, nie włączając jej nigdzie
- Nie wiem, jak / czy można to zrobić. (Stąd to pytanie)
- W jakiś sposób włączaj
Usefulthingsi wprowadzaj tylko niektóre z jego metod- Nie wiem też, jak / czy można to zrobić
- Utwórz klasę proxy, dołącz ją
UsefulThings, a następnie delegujformat_textdo tej instancji proxy- To by zadziałało, ale anonimowe klasy proxy to hack. Fuj.
- Podziel moduł na 2 lub więcej mniejszych modułów
- To też by zadziałało i jest prawdopodobnie najlepszym rozwiązaniem, jakie przychodzi mi do głowy, ale wolałbym tego uniknąć, ponieważ skończyłoby się to mnożeniem dziesiątek modułów - zarządzanie tym byłoby uciążliwe
Dlaczego w jednym module jest wiele niezwiązanych ze sobą funkcji? Pochodzi ApplicationHelperz aplikacji railsowej, którą nasz zespół de facto zdecydował jako wysypisko wszystkiego, co nie jest na tyle specyficzne, by należało do innego miejsca. W większości samodzielne metody narzędziowe, które są używane wszędzie. Mógłbym podzielić to na oddzielnych pomocników, ale byłoby ich 30, wszyscy z 1 metodą każda ... wydaje się to nieproduktywne
module UT; def add1; self+1; end; def add2; self+2; end; endi chcesz używać, add1ale nie add2w klasie Fixnum. Jak pomogłoby posiadanie do tego funkcji modułu? Czy coś mi brakuje?
Module#includedwywołania zwrotnego do wyzwalaniaincludedrugiego.format_textSposób można przenieść do niego własnego modułu, ponieważ wydaje się być przydatna na swój własny. Dzięki temu zarządzanie byłoby mniej uciążliwe.