我正在开发一个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;