假设您从一个接受两个复杂对象的方法开始。这个方法是一些排序处理程序,它需要处理工作流(见工作流流程图)
public Task Handler(Object A, List<object> lisftOfObjectsB)
{
//execute workflow steps here
}
您可以通过使用“if”、“if-else”、“switch”等语句来做到这一点。但是如果您以这种方式编程,您最终会得到混乱的代码,并且您可能至少违反了 SOLID 原则之一(例如开闭原则)。 您如何根据 SOLID 原则并使用 OOP 来编写工作流程,而不是使用许多不同的 if、if-else、switch 等语句?
public Task Handler(Object A, List<object> lisftOfObjectsB)
{
bool inDb = IsAInDatabase();
if(inDb == false)
{
//Add to DB
}
else
{
bool hasLastState = CheckForLastState(A);
if(hasLastState == false)
{
//Add laststate
}
}
....
}
如果你这样做,你最终会得到许多不同的 if/else/for/for-each 语句,想象一下工作流是否会有更多的步骤和是/否决定。
将您的代码视为一篇科学文章,在一篇论文中:
你有一个内容的“主要”目的,你需要读者明白你有某种信息需要传达给读者。
所以你有一个“主要”方法,这是你的起点。 现在您需要创建第一个抽象层 -> 我想告诉读者我的代码在做什么?
在您的工作流程中,您有两个类 A 和 B。现在 A 和 B 之间似乎没有联系,所以第一个错误是将两者联系起来。您不需要在执行 B 之前等待 A 完成。在 B 之前处理对象 A 没有依赖性。
所以你首先应该把你的工作流程一分为二。一个给A,一个给B。 (如果有一个(或多个),好吧,但是我们需要知道 A 和 B 之间的依赖关系)
然后你进行抽象:(这是伪代码,假设你使用的是 DI)
public interface IObjectAVerifier{
bool VerifyObjectAInPersistence(Object a);
}
public interface IPersistenceLayerVerifier(object a)
{
IInsertAIntoPersistence VerifyIsInPersistence(a);
}
public interface ILastStateChecker(Object a){
}
public interface IListObjectValidator{
ValidateListOfObjectBInPersistence(List<Object> objectList);
}
public interface IInsertAIntoPersistence {
}
现在你的主要方法是:
public static void Main(string[] args) {
object a = InitializeA();
List<object> list = InitializeList();
IObjectAVerifier objectAVerifier = new ObjectAVerifier();
IListObjectValidator listValidator = new ListObjectValidator();
ojbectAVerifier.VerifyObjectAInPersistence(a);
listValidator.ValidateListOfObjectBInPersistence(b)
}
然后你实施:
public class ObjectAVerifier : IObjectAVerifier {
private readonly IPersistenceVerifier _persistenceVerifier;
private readonly ILastStateChecker _lastStateChecker;
public ObjectAVerifier(IVerifyAIsInPersistenceLayer verifyAIsInPersistenceLayer, ILastStateChecker lastStateChecker, DbContext context)
{
_persistenceVerifier = verifyAIsInPersistenceLayer;
_lastStateChecker = lastStateChecker;
}
public bool VerifyObjectAInPersistence(object a) {
IInsertAction action = IPersistenceLayerVerifier.VerifyIsInPersistence(a);
}
}
public class PersistenceLayerVerifier : IPersistenceLayerVerifier {
private DbContext _context;
public PersistenceLayerVerifier(DbContext context)
{
_context = context;
}
public IInsertAIntoPersistence VerifyIsInPersistence(object a)
{
if(_context.Set<A>().contains(a))
{
return new NullObjectInserter(); // this implementation does nothing.
}
return new InsertAIntoPersistence(a); //this implementation does an actual insert
}
}
这只是一个超级简单的部分示例,说明您可以做什么,将您的工作流程转换为 OOP 和 SOLID 编程。 我希望这足以让球滚动?其他问,我会扩展我的答案。