想我再也噸文件名的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
任何行動之前完成。如果已經完成,我不想重做過濾。 我只是學習一些關於設計模式,我想我可以使用:
- 一個抽象基實現
filter*
方法 - 工廠從調用的方法來決定類
AbstractFilter
這裝飾使用 - 我每次叫
filter
*方法我返回一個裝飾類,例如時間:
AbstractFilter::filter_run(string arg) {
decorator = factory.get_decorator_run(arg); // if arg is "> 00179691" returns FilterRunGreater(00179691)
return decorator(this);
}
- 代理是建立一個正則表達式過濾的文件名,但不要做過濾
我也在學習jQuery和我使用的是類似鏈接機制。
有人可以給我一些提示嗎?有沒有什麼地方可以解釋這樣的設計?設計必須非常靈活,特別是處理文件名中的新格式。
正則表達式不是問題。我會執行withoud第三部分庫 – 2011-05-16 21:05:26