避免在以下遗留代码中进行大量代码更改的优雅方法
本文关键字:代码 方法 | 更新日期: 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);