C# 在以下遗留代码中避免大量代码更改的优雅方法
在某些旧代码中,以下代码段出现了数百次:C# 在以下遗留代码中避免大量代码更改的优雅方法,c#,legacy-code,C#,Legacy Code,在某些旧代码中,以下代码段出现了数百次: myObj.ReportGenerator.Preview = reportingObj.PreviewDocument; 。。。鉴于“ReportGenerator”和“ReportingObj”都是第三方库的实例,因此不可修改 该代码在Windows XP下运行良好,但在Windows 7中运行该程序确实需要以下额外代码行: reportingObj.Render(); myObj.ReportGenerator.Preview = reporti
myObj.ReportGenerator.Preview = reportingObj.PreviewDocument;
。。。鉴于“ReportGenerator”和“ReportingObj”都是第三方库的实例,因此不可修改
该代码在Windows XP下运行良好,但在Windows 7中运行该程序确实需要以下额外代码行:
reportingObj.Render();
myObj.ReportGenerator.Preview = reportingObj.PreviewDocument;
不幸的是,这段代码在整个代码库中出现了数百次,手动搜索它们听起来像是一个非常容易出错的过程
由于“ReportGenerator”和“reportingObj”是第三方,我不能更改它们的getter/setter
处理此类问题的优雅方法是什么?您可以将
ReportingObj
封装在自己的类中,在该类中您只需委托给原始ReportingObj,但对于PreviewDocument
属性检查,查看是否调用了Render()
,如果没有调用它,类似这样:
public Foo PreviewDocument
{
get
{
if (!_rendered)
{
_originalreportingObj.Render();
_rendered = true;
}
return _originalreportingObj.PreviewDocument;
}
}
您可以更改
myObj
的类,我假设该类由您控制,并让ReportGenerator
属性返回一个包装类,该包装类调用预览的原始setter
或在调用Render()
后调用它:
您可能会发现,最少的返工将是创建一个静态类,例如:
public class Previewer
{
public static PreviewDocumentType PreviewDocument(ReportingObject reportingObj) {
reportingObj.Render();
return reportingObj.PreviewDocument;
}
}
其中PreviewDocumentType是从PreviewDocument返回的类型,ReportingObject是报告对象的类型
然后,您可以替换
reportingObj.PreviewDocument;
与
好主意!您能澄清一下“委托给原件”的确切含义吗?你的意思是让Foo成为reportingObj类的子类吗?不使用组合而不是继承-原始reportingObj'是这个类中的一个字段-新类上的每个方法调用都只调用包装实例上的相同方法
reportingObj.PreviewDocument;
Previewer.PreviewDocument(reportingObj);