我有以下界面:
public IStateMachineConfigurator
{
??? Configure(StateMachine machine);
}
在实现中,我调用了一些StateMachine方法来配置它:
machine.Configure(States.State1)
.Allow(Triggers.Trigger1);
问题是,我可以依赖于StateMachine对象是引用的事实,还是应该使用返回值或返回参数(如ref / out)?
编辑:
状态机本身来自一个库,因此我无法决定它的实现。
答案 0 :(得分:5)
如果你想使用建造者模式,那么你有效地返回正在传递的可变状态。如果你想沿着那条路走下去,这是完全没问题的。这就是StringBuilder类的操作方式,以及有点不同的注释jQuery。以紧凑和可读的方式构建对象非常好。但是,这些对象应该如此指定。构建器对象,最好不要超过必要的。
答案 1 :(得分:1)
是的,您可以依赖StateMachine
是对象引用这一事实。有些人可能会选择返回bool
或enum
来给程序员一些关于Configure
方法中发生的事情的提示(即成功/失败/无变化/等等。)。其他人可能会选择在出现问题时抛出异常。
所有这些都是完全有效的,只要注意将方法链接在一起的深度,如:
machine.Configure().Allow().someMethod().someOtherMethod()
难以调试和跟踪。
答案 2 :(得分:1)
我宁愿选择Configurator
对象并将其传递给Configuration
构造函数,而不是创建StateMachine
。这使得StateMachine
类的用户在使用它之前必须为其提供有效配置。
class StateMachineConfiguration
{
public IEnumerable<State> States { get; private set; }
public IEnumerable<Trigger> Triggers { get; private set; }
}
class StateMachine
{
public StateMachine(StateMachineConfiguration config)
{
if(config == null)
throw new ArgumentNullException();
this.Configure(config.States);
this.Allow(config.Triggers);
}
}