我应该接受同一个对象作为参数并返回它,还是只接受它作为参数

本文关键字:参数 该接受 一个对象 返回 | 更新日期: 2023-09-27 17:58:09

我有以下接口:

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

在实现中,我调用了一些StateMachine方法来配置它,如下所示:

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

问题是,我可以依赖StateMachine对象是引用这一事实吗?还是应该使用返回值或像ref/out这样的返回参数?

编辑:
状态机本身来自一个库,因此我无法决定它的实现。

我应该接受同一个对象作为参数并返回它,还是只接受它作为参数

如果你想使用构建器模式,那么你可以有效地返回正在传递的可变状态。如果你想走这条路,这是非常好的。这就是StringBuilder类的操作方式,与jQuery有所不同。它可以非常好地以紧凑和可读的方式构建对象。然而,这些对象应该被指定为这样的对象。生成器对象,最好不要承担超过必要的任务。

是的,您可以依赖StateMachine是对象引用这一事实。有些人可能会选择返回boolenum,以向程序员提供关于Configure方法中发生的事情的某种提示(即成功/失败/无更改等)。其他人可能会在出现问题时选择抛出异常。

所有这些都是完全有效的,只是要小心你把方法链接在一起的深度,比如:

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

变得难以调试和跟踪。

与其创建Configurator,不如craete一个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);
    }
}