Ruby コマンドライン アプリのスクリプトを作成します。これを行うための最良の方法は何ですか?

StackOverflow https://stackoverflow.com/questions/251444

  •  05-07-2019
  •  | 
  •  

質問

開発中のコマンドライン Ruby アプリがあり、そのユーザーがプロセスの一部でフィルターとして実行されるコードを提供できるようにしたいと考えています。基本的に、アプリケーションは次のことを行います。

  1. 何らかのデータを読み込む
  2. フィルターが指定されている場合は、それを使用してデータをフィルターします
  3. データを処理する

フィルタリング プロセス (ステップ 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 が見つけられる場所に配置できるため、優れた拡張性が得られます。事前に定数を定義する必要もありません。唯一の制約は次のとおりです。

  1. クラス名はファイル名 (の変形) と一致する必要があります。これは Ruby の規則なので、おそらくすでにそうしているでしょう。
  2. 事前に定義されたメソッドが必要です。 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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top