私はスパゲッティコードのかなりの部分をリファクタリングしているところです。一言で言えば、それはある条件に応じて2つの異なるプロセスに分岐する大きな「神のような」クラスです。どちらのプロセスも時間がかかり、重複したコードがたくさんあります。
したがって、私の最初の取り組みは、これら2つのプロセスを独自のクラスに抽出し、両方が継承する親に共通のコードを配置することでした。
これは次のようになります。
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();
}
}
私はMarkSeemannのブログを熱心に読んでいます。このエントリでは、データプロバイダーが使用可能な状態になる前に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メソッド内でデータベースアクセスを行うオブジェクトは適切な設計ではないということを教えてくれます。
これが事実上悪い考えであると言うガイドライン、ベストプラクティス、または何かがありますか?
ご協力いただきありがとうございます。