我正在构建一个命令行exe,它可以对PDF文件应用多个操作(添加文本,图像,调整大小,裁剪等)。
目前,我的Program.cs看起来有点像这样(它使用CommandLineParser):
switch (invokedVerb)
{
case "barcode":
Operations.BarcodeOperations.AddBarCode(options.AddBarcodeVerb);
break;
case "addblankpage":
Operations.PageOperations.AddBlankPage(options.AddBlankPageVerb);
break;
}
正如您所看到的,我已将操作拆分为多个XXXOperations类,每个类都有非常相似的指令:
public static void AddStuff(StuffOptions options)
{
Logging.Log("here is a bunch of logging");
// here sometimes there is some action-specific code but not often
using (DocWrapper doc = new DocWrapper(options.File)) // this is in all actions
{
foreach (int page in doc.GetPagesToModify(options.Pages)) // this is in most actions
{
// call some stuff on the doc instance
}
doc.Save(options.OutputFile); // this is in all actions
}
}
因此,所有操作都会创建一个DocWrapper的新实例,其中大多数都在其页面上循环(但我可以修改所有这些操作),并且所有操作都保存,但是每个操作都会执行不同的操作其中的行动。
我怎么能重构这段代码,以便DocWrapper实例化,页面循环和保存在一个地方,但我可以在循环中指定自定义代码?
我正在考虑使用委托或操作来定义我的行为,但我不知道从哪里开始,因为我对它们不是很熟悉。
谢谢!
答案 0 :(得分:0)
我找到了一个解决方案并将其发布为at CodeReview
这是我到目前为止所做的:
我用冗余代码创建了一个Worker类:
public static void DoWorkOnPages(IProgramOptions options, Action<DocWrapper, int> actions) { using (DocWrapper doc = new DocWrapper(options.File)) { foreach (int page in doc.GetPagesToModify(options.Pages).OrderBy(p => p)) { actions(doc, page); } doc.Save(options.OutputFile); } }
在每个XXXOperations类中,我的方法都这样称呼它:
public static void AddBarStuff(StuffOptions options) { Logging.Log("Here is a magnificient function"); using (Image barcode = CreateStuffImage(someParameters)) { Worker.DoWorkOnPages(options, (doc, page) => { // do something with options, doc, page and barcode }); } }
显然,对于那些不完全正常工作的操作 这个,我不得不复制一些代码,但我想它无法得到帮助。
如果你想出一个更优雅,更简单,更强大的 解决方案或只是一个不同的解决方案,我很乐意支持它。