作为整体SOLID编程工作的一部分,我在基础框架 API 中创建了一个工厂接口和一个抽象工厂。
人们已经开始重载工厂的 Create 方法。问题是人们用模型属性重载了 Create 方法(因此期望工厂填充它们)。
在我看来,属性设置不应该由工厂来完成。我错了吗?
public interface IFactory
{
I Create<C, I>();
I Create<C, I>(long id); //<--- I feel doing this is incorrect
IFactoryTransformer Transformer { get; }
IFactoryDataAccessor DataAccessor { get; }
IFactoryValidator Validator { get; }
}
更新 - 对于那些不熟悉 SOLID 原则的人,这里有一些:
单一职责原则
它指出每个对象都应该有单一职责,并且职责应该完全由类封装
Open/Closed 原则
这个原则的意思是当一个请求需要添加到你的应用程序中时,你应该能够在不修改旧类的情况下处理它,只需要添加子类和新的实现。
依赖倒置原则
它说你应该解耦你的软件模块。为此,您需要隔离依赖项。
总体而言:
我 90% 确定我知道答案。但是,我希望已经在使用 SOLID 的人进行一些很好的讨论。感谢您提出宝贵意见。
更新 - 那么我认为 SOLID 工厂应该做什么?
恕我直言,一个 SOLID 工厂提供适当的对象实例......但这样做的方式隐藏了对象实例化的复杂性。例如,如果您有一个 Employee 模型……您会要求工厂为您提供合适的模型。DataAccessorFactory 会给你正确的数据访问对象,ValidatorFactory 会给你正确的验证对象等等。
例如:
var employee = Factory.Create<ExxonMobilEmployee, IEmployee>();
var dataAccessorLdap = Factory.DataAccessor.Create<LDAP, IEmployee>();
var dataAccessorSqlServer = Factory.DataAccessor.Create<SqlServer, IEmployee>();
var validator = Factory.Validator.Create<ExxonMobilEmployee, IEmployee>();
进一步举个例子,我们会......
var audit = new Framework.Audit(); // Or have the factory hand it to you
var result = new Framework.Result(); // Or have the factory hand it to you
// Save your AuditInfo
audit.username = 'prisonerzero';
// Get from LDAP (example only)
employee.Id = 10;
result = dataAccessorLdap.Get(employee, audit);
employee = result.Instance; // All operations use the same Result object
// Update model
employee.FirstName = 'Scooby'
employee.LastName = 'Doo'
// Validate
result = validator.Validate(employee);
// Save to SQL
if(result.HasErrors)
dataAccessorSqlServer.Add(employee, audit);
更新 - 那么我为什么要坚持这种分离呢?
我觉得职责分离会产生更小的对象、更小的单元测试,并且它增强了可靠性和维护性。我认识到这样做是以创建更多对象为代价的……但这正是 SOLID 工厂保护我的原因……它隐藏了收集和实例化所述对象的复杂性。