将工作流转换为关于 SOLID 和 OOP 的状态机

问题描述 投票:0回答:1

假设您从一个接受两个复杂对象的方法开始。这个方法是一些排序处理程序,它需要处理工作流(见工作流流程图)

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 语句,想象一下工作流是否会有更多的步骤和是/否决定。

c# oop design-patterns state-machine stateless
1个回答
0
投票

将您的代码视为一篇科学文章,在一篇论文中:

你有一个内容的“主要”目的,你需要读者明白你有某种信息需要传达给读者。

所以你有一个“主要”方法,这是你的起点。 现在您需要创建第一个抽象层 -> 我想告诉读者我的代码在做什么?

在您的工作流程中,您有两个类 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 编程。 我希望这足以让球滚动?其他问,我会扩展我的答案。

© www.soinside.com 2019 - 2024. All rights reserved.