奇怪的控制流程

时间:2013-05-07 19:16:18

标签: c# control-flow

我正在使用C#中的框架,该框架将依赖于作为继承基类的类实现的可插入组件。为了使组件尽可能简单,我正在研究一些奇怪的控制流程。

基类包括静态方法 RunStep(参数)。继承类多次调用此方法,并且每次调用它时都会检查条件。如果这个条件恰好是假的,我希望调用方法停止并返回。代码的简化工作版本是:

基类:

class MyBase
{
  private static object RunStep(string parameter)
  {
    if(SomeFunction(parameter))
       return SomeOtherFunction(parameter);
    else
       return null;
  }  
}

继承类:

class MyInheritor
{
  public void Run()
  {
     object result = RunStep("mystring1");
     if(null != result)
     {
        //perform some logic on result
        result = RunStep("mystring2");
        if(null != result){
            //perform some different logic on result
            RunStep("mystring3");
        }
     }
  }
}

我想知道的是,是否可以在基类中执行某些操作,以便我可以将继承类简化为:

class MyInheritor2
{
  public void Run()
  {
     object result = RunStep("mystring1");
     //perform some logic on result
     result = RunStep("mystring2");
     //perform some different logic on result
     result = RunStep("mystring3");
     }
  }
}

我会将参数放在一个列表中并循环遍历它们,但是每次调用RunStep方法后都需要发生逻辑,每次逻辑都不同。这需要从表中循环。另请注意,RunStep调用之间的逻辑访问结果上的属性,因此它在没有空检查的情况下崩溃。

这可能看起来像是一件微不足道的事情,但可能有成千上万的这些继承类并简化它们是一件大事。

2 个答案:

答案 0 :(得分:3)

让基类控制执行流程:

class Base
{
    private readonly List<Tuple<string, Action>> steps = new List<Tuple<string, Action>>();

    protected void RegisterStep(string parameter, Action someLogic)
    {
        steps.Add(Tuple.Create(parameter, someLogic));
    }

    protected void Run()
    {
        foreach (var step in steps)
        {
            var result = RunStep(step.Item1);

            if (result == null)
            {
                break;
            }

            // perform some logic
            step.Item2();
        }
    }

    private object RunStep(string parameter)
    {
        // some implementation
        return null;
    }
}

class Derived : Base
{
    public Derived()
    {
        RegisterStep("1", () => { });
        RegisterStep("2", () => { });
        RegisterStep("3", () => { });

        // etc
    }
}

答案 1 :(得分:2)

没有办法让函数调用退出调用函数,除了抛出Exception,你不应该这样做。

可以做些什么来使你的代码更清洁是反转案件。

 object result = RunStep("mystring1");
 if (result == null) return;

 result = RunStep("mystring2");
 if (result == null) return;

 result = RunStep("mystring3");
 if (result == null) return;