2011-05-31 114 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

相關問題