に大量のファイル名がありmy_dir/my_subdir
、何らかの方法でフォーマットされているとします。
data11_7TeV.00179691.physics_Egamma.merge.NTUP_PHOTON.f360_m796_p541_tid319627_00
data11_7TeV.00180400.physics_Egamma.merge.NTUP_PHOTON.f369_m812_p541_tid334757_00
data11_7TeV.00178109.physics_Egamma.merge.D2AOD_DIPHO.f351_m765_p539_p540_tid312017_00
たとえばdata11_7TeV
、実行番号、data_type
データ形式です。00179691
NTUP_PHOTON
私はこのようなことをするためのインターフェースを書きたいです:
dataset = DataManager("my_dir/my_subdir").filter_type("data11_7TeV").filter_run("> 00179691").filter_tag("m = 796");
// don't to the filtering, be lazy
cout << dataset.count(); // count is an action, do the filtering
vector<string> dataset_list = dataset.get_list(); // don't repeat the filtering
dataset.save_filter("file.txt", "ALIAS"); // save the filter (not the filenames), for example save the regex
dataset2 = DataManagerAlias("file.txt", "ALIAS"); // get the saved filter
cout << dataset2.filter_tag("p = 123").count();
count
たとえば、やのようなアクションの前に実際のフィルタリングを行う必要はありませんget_list
。フィルタリングが既に行われている場合、フィルタリングをやり直したくありません。私はちょうどデザインパターンについて何かを学んでいて、私が使うことができると思います:
- メソッド
AbstractFilter
を実装する抽象基本クラスfilter*
- 呼び出されたメソッドからデコレータが使用するものを決定するファクトリ
filter
* メソッドを呼び出すたびに、装飾されたクラスを返します。次に例を示します。
AbstractFilter::filter_run(string arg) {
decorator = factory.get_decorator_run(arg); // if arg is "> 00179691" returns FilterRunGreater(00179691)
return decorator(this);
}
- ファイル名をフィルタリングするために正規表現を構築するが、フィルタリングを行わないプロキシ
私はjQueryも学んでおり、同様の連鎖メカニズムを使用しています。
誰かが私にいくつかのヒントを教えてもらえますか? このようなデザインが説明されている場所はありますか?特にファイル名の新しい形式を処理するために、設計は非常に柔軟でなければなりません。