2011-05-31 112 views
2

我有以下接口:我应该接受相同的对象作为参数并返回它或只是接受它作为参数?

public IStateMachineConfigurator 
{ 
    ??? Configure(StateMachine machine); 
} 

在实现我打电话一些的StateMachine方法来配置这样的:

machine.Configure(States.State1) 
     .Allow(Triggers.Trigger1); 

的问题是,我可以依靠的事实, StateMachine对象是一个引用,或者我应该使用返回值还是像ref/out这样的返回参数?编辑:
状态机本身来自一个库,因此我不能决定它的实现。

回答

1

是的,你可以依靠StateMachine是一个对象引用的事实。有些人可能会选择返回boolenum,以给程序员一些提示,说明Configure方法中发生了什么(即成功/失败/无变化/等等)。其他人可能会选择在出现问题时抛出异常。

所有是完全有效的,只是要小心你有多深链方法一起,就像这样:

machine.Configure().Allow().someMethod().someOtherMethod()

获取困难的调试和跟踪。

+0

这就是为什么我隐藏它并允许从外部组件进行配置。 – 2011-05-31 19:24:10

5

如果你想与建设者的模式,那么你有效地返回正在通过的可变状态。这是非常好的,如果你想沿着这条路走下去。这就是StringBuilder类的运作方式,在jQuery上有所不同。以紧凑和可读的方式构建对象可以是非常好的。但是,这些对象应该被指定为这样。建设者的对象,最好不要超过必要的。

+0

状态机已经使用了构建器模式。我想介绍一个将配置状态机所需的所有内容的类。 – 2011-05-31 18:52:42

+0

StateMachine是一个班级,'不是吗?那么你应该全部设置。 – 2011-05-31 18:57:43

+0

配置器的目的是注入一个将配置允许的状态和触发器的类。我无法控制状态机的实现。这是一个图书馆。 – 2011-05-31 19:02:54

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); 
    } 
} 
+0

我无法控制状态机的实现。这是一个图书馆。 – 2011-05-31 19:00:52

相关问题