2012-01-19 3 views
0

ディレクトリ構造を横断して動的にコードをロードし、そこにあるモジュールを動的にロードしたいと考えています。モジュールをネストされたディレクトリに動的に組み込むにはどうしたらいいですか?

これを行う目的は、一連の検証を実行することです。最上位の検証が失敗した場合、子検証は実行されません。

コントローラオブジェクトがディレクトリをスキャンし、モジュールの階層を構築し、上位レベルの検証の成功/失敗に基づいてツリーの特定の部分をトラバースするかどうかの決定を下すことができたと思っていました。

たとえば、私は正規表現に対して実行したい一連の検証を行っているかもしれませんが、正規表現が存在しないか、空であれば検証は実行されません。この場合、トップレベルのディレクトリにはexistsの検証だけが含まれ、子ディレクトリには正規表現が存在する場合に実行される他のすべての検証が含まれます。

これらのバリデーションを別々のファイルで定義し、必要な階層を作成できることは、既存のクラスを開けたり、メソッドを追加したりする必要がなく、後でさらにバリデーションを追加するのに非常に便利です。

アプリケーションがディレクトリを動的にスキャンし、ファイル名をコレクションに保存し、そのコレクションの要素をrequireに使用する方法はありますか?私はそうは思わない。負荷はどうですか?

このようなデザインを実現する方法はありますか?それとも、私はそれをすべて間違って考えているのですか?代わりに他の方法論を考えるべきですか?

+0

あなたの目標は本当にわかりません。ダイナミックなモジュール読み込みと比べて、検証チェーンに似ています。バリデーション*メソッド*は、バリデーションのコレクションの成功/失敗に関係なく存在することができます。 –

答えて

1

あなたのリクエストは非常に有効ですが、自動的にあなたのための言語はありません。ディレクトリに潜入するためのコードを記述し、テストの存在を判断し、さらにドリルダウンする必要があるかどうかを判断する必要があります。

ルビーが助けになります。 Findモジュールがあり、標準ライブラリに含まれています。これは、そのドキュメントからです:

 
The Find module supports the top-down traversal of a set of file paths. 

For example, to total the size of all files under your home directory, 
ignoring anything in a "dot" directory (e.g. $HOME/.ssh): 

     require 'find' 

     total_size = 0 

     Find.find(ENV["HOME"]) do |path| 
     if FileTest.directory?(path) 
      if File.basename(path)[0] == ?. 
      Find.prune  # Don't look any further into this directory. 
      else 
      next 
      end 
     else 
      total_size += FileTest.size(path) 
     end 
     end 

そのコードから、あなたはさらにドリルダウンする必要があるかどうかを決定するために、ファイルやフォルダ組み込みの署名を探します。見つかったファイルごとに、requireを使用してロードします。

他の例は、人々がどのように使用するかを示す「internets」にあります。Findまた、Dirモジュールはglobを使用して同様の機能を持ちますが、降下する場所を教えて、返された結果を反復処理することができます。

+0

ディレクトリとファイルのリストを見つけたら、チェックしたい条件に従ってそのファイル名を要求するためにループすることができます。 – roberocity

+1

@roberocity、はい。私はそれを追加しようとしていたが、会議に呼ばれた。 –

+1

+1。 :) – roberocity