奇怪的控制流程



我正在开发一个c#框架,它将依赖于作为继承基类的类实现的可插拔组件。为了使组件尽可能简单,我正在研究一些奇怪的控制流。

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

基类:

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调用之间的逻辑访问结果的属性,因此它在没有null检查的情况下崩溃。

这似乎是一件微不足道的事情,但是可能有成千上万个这样的继承类,并且简化它们是一件大事。

让基类来控制执行流:

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
    }
}

没有办法让函数调用退出调用函数,除非抛出一个Exception,这是你不应该做的。

做的使你的代码更简洁的是颠倒大小写。

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

相关内容

  • 没有找到相关文章

最新更新