在以下遗留代码中避免大量代码更改的优雅方法

时间:2011-12-01 21:50:54

标签: c# legacy-code

在某些遗留代码中,出现以下代码片段数百次:

myObj.ReportGenerator.Preview = reportingObj.PreviewDocument;

...“ReportGenerator”和“ReportingObj”都是第三方库的实例,因此无法修改。

此代码在Windows XP下运行良好,但在Windows 7中运行该程序确实需要以下额外代码:

reportingObj.Render();
myObj.ReportGenerator.Preview = reportingObj.PreviewDocument;

不幸的是,这段代码中出现了数百个代码库,并且手动搜索它们听起来很容易出错。

由于“ReportGenerator”和“reportingObj”是第三方,我无法更改其getter / setter。

处理此类问题的优雅方法是什么?

3 个答案:

答案 0 :(得分:4)

您可以将ReportingObj包装在您委派给原始ReportingObj的自己的类中,但是对于PreviewDocument属性检查以查看是否调用了Render(),如果没有叫它 - 像这样:

public Foo PreviewDocument
{
    get
    {
        if (!_rendered)
        {
            _originalreportingObj.Render();
            _rendered = true;
        }
        return _originalreportingObj.PreviewDocument;
    }
}

答案 1 :(得分:1)

您可以更改myObj的类,我假设它在您的控制之下,并让ReportGenerator属性返回一个包装类,该类可以调用Preview的原始setter或调用Render()后调用它:

public class ReportGeneratorWrapper
{
     private ReportGenerator m_InnerReportGenerator;

     public PreviewDocument Preview
     {
         get
         {
             return m_InnerReportGenerator;
         }
         set
         {
             if (IsNT6OrAbove)
                 value.Render();

             m_InnerReportGenerator = value;
         }
     }
}

答案 2 :(得分:1)

您可能会发现创建静态类的返工量最少,如:

public class Previewer
{
     public static PreviewDocumentType PreviewDocument(ReportingObject reportingObj) {
       reportingObj.Render();
       return reportingObj.PreviewDocument;
     }
}

其中PreviewDocumentType是从PreviewDocument返回的类型,而ReportingObject是报告对象的类型。

然后您可以替换

reportingObj.PreviewDocument;

Previewer.PreviewDocument(reportingObj);