2009-04-30 62 views
1

我有以下簡單功能:重構的啓用/禁用按鈕切換功能

private void EnableDisable941ScheduleBButton() 
    { 
     if (this._uosDepositorFrequency.Value != null) 
      this._btnScheduleB.Enabled = ((int)this._uosDepositorFrequency.Value == 0); 
    } 

這其中我想分成被動視圖和主持人一個WinForm類的成員。顯而易見的是,業務邏輯與用戶界面佈線纏繞在一起。我只是不確定將它們分開的最佳方式。

爲了給出一點上下文,該函數從窗體中的三個位置調用。 _uosDepositorFrequency是一個只有兩個按鈕的單選按鈕組。

任何想法?

更新:

好的,也許它不像我想象的那麼明顯。業務規則規定,如果僱主進行半週期存款(_uosDepositorFrequency.Value = 0),則他們需要填寫附表B表格。

+0

您是否真的需要將所有業務規則移出UI層?這通常會帶來更多的複雜性,有時候值得一提的邏輯(尤其是你所展示的邏輯......) – 2009-04-30 16:01:01

+0

嗯,我把業務規則分開的原因是因爲表單將會是取而代之,但規則仍然存在。 – 2009-04-30 16:06:19

+0

夠公平的。我在下面的答案中給了你一個選項。但是,我個人會保留原樣,只是爲替換人員發表評論;一般而言,只有當您在多個用戶界面之間共享業務規則時纔有意義... – 2009-04-30 16:16:35

回答

0

首先我要感謝所有回答我的問題的人。

我花了一些時間在這個工作,我相信我已經想出了一個解決方案。

首先我公開了_uosDepositorFrequency.Value和_btnScheduleB.Enabled作爲公共屬性並更新了視圖界面我還花了一些時間來定義存儲頻率的枚舉。

public bool EnableScheduleB 
    { 
     get 
     { 
      return _btnScheduleB.Enabled; 
     } 
     set 
     { 
      _btnScheduleB.Enabled = value; 
     } 
    } 

    public DepositFrequency DepositorFrequency 
    { 
     get 
     { 
      return (DepositFrequency)_uosDepositorFrequency.Value; 
     } 
     set 
     { 
      _uosDepositorFrequency.Value = (int)value; 
     } 
    } 

然後我將原始函數的主體複製到我的演示者,並將其修改爲使用我剛剛創建的屬性。原始函數中的空檢查結果是不必要的,因爲_uosDepositorFrequency控件在別處被初始化。

public void UpdateScheduleBStatus() 
    { 
     ReturnView.EnableScheduleB = ReturnView.DepositorFrequency == DepositFrequency.Semiweekly; 
    } 

最後_uosDepositorFrequency_ValueChanged事件處理程序進行了更新,呼叫UpdateScheduleBStatus。

private void _uosDepositorFrequency_ValueChanged(object sender, System.EventArgs e) 
    { 
     Presenter.UpdateScheduleBStatus(); 
    } 

評論歡迎光臨。

0

我不認爲這是商業邏輯。它看起來像我的UI邏輯。我不會改變它。

雖然如果我使用wpf,我會將啓用狀態綁定到數據。

0

也許我錯過了一些東西,但我不確定在那裏看到了商業邏輯。你只是根據表單上的其他控件是否有價值來啓用/禁用按鈕。我沒有看到需要重構這個方法,這對我來說都是查看邏輯。

0

這聽起來像是你將UI邏輯和業務規則混爲一談。你有的代碼是UI邏輯,不應該重構。您所說的商業規則是,如果_btnScheduleB的值爲0那麼您需要讓用戶填寫表單。您的商業邏輯應該是在用戶可以繼續使用_btnScheduleB之前確保您有填好的表單。

2

主持人:

if(this._uosDepositorFrequency.Value > 0) //int objects cannot be null 
     ViewData["ScheduleBRequired"] = true; 

查看:

private  void Draw() 
    { 
      if ((bool)ViewData["ScheduleBRequired"]){ 
        this._btnScheduleB.Enabled = true; 
        this._validatorScheduleB.Active = true; //required data should be checked clientside with js 
      } 
    } 

如果它是一個businessrequirement,這應該被填補,它應該由主持人來觸發。 ui負責遵循主講人的決定。例如要求ScheduleB或不...

0

替代方案(我不是說它是一個更好的)是選擇更改事件的無線電控制更新模型(僱主實體?),其中依次觸發UI訂閱的某種DepositorChanged事件並相應地啓用/禁用計劃按鈕。觀察者模式,或多或少。

也就是說,上述替代方法會產生更多的複雜性,我建議將其留給UI代碼(添加關於它的註釋或使用中間布爾變量向讀者陳述意圖)。特別是如果這是該規則唯一使用的地方。

關於代碼的一個注意事項:這是一個宗教性的爭論,它將類字段用下劃線前綴或使用this.代替。我認爲每個人都同意使用兩者都是多餘的......

0

正如其他人指出,這是保持你的用戶界面一致,所以真的不是業務邏輯。你可以刪除這樣的空檢查。

this._btnScheduleB.Enabled = (int)(this._uosDepositorFrequency.Value ?? 0) == 0; 
0

我不會太擔心重構兩行代碼,除非它真的沒有在當前的格式是有意義的。