Ruby コマンドライン アプリのスクリプトを作成します。これを行うための最良の方法は何ですか?
質問
開発中のコマンドライン 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
私のアプリのコードは次のようなことを行います。
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
これは機能するかもしれませんが、安っぽく感じられ、もっと良い方法があるはずだと思われます。既知のクラスに既知の名前のメソッドを追加する形式のフィルターを使用することも検討しましたが、それもあまり正しくないようでした。
Ruby でこれに適したより良いイディオムはありますか?
解決
コマンドラインと規約を組み合わせて使用するだけです。
フィルターが指定されている場合は、それを使用してデータをフィルターします
コマンドラインでフィルターを指定すると思いますか?では、次のようにアプリケーションを呼び出しますか?
ruby dataprocessor.rb custom_filter
その場合は、クラス名が渡されたものと一致する必要がある「API」を定義できます。例で説明したとおりです。
ただし、さらに一歩進めるために、 CustomFilter
Rubyを使ったクラス defined?
, 見つからなかった場合は、探してください。 custom_filter.rb
(または適切なバリエーション)、そのファイルをロードしてから再試行してください。
これにより、フィルター クラスを好きなだけ記述し、独自の .rb ファイルに入れて、Ruby が見つけられる場所に配置できるため、優れた拡張性が得られます。事前に定数を定義する必要もありません。唯一の制約は次のとおりです。
- クラス名はファイル名 (の変形) と一致する必要があります。これは Ruby の規則なので、おそらくすでにそうしているでしょう。
- 事前に定義されたメソッドが必要です。
do_filter
方法
ちなみに、これは、Rails がモデルを要求するために行うことと非常によく似ており、次のように使用できるのはそのためです。 SomeModel
いつもそうする必要がなくても require app/models/some_model
最初に:-)`
他のヒント
戦略パターンの仕事のように見えますが、Rubyにはファーストクラスオブジェクトとして機能、フィルターを渡すことができますカスタムフィルター関数をオンデマンドで呼び出すために、配列に記憶される関数。
# 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)