我正在重构相当大部分的意大利面条代码。简而言之,它是一个很大的“类神”类,根据某些条件分为两个不同的过程。这两个过程都很冗长,并且有很多重复的代码。
所以我的第一个努力是将这两个进程提取到它们自己的类中,并将公共代码放在它们都继承自的父级中。
它看起来像这样:
public class ExportProcess
{
public ExportClass(IExportDataProvider dataProvider, IExporterFactory exporterFactory)
{
_dataProvider = dataProvider;
_exporterFactory = exporterFactory;
}
public void DoExport(SomeDataStructure someDataStructure)
{
_dataProvider.Load(someDataStructure.Id);
var exporter = _exporterFactory.Create(_dataProvider, someDataStructure);
exporter.Export();
}
}
我是 Mark Seemann 博客的狂热读者,在这篇文章中,他解释说这段代码有一种时间耦合的味道,因为有必要在数据提供程序处于可用状态之前调用它的 Load 方法。
基于此,并且由于对象被注入到工厂返回的对象中,我正在考虑更改工厂以执行此操作:
public IExporter Create(IExportDataProvider dataProvider, SomeDataStructure someDataStructure)
{
dataProvider.Load(someDataStructure.Id);
if(dataProvider.IsNewExport)
{
return new NewExportExporter(dataProvider, someDataStructure);
}
return new UpdateExportExporter(dataProvider, someDataStructure);
}
由于名称“DataProvider”,您可能猜到 Load 方法实际上是在进行数据库访问。
有些东西告诉我,在抽象工厂的 create 方法中进行数据库访问的对象不是一个好的设计。
是否有任何指导方针、最佳实践或说这实际上是个坏主意?
谢谢你的帮助。