如何正确重构一些复制/粘贴的代码
本文关键字:代码 复制 何正确 重构 | 更新日期: 2023-09-27 18:20:33
我正在构建一个命令行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实例化、页面循环和保存都在一个地方,但我可以在循环中指定自定义代码?
我正在考虑使用委托或动作来定义我的动作,但我不知道从哪里开始,因为我不太熟悉它们。
谢谢!
我找到了一个解决方案,并将其发布在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 }); } }
显然,在不完全正常工作的操作中这个,我不得不复制一些代码,但我想这是没有帮助的。
如果你想出一个更优雅、更简单、更强大的解决方案,或者只是一个不同的解决方案,我很乐意投赞成票。