2014-10-02 2 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 또는 select : https://www.autoitscript.com/autoit3/docs/keywords/Select.htm 문 이것을 처리 할 수 ​​있습니다. –

답변

0

뭔가 당신의 대신 문 경우 여러 정의의 여러 조건이있는 경우. AutoIt이의 도움말 파일에서 말했듯이 :

표현은, AND, OR, 또는 NOT뿐만 아니라 논리 연산자 <로의 부울 연산자를 포함 할 수 있습니다 < =,>,> =, =, ==, <>은 필요한 경우 괄호로 묶입니다.

여기서 예이다 :

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

한 다음 각 함수 대신에 호출들을 제 기능을 여러 기능으로 분리하여 부른다. 나는 창을 만들고 장식 할 경우, 예를 들어, 단계는 다음과 같습니다

- Create the window 
- Decorate the window 

당신은 (_CreateWindow가 핸들을 반환한다고 가정 같은 구현을 숨기기 위해 2 단계 1 개 기능에 해당하는이 개 기능을 쓸 수 있습니다 창을 작성할 수없는 경우 창을 장식 할 수없는 경우 오류가

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을 얻어야한다)이 발생하지 않으며 False 경우 생성 된 창 또는 Null_DecorateWindow 반환 True을 부울입니다.

이렇게 코드를 구성하면 Switch 문 안에 사용자 지정 오류 처리기가 그룹화되고 기본 오류 처리기는 각 단계의 Else 경우에 배치됩니다. 특정 처리기를 찾는 것은 쉽습니다.

또 다른 이점이 있습니다. 체인에 새로운 단계를 쉽게 추가 할 수 있습니다. 내가 장식하기 전에 한 500x300로 창 크기를 변경하려는 경우 예를 들어, 나는 다음과 같은 추가 단계 _createDecoratedWindow__resizeWindow을 작성할 수 있습니다 (가정이 _SetWindowSize 반환 실패 성공에 TrueFalse) :

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 

이전 변경 이 단계에서 오류를 처리해야하는 경우도 Switch 문에 새 Case을 추가 할 수 있습니다 대신 _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 

이 하나를 호출하는 단계.

그러나이 방법을 사용하면 매개 변수 목록이 빠르게 커집니다. 각 단계는 자체적으로뿐만 아니라 모두 다른 단계에 대한 인수도 취해야하기 때문에 신속하게 커집니다. 반환 값이 오류를 탐지하는 데 사용되기 때문에 작업의 결과는 또 다른 문제입니다. 위의 코드에서 결과를 전송하려면 ByRef 매개 변수를 사용해야합니다.내 예제에서 함수 이름 모든 이름 충돌을 피하기 위해 못생긴 : 한마디로
각 단계는 다음

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

참고 래퍼를 쓰기 형태

Func stepName(...) 
    PerformTheOperation() 

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

의 기능입니다.