2014-10-02 244 views
0

下面是我的AutoIt代碼。我想減少這段代碼,並避免在我的函數中添加大量的「If ... Else ... EndIf」。避免在AutoIt中嵌套的IF

我該怎麼做?

Func launchTestsCC($partenaire, $projet) 
    If $CometEnv = "DEV" Or $CometEnv = "VAL" Then 
     initDossierFormConfig($partenaire) 
     initPartenaireWin($partenaire) 
     Sleep(500) 
     For $i = 2 To 8 Step 1 
      $ouvrirDossier = ouvrirDossier($configDossier[2], $configDossier[3], "ADI,C", $configDossier[4], $configDossier[5], False) 
      ConsoleWrite("$ouvrirDossier ==> " & $ouvrirDossier & @CRLF) 
      If $ouvrirDossier = 1 Then 
       Sleep(1000) 
       jabSetCombo("", "FRAIS MEDICAUX", 3) 
       jabSetCombo("", $listsContrats[$i], 4) 
       ConsoleWrite("$listsContrats[" & $i & "] ==> " & $listsContrats[$i] & @CRLF) 
       jabSetText("", $currentDate, 5) 
       jabSetCombo("", $configDossier[6], 5) 
       jabSetCombo("", $configDossier[7], 6) 
       jabSetText("", "19549", 7) 
       $valider = jabClicBouton("Valider") 
       If $valider = 1 Then 
        If getWinError() = 1 Then 
         ConsoleWrite("getWinError() $valider ==> 1" & @CRLF) 
         setTestResult($openSheet, $CalcResult, $partenaire, $listsContrats[$i], "Dossier créer", "TEST OK") 
         $benef = jabClicBouton("ADI,FM,B") 
         If $benef = 1 Then 
          If getWinError() = 1 Then 
           $ajouter = jabClicBouton("Ajouter") 
           $searchTextbenef = searchTextInPageTimeOut("jabGetLabel", "Appliquer à :", 5) 
           If $ajouter = 1 And $searchTextbenef = 1 Then 
            selectCheckBox("", 3) 
            $x4 = 0 
            $y4 = 0 
            $checkBoxS3P3 = rechercheImage("Benef_S3P3.bmp", 5, 1, $x4, $y4, "") 
            If $checkBoxS3P3 = 1 Then 
             $codeRetour = cliqueSur("Benef_S3P3.bmp", -65, 0) 
             If $codeRetour = 0 Then 
              ConsoleWrite("Erreur en séléctionant S3P3" & @CR) 
              setTestResult($openSheet, $CalcResult, $partenaire, $listsContrats[$i], "Erreur en séléctionant S3P3", "TEST KO") 
             Else 
              $valider = jabClicBouton("Valider") 
              If $valider = 1 Then 
               If getWinError() = 1 Then 
                $retour = jabClicBouton("Retour") 
               EndIf 
              EndIf 
             EndIf 
            EndIf 
           Else 
            setTestResult($openSheet, $CalcResult, $partenaire, $listsContrats[$i], "Probleme au clic sur ajouter benef", "TEST OK") 
           EndIf 
          Else 
           ConsoleWrite("getWinError() $benef ==> 0" & @CRLF) 
           setTestResult($openSheet, $CalcResult, $partenaire, $listsContrats[$i], "Impossible d'ajouter des bénéf", "TEST KO") 
           ContinueLoop 
          EndIf 
         EndIf 
        Else 
         ConsoleWrite("getWinError() $valider ==> 0" & @CRLF) 
         $suiteConfig = "Cadence de recouvrement : " & $configDossier[8] & @CR & "Mode de recouvrement : " & $configDossier[9] 
         $disConfig = "Paramètres du dossier : " & $configDossier[2] & " | " & $configDossier[3] & " | " & $configDossier[4] & " | " & $configDossier[5] & @CR & $suiteConfig 
         setTestResult($openSheet, $CalcResult, $partenaire, $listsContrats[$i], "Message d'erreur ou Warning" & @CR & $disConfig, "TEST KO") 
        EndIf 
       EndIf 
      Else 
       ConsoleWriteError("Erreur ouverture dossier " & $partenaire & @CRLF) 
       $suiteConfig = "Cadence de recouvrement : " & $configDossier[8] & @CR & "Mode de recouvrement : " & $configDossier[9] 
       $disConfig = "Paramètres du dossier : " & $configDossier[2] & " | " & $configDossier[3] & " | " & $configDossier[4] & " | " & $configDossier[5] & @CR & $suiteConfig 
       setTestResult($openSheet, $CalcResult, $partenaire, $listsContrats[$i], "Erreur ouverture dossier/Temps dépassé pour ouvrir le dossier" & @CR & $disConfig, "TEST KO") 
       ContinueLoop 
      EndIf 
     Next 
    EndIf 
EndFunc ;==>launchTestsCC 
+0

使用開關:https://www.autoitscript.com/autoit3/docs/keywords/Switch.htm或選擇:https://www.autoitscript.com/autoit3/docs/keywords/Select.htm聲明來處理這個問題。 – 2014-10-02 17:47:47

回答

0

的東西,可以幫助你是讓你的if語句有多個條件,而不是if語句定義多個。正如在AutoIt的幫助文件說:

表達可以包含的布爾操作符AND,OR,NOT或以及邏輯運算符<,< =,>,> =,=,==,和<>如果需要用括號分組。

下面是一個例子:

if $myValue = 1 AND $yourValue = 2 Then 
    ... 
EndIf 
0

通話分開成多個功能並調用第一功能,它們在每個功能的地方,下一個。例如,如果我想創建和裝飾的窗口,步驟是:

- Create the window 
- Decorate the window 

您可以編寫相當於2級和1個功能隱藏你實現這樣的2個功能(假設_CreateWindow手柄返回所創建的窗口或Null如果不能創建窗口,_DecorateWindow返回布爾True如果沒有錯誤發生,如果False不能裝飾窗)

Func _createDecoratedWindow() 
    Local $hwnd 

    Switch _createDecoratedWindow__createWindow($hwnd) 
    Case 'createWindow' ; A failure occurs at createWindow step 
    ; Do something on failure, e.g: write an error message to log file 
    Case 'decorateWindow' ; A failure occurs at decorateWindow step 
    ; Code to execute when the step decorateWindow failed 
    EndSwitch 

    Return $hwnd 
EndFunc 

Func _createDecoratedWindow__createWindow(ByRef $hwnd) 
    $hwnd = _CreateWindow(...) 

    If $hwnd <> Null Then ; Check whether the operation is success 
    ; Do something on success before proceed to the next step 
    Return _createDecoratedWindow__decorateWindow($hwnd) ; Next step 
    Else 
    ; You can add some code to execute everytime the operation is failed here 
    Return 'createWindow' ; Return name of the step at which the chain is broken 
    EndIf 
EndFunc 

Func _createDecoratedWindow__decorateWindow(ByRef $hwnd) 
    Local $decorateSuccess = _DecorateWindow($hwnd) 

    If $decorateSuccess Then 
    Return ; No error occur 
    Else 
    ; Do something when error occurs at this step 
    Return 'decorateWindow' 
    EndIf 
EndFunc 

你應該得到the syntax highlighted code on pastebin爲便於閱讀。

以這種方式組織代碼,自定義錯誤處理程序分組在Switch語句中,並且默認錯誤處理程序放在每個步驟的Else事例中。找到特定的處理程序很容易。

還有一個好處,你可以輕鬆地添加一個新的步驟鏈。例如,如果我想裝修之前,窗口大小改變爲500x300,我可以寫一個額外的步驟_createDecoratedWindow__resizeWindow像下面(假設_SetWindowSize返回True成功和False失敗):

Func _createDecoratedWindow__resizeWindow(ByRef $hwnd) 
    If _SetWindowSize($hwnd, "500x300") Then 
    ; Do something on success, if needed 
    Return _createDecoratedWindow__decorateWindow($hwnd) 
    Else 
    ; Handle error here, if necessary 
    Return 'resizeWindow' 
    EndIf 
EndFunc 

,改變以前步驟調用這一個,而不是_createDecoratedWindow__decorateWindow

Func _createDecoratedWindow__createWindow(ByRef $hwnd) 
    $hwnd = _CreateWindow(...) 

    If $hwnd <> Null Then 
    ; On success code 
    ; Just change the line below and you're done 
    Return _createDecoratedWindow__resizeWindow($hwnd) 
    Else 
    ; On failure code 
    Return 'createWindow' 
    EndIf 
EndFunc 

您還可以添加新的CaseSwitch聲明,如果你需要處理的錯誤這一步。

但是,這種方法會使您的參數列表快速增長,因爲每個步驟不僅需要自身的參數,還需要所有其他步驟的參數。由於返回值用於錯誤檢測,操作的結果是另一個問題。在上面的代碼中,我必須使用ByRef參數傳輸結果。
總之,每一步都是在形式

Func stepName(...) 
    PerformTheOperation() 

    If TheOperationIsSuccess() Then 
    OnSuccess() 
    Return NextStep() ; if any 
    Else 
    OnFailure() 
    Return 'stepName' 
    EndIf 
EndFunc 

函數然後寫一個包裝

Func operationName(...) 
    ... 
    Switch CallTheFirstStep() 
    Case 'firstStep' 
    AdditionalActionsToHandleError() 
    ... 
    EndIf 
    ... 
EndFunc 

注:在我的例子,函數的名稱都是醜陋的,以避免名稱衝突。