Tôi đang trong quá trình tái cấu trúc một phần lớn mã spaghetti. Tóm lại, nó là một lớp học "Thiên Chúa" giống như các chi nhánh thành hai quá trình khác nhau tùy thuộc vào một số điều kiện. Cả hai quy trình đều dài và có nhiều mã trùng lặp.Đây có phải là một tùy chọn thiết kế tốt để gọi phương thức khởi tạo của lớp trong một nhà máy trước khi tiêm nó
Vì vậy, nỗ lực đầu tiên của tôi là trích xuất hai quy trình đó thành các lớp của riêng chúng và đặt mã chung vào một cấp độ gốc mà cả hai đều kế thừa.
Nó trông giống như sau:
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();
}
}
Tôi là một độc giả cuồng nhiệt của blog của Mark SEEMANN và trong this entry ông giải thích rằng mã này có một khớp nối mùi thời gian kể từ khi nó là cần thiết để gọi phương thức tải về nhà cung cấp dữ liệu trước khi nó ở trạng thái có thể sử dụng.
Trên cơ sở đó, và kể từ khi đối tượng đang được tiêm cho những người được trả về bởi các nhà máy dù sao, tôi đang nghĩ đến việc thay đổi nhà máy để làm điều này:
public IExporter Create(IExportDataProvider dataProvider, SomeDataStructure someDataStructure)
{
dataProvider.Load(someDataStructure.Id);
if(dataProvider.IsNewExport)
{
return new NewExportExporter(dataProvider, someDataStructure);
}
return new UpdateExportExporter(dataProvider, someDataStructure);
}
Bởi vì tên "DataProvider" bạn có thể đoán rằng phương thức Load thực sự đang thực hiện truy cập cơ sở dữ liệu.
Điều gì đó cho tôi biết một đối tượng đang thực hiện truy cập cơ sở dữ liệu bên trong phương thức tạo của nhà máy trừu tượng không phải là thiết kế tốt.
Có bất kỳ nguyên tắc, phương pháp hay nhất hoặc điều gì đó cho biết đây có phải là một ý tưởng tồi không?
Cảm ơn sự giúp đỡ của bạn.
Rõ ràng dataProvider.Load có một số loại tác dụng phụ, dọc theo dòng lấy một thể hiện của một cái gì đó vào một tài sản? Phần còn lại của phương thức nhà máy có thực sự sử dụng 'dataProvider' và' someDataStructure' không? Nếu không, thì các đối số của bạn đối với phương thức factory-factory nên được tái cấu trúc thành chấp nhận các đối số mà nó thực sự cần. – PatrikAkerstrand
@PatrikAkerstrand: Điểm tốt Patrik. Các đối tượng được tạo ra bởi nhà máy làm, trên thực tế, sử dụng các nhà cung cấp dữ liệu rất nhiều kể từ khi phương pháp tải của nó cư một số tài sản khá cần thiết. Đây là một nỗ lực tái cấu trúc đầu tiên nhưng, thật không may, đây là một khoản nợ kỹ thuật có thể không được trả trong thời gian ngắn hơn. –
ok, hãy xem xét điều này sau đó: Nếu dataProvider.Load sẽ được gọi nhiều lần, điều đó có tạo ra bất kỳ vấn đề nào không? ** Nếu không **: Cool, tôi sẽ di chuyển lệnh 'Load' vào phương thức factory vì nó sẽ đơn giản hóa các máy khách (tất cả các lệnh gọi tới .Load sẽ nằm trong phương thức factory). ** Nếu có **: Bạn không có lựa chọn nào khác ngoài việc giữ nó bên ngoài nhà máy, vì bạn không biết liệu nó có được khởi tạo hay không – PatrikAkerstrand