问题描述
|
我有以下界面:
public IStateMachineConfigurator
{
??? Configure(StateMachine machine);
}
在实现中,我正在调用一些StateMachine方法来像这样配置它:
machine.Configure(States.State1)
.Allow(Triggers.Trigger1);
问题是,我可以依靠StateMachine对象是引用这一事实还是应该使用返回值或返回参数(例如ref / out)?
编辑:
状态机本身来自库,因此我无法确定其实现。
解决方法
是的,您可以依靠“ 2”是对象引用这一事实。有些人可能选择返回“ 3”或“ 4”,以向程序员提供有关“ 5”方法中发生的情况的某种提示(即成功/失败/不变)。其他人可能选择在发生问题时引发异常。
所有这些都是完全有效的,请注意将方法链接在一起的深度,例如:
machine.Configure().Allow().someMethod().someOtherMethod()
变得难以调试和跟踪。
, 如果您想使用构建器模式,那么您可以有效地返回正在传递的可变状态。如果您想走那条路,那就很好。这就是StringBuilder类的运行方式,并且jQuery有所不同。以紧凑且可读的方式构建对象可能非常好。但是,这些对象应这样指定。生成器对象,最好不要承担不必要的任务。
, 我宁愿创建一个Configuration
对象并将其传递给StateMachine
构造函数,也不愿创建Configurator
。这使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);
}
}