我有一个命令行Ruby应用程序我正在开发,我想允许它的用户提供将作为过程的一部分进行过滤的代码.基本上,应用程序执行此操作:
我希望过滤过程(步骤2)尽可能灵活.
我的想法是用户可以提供一个Ruby文件,设置一个已知的常量来指向实现我定义的接口的对象,例如:
# user's filter
class MyFilter
def do_filter(array_to_filter)
filtered_array = Array.new
# do my filtering on array_to_filter
filtered_array
end
FILTER = MyFilter.new
Run Code Online (Sandbox Code Playgroud)
我的应用程序的代码将执行以下操作:
array_that_might_get_filtered = get_my_array()
if (options.filter_file)
require options.filter_file
array_that_might_get_filtered = FILTER.do_filter(array_that_might_get_filtered)
end
Run Code Online (Sandbox Code Playgroud)
虽然这会起作用,但感觉很俗气,似乎应该有更好的方法来做到这一点.我还认为过滤器的形式是为已知类添加已知名称的方法,但这似乎也不正确.
Ruby中有更好的成语吗?
我只是使用命令行和约定的组合。
如果指定了过滤器,则使用它来过滤数据
我假设您会在命令行上指定一个过滤器?那么您会像这样调用应用程序吗?
ruby dataprocessor.rb custom_filter
Run Code Online (Sandbox Code Playgroud)
如果是这样,您可以定义一个“api”,其中类名必须与传入的内容相匹配 - 与您在示例中描述的方式几乎完全相同。
不过,更进一步,您可以使用一些逻辑来CustomFilter使用 ruby 查找该类defined?,如果找不到,则继续查找custom_filter.rb(或任何合适的变体)并尝试加载该文件,然后重试。
这为您提供了很好的可扩展性,因为您可以编写任意数量的过滤器类,将它们放入自己的 .rb 文件中,并将它们放在 ruby 可以找到它们的任何地方。您也不必有预定义的常量,唯一的约束是
do_filter方法顺便说一句,这与 Rails 对模型的要求非常相似,这就是为什么您可以直接使用而SomeModel不必总是先做require app/models/some_model:-)`