【问题标题】:Managing statuses and validation rules using state and factory design patterns使用状态和工厂设计模式管理状态和验证规则
【发布时间】:2023-03-22 00:15:02
【问题描述】:

在我最近的项目中,我有一个 Order 类,它的属性将由不同的用户逐步完成,每个用户将部分完成的订单提交给下一个用户,所以我假设每个 Order 都有每次一个Status,例如当一个Order创建时,它的Status将是NewStatus,当为它指定BOM(Bill of material)时,它的Status将是BOMAttachedStatus,当它计划生产其Status 将是PlannedStatus,依此类推。

我还需要在每个步骤中对Order 应用一些验证规则,例如用户必须在创建Order(NewState) 时指定客户名称,或者当Order 正在计划时用户必须设置 PlanningDate(@ 987654337@), ...

所以,我决定使用 State Design Pattern 来管理状态,并使用 Factory Design Pattern 来检查验证:

public static class StatusFactory
{
    static public IStatus CreateOrderStatus(Order order)
    {
            //check statuses from last to first   
            if (order.PlanningDate != null)    
               return new PlannedStatus();
               ....            
            if(order.CustomerName != string.Empty)  
               return new OrderItemNewState();
    }
}

当我想保存我的currentOrder 时,我调用StateFactory.CreateOrderStatus(currentOrder) 来设置它的Status

public void Save(Order order)
{
   order.Status = StatusFactory.CreateOrderStatus(order);
   UnitOfWork.SaveChanges();
}

这种方法对我的情况是否正确?有没有更好的解决方案?

【问题讨论】:

    标签: c# validation state-pattern static-factory


    【解决方案1】:

    这可行,但是您的设计和您所描述的内容存在一些问题。

    1. 在转换到每个状态时,需要触发规则并验证输入对象 - 您的设计未涵盖此内容
    2. 状态更改不在任何地方进行管理,因此您需要将该逻辑分散在 StateFacotry 或其他地方并手动处理。

    我要做的是创建一个 StateMachine 类,您可以简单地调用 Transition 方法并提供一个目标 State。 转换方法从 State 查询以了解需要验证哪些规则并调用验证方法。如果成功则改变对象的状态。

    这种设计的好处:

    1. StateMachine 可以注册状态图 (S1->S2,S3 | S2->END | S3->S4 | S4->END)
    2. 状态转换会根据寄存器图自动发生,并且
    3. 每个州都知道需要满足哪些规则才能使转换成功进行。 (自我描述)
    4. StateMachine 尚未公开状态如何转换的逻辑,并且全部封装在该实现中
    5. StateMAchine 独立于实际对象,并管理所有转换逻辑和验证执行(您可以简单地将成熟的验证引擎集成到您的状态机中)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      相关资源
      最近更新 更多