【问题标题】:Best Design Pattern to execute a Series of Steps执行一系列步骤的最佳设计模式
【发布时间】:2020-08-08 20:35:19
【问题描述】:

我有一个应用程序,用户可以使用它启动(填写表格并单击运行)一系列步骤。

必须先执行第1步,然后执行第2步。如果第2步成功,则执行第3步,否则执行第4步。最后必须执行第5步。

每个步骤大约有 10 到 100 行代码。

为了实现这个逻辑,我应该使用哪种设计模式来最好地构建我的代码?是责任链模式、模板方法模式还是其他模式?

【问题讨论】:

  • “责任链”通常不用于您在此处描述的内容。但你可以做到
  • 那么,如果有的话,哪种模式最适合这里?
  • 你是使用模式开发还是开发使用模式?
  • 保持简单。如果有一组固定的步骤,则每个步骤都可以是一个方法,并且可以将失败抛出或以其他方式传播给调用者。
  • 是否所有五个步骤都在单击“运行”按钮时执行?或者您是在谈论某种工作流程(或“向导”),其中包含用户必须点击的多个屏幕?

标签: c# design-patterns software-quality


【解决方案1】:
  • 如果执行代码的步骤意味着系统的不同状态,其中它对传入消息的反应不同,那么这可以使用State 模式来实现。

  • 如果您有或将有一个层次结构的类,每个类都执行相同的一组步骤,但实现方式略有不同,那么Template 模式是合适的。

  • 如果它只是由几个函数调用组成的执行流程,那么请参阅 Olivier 的答案。

【讨论】:

    【解决方案2】:

    一些方法调用和一个 if-else-statement 应该可以满足您的需求。

    Step1();
    if (Step2()) {
        Step3();
    } else {
        Step4();
    }
    Step5();
    

    只要让Step2 返回一个布尔值来判断它是否成功。如果第2步返回了一些数据,也可以返回null,如果操作不成功,也可以返回一个空集合。

    public bool Step2()
    {
        //do things
        return <whether successful>;
    }
    

    这个简单易懂。

    当然,这些方法可以在不同的服务中实现,以便更好地分离关注点。例如

    _ui.ShowWaitCursor(); // Step 1.
    var data = _fileService.GetData(); // Step 2.
    if (data != null) { // Check success of step 2.
        _dbService.WriteData(data); // Step 3.
    } else {
        _dbService.WriteDefaults(); // Step 4.
    }
    _ui.HideWaitCursor(); // Step 5.
    

    另请参阅:Dependency injection (Wikipedia)。如果您正在寻找一种更好的方式来组织您的代码,这值得一看。

    【讨论】:

      猜你喜欢
      • 2019-05-20
      • 1970-01-01
      • 2019-06-25
      • 1970-01-01
      • 2018-07-24
      • 1970-01-01
      • 2013-12-01
      • 2022-01-09
      • 1970-01-01
      相关资源
      最近更新 更多