我在重構的麪條代碼相當大一部分的過程之前調用一個工廠內的類初始化方法。簡而言之,它是一個巨大的「上帝」類,根據某種條件分爲兩個不同的過程。這兩個過程都很長,並且有很多重複的代碼。這是一個好的設計方案將其注入
所以我的第一次努力已經給這兩個過程提取到自己的類,並把通用代碼中他們都繼承父。
它看起來是這樣的:
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();
}
}
我是馬克·西曼的博客的忠實讀者,並在this entry他解釋說,這代碼有一個時間耦合的氣味,因爲有必要呼籲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方法實際上是在做數據庫訪問。
東西告訴我一個對象做一個抽象工廠的創建方法內部數據庫訪問是不是一個很好的設計。
是否有任何指引,也說這是有效的一個壞主意最佳做法或東西嗎?
感謝您的幫助。
顯然dataProvider.Load具有某種副作用,沿着獲取某個實例到屬性的線路?工廠方法的其餘部分實際上是否使用'dataProvider'和'someDataStructure'?如果沒有,那麼你的工廠方法的參數應該被重構爲接受它真正需要的參數。 – PatrikAkerstrand
@PatrikAkerstrand:好點Patrik。實際上,由工廠創建的對象確實使用數據提供者,因爲它的Load方法確實會填充很多所需的屬性。這是第一次重構工作,但不幸的是,這是一項技術債務,可能在短期內無法獲得支付。 –
好吧,請考慮這一點:如果dataProvider.Load會被多次調用,那會產生什麼問題嗎? **如果沒有**:Cool,我會將'Load'-call移動到工廠方法中,因爲它會簡化客戶端(所有對.Load的調用都將在工廠方法中)。 **如果是**:你別無選擇,只能將它放在工廠外面,因爲你不知道它是否已初始化 – PatrikAkerstrand