2013-04-09 16 views
0

我有一個3單選按鈕,控制幾個文本框的狀態,我使用一個事件的所有3個按鈕,但控制文本框的部分看起來像它可流更加林立......必須有一個更好的方式來處理這個事件,然後我有什麼可能使這個事件DRY'er,指導與重構

Private Sub rdo_SkipBitLockerY_CheckedChanged(sender As RadioButton, e As EventArgs) Handles rdo_SkipBitLockerY.CheckedChanged, rdo_SkipBitLockerN.CheckedChanged, rdo_SkipBitLockerU.CheckedChanged 
    Select Case sender.Name 
     Case "rdo_SkipBitLockerY" 
      txt_BDEDriveLetter.Enabled = True 
      txt_BDEDriveSize.Enabled = True 
      txt_BDEInstall.Enabled = True 
      txt_BDEInstallSuppress.Enabled = True 
      txt_BDERecoveryKey.Enabled = True 
      txt_TPMOwnerPassword.Enabled = True 
      txt_OSDBitLockerStartupKeyDrive.Enabled = True 
      txt_OSDBitLockerWaitForEncryption.Enabled = True 
      AttributeRDOTable("SkipBitLocker") = "YES" 
     Case "rdo_SkipBitLockerN" 
      txt_BDEDriveLetter.Enabled = False 
      txt_BDEDriveSize.Enabled = False 
      txt_BDEInstall.Enabled = False 
      txt_BDEInstallSuppress.Enabled = False 
      txt_BDERecoveryKey.Enabled = False 
      txt_TPMOwnerPassword.Enabled = False 
      txt_OSDBitLockerStartupKeyDrive.Enabled = False 
      txt_OSDBitLockerWaitForEncryption.Enabled = False 
      AttributeRDOTable("SkipBitLocker") = "NO" 
     Case Else 
      txt_BDEDriveLetter.Enabled = False 
      txt_BDEDriveSize.Enabled = False 
      txt_BDEInstall.Enabled = False 
      txt_BDEInstallSuppress.Enabled = False 
      txt_BDERecoveryKey.Enabled = False 
      txt_TPMOwnerPassword.Enabled = False 
      txt_OSDBitLockerStartupKeyDrive.Enabled = False 
      txt_OSDBitLockerWaitForEncryption.Enabled = False 
      AttributeRDOTable.Remove("SkipBitLocker") 
    End Select 

我能做些什麼,使這個少囉嗦?

回答

0

對不起,我不知道.Net平臺,我只是想盡我所能做的方式在Java中,可能你會發現它有用。

  • 你可以使用一些默認值爲你的params。比方說,你的默認值

txt_BDEDriveLetter.Enabled

txt_BDEDriveSize.Enabled

txt_BDEInstall.Enabled

txt_BDEInstallSuppress.Enabled

txt_BDERecoveryKey.Enabled

txt_TPMOwnerPassword.Enabled

txt_OSDBitLockerStartupKeyDrive

txt_OSDBitLockerWaitForEncryption

FALSE

  • 每個案例的行動應該包含不超過1-2語句的。 這就是爲什麼如果你想遵守這個規則,你應該只是提取方法重構。

  • 不要向方法發送比它需要知道更多的信息。

你的方法並不需要了解發件人對象。只需發送發件人對象的名稱即可。

如下我會重構代碼(對不起,我不知道的.Net,我會嘗試每樣寫):

Private Sub rdo_SkipBitLockerY_CheckedChanged(Name As String, e As EventArgs) Handles rdo_SkipBitLockerY.CheckedChanged, rdo_SkipBitLockerN.CheckedChanged, rdo_SkipBitLockerU.CheckedChanged 
    Select Case Name 
     Case "rdo_SkipBitLockerY" 
      doRdoSkipBitLockerY(); 
     Case "rdo_SkipBitLockerN" 
      doRdoSkipBitLockerN() 
     Case Else 
      doElse(); 
    End Select 

Private void doRdoSkipBitLockerY() 
    txt_BDEDriveLetter.Enabled = True 
    txt_BDEDriveSize.Enabled = True 
    txt_BDEInstall.Enabled = True 
    txt_BDEInstallSuppress.Enabled = True 
    txt_BDERecoveryKey.Enabled = True 
    txt_TPMOwnerPassword.Enabled = True 
    txt_OSDBitLockerStartupKeyDrive.Enabled = True 
    txt_OSDBitLockerWaitForEncryption.Enabled = True 
    AttributeRDOTable("SkipBitLocker") = "YES" 
Private void doRdoSkipBitLockerN() 
    AttributeRDOTable("SkipBitLocker") = "NO" 
Private void doElse() 
    AttributeRDOTable.Remove("SkipBitLocker"); 

如果我想讓它OOP路(在Java中)我想提取所有3情況下,枚舉的成員,並把它作爲參數傳遞給一個常用的方法setVariables()

enum MY_CASES{ 
private boolean txt_BDEDriveLetter; 
private boolean txt_BDEDriveSize; 
... 
MY_CASES(boolean txt_BDEDriveLetter, boolean txt_BDEDriveSize , ..){ 
this.txt_BDEDriveLetter = txt_BDEDriveLetter; 
this.txt_BDEDriveSize = txt_BDEDriveSize; 
... 
} 

CASE1(true, true, ...), CASE2(false, false, ...), CASE3(false, false, ...), ... 
} 

private Sub rdo_SkipBitLockerY_CheckedChanged(Name String, e EventArgs) 
    setVariables(MY_CASES.valueOf(NAME)); 

private void setVariables(MY_CASES case){ 
    this.txt_BDEDriveLetter = case.getTxt_BDEDriveLetter; 
    this.txt_BDEDriveSize = case.getTxt_BDEDriveSize; 
    ... 
} 

這個版本允許你添加其他情況下沒有重構你rdo_SkipBitLockerY_CheckedChanged方法。