如何正确重构一些复制/粘贴的代码

本文关键字:代码 复制 何正确 重构 | 更新日期: 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
            });
    }
}

显然,在不完全正常工作的操作中这个,我不得不复制一些代码,但我想这是没有帮助的。

如果你想出一个更优雅、更简单、更强大的解决方案,或者只是一个不同的解决方案,我很乐意投赞成票。