设计和实现执行几个步骤的API

时间:2013-05-14 23:31:27

标签: c# java oop c#-4.0 design-patterns

什么是最好的设计方法?要求是创建一个简单的服务接口,执行20-30个不同的步骤。换句话说,我有一个带有DoSomeWork()函数的服务类。并且DoSomeWork将执行20-30步并且如果成功返回成功消息并且如果失败则返回其失败的确切消息以及原因。

public class SomeWork :ISomeWorkWork{
public StatusMessage DoSomeWork(){
   //Do Step 1
   //Do Step 2
   //Do Step 3
 }
}

最简单的方法是将所有步骤封装在私有方法中,并在DoSomeWork()方法中调用它们。但这是不可接受的,因为那时各个步骤都不可测试,可以模拟。另一种方法是创建一个单独的类,它将实现一个接口,称为ISomeWorkService。然后在DoSomeWork方法内部通过IOC容器获取ISomeWorkService的实例并调用这些步骤的方法。我在想是否状态模式适合这种情况。我需要的是DoSomeWork应该能够自动找出它需要执行的步骤,它应该运行到最后一步或者如果遇到任何错误就退出。任何帮助都会很明显:)

1 个答案:

答案 0 :(得分:1)

我半不愿意提出这个问题,因为20个步骤需要付出很多努力(事实上,在尝试对此做些什么时可能值得你这么做),所以事情可能会变得混乱,但是...... < / p>

您可以采取的一种方法是使用某种委托机制,这将允许调用者进入代码流并覆盖步骤中的默认逻辑。你可以使用事件达到同样的效果,虽然我认为代表可能会稍微清洁。

这将允许调用者(可以是单元测试装备)模拟单个步骤。或者不是。

所以,DoSomeWork()仍然会包含这样的逻辑,即执行步骤1,现在执行步骤2,现在执行步骤3等,但步骤本身可以(但不一定)被调用者覆盖。

正如我所说,如果你说几十个步骤,这可能会变得非常混乱,但我想的越多,我认为你采取的任何方法都允许你嘲笑这么多步骤,这将是相当混乱的

例如(假设您正在处理小部件并使用委托):

您的“工人”课程如下:

public delegate Widget StepOneActionDelegate(Widget widget);

public class Worker
{

    public StepOneActionDelegate StepOneAction { get; set; }

    public Worker()
    {
        StepOneAction = RealStepOne;
    }

    public void DoSomeWork()
    {
        Widget widget = new Widget();
        Widget newWidget = StepOneAction(widget);
        // more steps here
    }

    private Widget RealStepOne(Widget widget)
    {
        // Do some real work here
        return widget;
    }
}

...虽然你的测试工具可以做类似的事情......

    void Test()
    {
        Worker worker = new Worker();
        worker.StepOneAction = NewStepOne;
        worker.DoSomeWork();
    }


    Widget NewStepOne(Widget widget)
    {
        // Do some mocking here
        return widget;
    }

......而在“现实生活中”你会说......

    void DoItForReal()
    {
        Worker worker = new Worker();
        worker.DoWork();
    }

如果您愿意,此方法将允许您单独模拟每个步骤,但在开发时保留Worker类的结构/功能。它还允许你创建更专业的工作者,例如可以购买原工人类的大多数步骤,但可以在步骤5,9和14中做自己的事情。