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

时间:2014-09-04 08:17:31

标签: c# refactoring

我正在构建一个命令行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实例化,页面循环和保存在一个地方,但我可以在循环中指定自定义代码?

我正在考虑使用委托或操作来定义我的行为,但我不知道从哪里开始,因为我对它们不是很熟悉。

谢谢!

1 个答案:

答案 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
            });
    }
}
     

显然,对于那些不完全正常工作的操作   这个,我不得不复制一些代码,但我想它无法得到帮助。

     

如果你想出一个更优雅,更简单,更强大的   解决方案或只是一个不同的解决方案,我很乐意支持它。