Я просто использовал бы комбинацию командной строки и конвенцию.
Если фильтр указан, используйте его для фильтрации данных
Я предполагаю, что Вы указали бы фильтр на командной строке? Таким образом, Вы вызвали бы приложение как это?
ruby dataprocessor.rb custom_filter
Если так, Вы могли определить "API", где имя класса должно будет соответствовать тому, что было передано в - в значительной степени точно, как Вы описали в своем примере.
Взять его один шаг вперед, хотя, у Вас могла быть некоторая логика, которая искала CustomFilter
класс с помощью рубина defined?
, и если это не было найдено, пойдите, ища custom_filter.rb
(или любые подходящие изменения) и попытка загрузить тот файл, затем повторите.
Это дает Вам большую расширяемость, как можно записать, поскольку много классов фильтра как Вам угодно отказываются от них их собственные .rb файлы и помещают их где угодно, что рубин может найти их. У Вас не должно будет быть предопределенных констант также, единственные ограничения будут
do_filter
методКстати, это довольно подобно тому, какие направляющие делает для требования Ваших моделей и, почему можно просто использовать SomeModel
не имея необходимость всегда делать require app/models/some_model
сначала :-)'
# user code
USER_FILTER = lambda { |value| value != 0xDEADBEEF }
# script code
load( user_code );
FILTER = ( const_defined?(:USER_FILTER) ? USER_FILTER : lambda { true } )
output_array = input_array.filter(&FILTER)
Похож на задание для Стратегической модели, и так как рубин имеет функции как первоклассные объекты, Вы могли бы передать функцию фильтра, которая будет запоминаться массивом, для вызова той пользовательской функции фильтра по требованию.