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

本文关键字:代码 方法 | 更新日期: 2023-09-27 18:16:29

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

myObj.ReportGenerator.Preview = reportingObj.PreviewDocument;

…而"ReportGenerator"answers"ReportingObj"都是第三方库的实例,因此不可修改。

这段代码在Windows XP下运行得很好,但在Windows 7中运行该程序确实需要以下额外的代码行:

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

不幸的是,这段代码在整个代码库中出现了数百次,手动搜索它们听起来像是一个非常容易出错的过程。

由于"ReportGenerator"answers"reportingObj"是第三方的,我不能更改它们的getter/setter。

有什么优雅的方法来处理这样的问题?

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

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

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

您可以更改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;
         }
     }
}

您可能会发现,最少的返工将是创建一个静态类,如:

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

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

你可以替换

reportingObj.PreviewDocument;

Previewer.PreviewDocument(reportingObj);