< 上一個課程 | 下一個課程 >

第 5 課:將程式碼新增至抵押計算機處理程式

將函數新增至您在前一節課程中建立的處理程式。

在本課程中,從您撰寫的 EGL 程式庫開始,您將直接處理 EGL 原始碼。程式庫可以包含常數、變數和函數,任何常數、變數和函數都可由應用程式中的不同邏輯單元進行存取。程式庫的一個重要性質是:針對變數的變更可用於存取該程式庫的任何邏輯單元。不過,本指導教學的焦點是函數,您應將這些函數放置在程式庫中,以避免必須維護多個位置中相同且廣泛使用的邏輯。

若要處理某些常見問題,您可以使用 com.ibm.egl.rui 專案所提供的「EGL 模型視圖控制器 (MVC)」架構。 雖然縮寫 "MVC" 通常用於說明企業應用程式的不同元件,但是「多元使用者介面」中的 MVC 架構僅關注使用者介面的元件。這裡,模型是變數或記錄欄位,視圖是小組件,控制器是用於監管模型與視圖之間資料傳送的宣告。該資料傳送有時是自動的,有時是對函數呼叫的回應,如稍後所示。

前一節課程的拖放動作不僅新增控制器宣告,還新增表單管理程式,此表單管理程式是一種宣告,可讓您將其他宣告視做單一表單的元件。表單管理程式包括一組表單欄位,其中每一個欄位都可以包括標籤、控制器和錯誤欄位。

建立 EGL 程式庫

建立 EGL 程式庫,以存放可為 MONEY 變數提供美國貨幣格式化的函數。更複式的版本可能容許使用當地貨幣符號和分隔字元以及不同的輸入類型。不過,針對本指導教學,簡式版本就足夠了。
  1. 在「專案瀏覽器」中選取 MortgageUIProject。
    已選取 MortgageUIProject。
  2. 按一下新建 EGL 原始檔按鈕。
    「新建 EGL 原始檔」按鈕是群組中的第二個按鈕(共四個)。
  3. 在「新建 EGL 組件」視窗中,如下所示指定套件:
    libraries
  4. 如下所示將檔案命名為:
    MortgageLib
  5. 按一下完成 這時,會在 EGL 編輯器中開啟新的原始檔。
  6. 從檔案中移除註解,並新增下列程式碼:
    library MortgageLib 
       function formatMoney(amount STRING in) returns(STRING)
          len int = strlib.characterLen(amount);
          index int = len - 6; // 2 dec places + decimal + 3 chars before separator
          while(index > 0)
             amount = amount[1 : index] :: "," :: amount[index + 1 : len];
             index -= 3;
             len += 1;
          end
          return("$" :: amount);
       end
    end

    如上所示,您指定了程式庫名稱並內含了新函數 formatMoney(),此函數會向輸入字串新增逗點和錢幣符號。這裡假定輸入欄位包含具有兩個小數位數的金額值。

  7. 儲存檔案。儲存檔案之後,會自動產生程式庫。
現在,可立即使用 MortgageLib 程式庫。

變更處理程式中的程式碼

新增函數之前,您必須進行一些次要變更:
  1. 按一下 MortgageCalculatorHandler程式碼標籤。
  2. 設定貸款金額利息欄位的預設值。 跳至在其中宣告 inputRec 記錄的行,並將這兩個指定內容新增至宣告,如下所示:
    inputRec MortgageCalculationResult 
       {term = 30, loanAmount=180000, interestRate = 5.2};
    儲存檔案,並按一下預覽標籤。 現在,介面將顯示預設值,其中包括您在前一節課程中為「期限」欄位指定的值:
    現在,介面將顯示貸款金額和利率。
  3. 在處理程式的第一行中使用者介面小組件的宣告之前,宣告供程式碼用於存取專用服務的變數:
    mortService MortgageCalculationService{@dedicatedService};
    mortService 宣告位於使用者介面 GridLayout 宣告之前。
  4. 將游標移至紅色 X 或紅色底線上方,以瞭解錯誤原因如下所示:「無法解析 MortgageCalculationService 類型。」 錯誤可能令人難以理解,假定先前已為您在其中工作的專案設定了 EGL 建置路徑,以便專案可以存取包含服務的建置路徑。這裡的問題是:原始檔未從其他專案匯入「服務」組件。
  5. 若要移除此錯誤,請在檔案中的其他 import 陳述式之後鍵入下列 import 陳述式:
    import services.MortgageCalculationService;
    幾秒之後,會移除錯誤標記,即使您未儲存該檔案,亦是如此。
  6. 在許多情況下,開發環境可為您插入遺漏的 import 陳述式。若要查看此動作的便利,請移除您剛剛鍵入的 import 陳述式。當您再次看到錯誤標記時,請按 Ctrl+Shift+O 以重新插入該陳述式。
  7. 儲存檔案。

完成 inputRec_form_Submit 函數

EGL 已建立 inputRec_form_Submit 片段函數。 此函數的目的是要驗證表單上的所有欄位,並「確定」這些欄位。確定動作隸屬於 MVC 實作,表示已使用小組件中的值更新 inputRec 記錄。

您將新增程式碼,以呼叫其他兩個函數。第一個函數使 processImage 影像可見,並透過這種方式告知使用者應用程式處於工作中。 第二個函數會呼叫服務,以計算抵押付款金額。

若要完成 inputRec_form_Submit 函數,請更新 if 陳述式,以使該陳述式如下所示:
if(inputRec_form.isValid())
   inputRec_form.commit();
   showProcessImage();
   calculateMortgage();
else
   errorLabel.text = "Input form validation failed.";
end
請勿擔心程式碼格式;稍後的一個區段將處理此問題。此外,接下來的區段將移除這裡所顯示的錯誤標記:
已完成的 inputRec_form_Submit() 函數呼叫。

新增 showProcessImage 函數

需要 showProcessImage 函數,才能使 processImage 影像可見。若要在「多元使用者介面」編輯器中對此函數進行編碼,請在處理程式中的最後一個 end 陳述式之前,新增下列各行:
function showProcessImage()
   processImage.visible = yes;
end
註: visible 內容隸屬於任何「影像」小組件。您已在前一節課程中變更此內容的起始值,亦即當您取消勾選 processImage 影像的可見的勾選框時。

新增 hideProcessImage 函數

需要 hideProcessImage 函數,才能在必要時隱藏影像。在 showProcessImage 函數之後新增下列各行:
function hideProcessImage()
   processImage.visible = no;
end

新增 calculateMortgage 函數

calculateMortgage 函數會呼叫服務,以根據使用者介面中顯示的值來執行抵押計算。若要在「多元使用者介面」編輯器中對此函數進行編碼,請在 hideProcessImage 函數之後新增下列各行並忽略錯誤標記:
function calculateMortgage()
   call mortService.amortize(inputRec) 
      returning to displayResults 
      onException handleException;
end	
註:
  1. 「多元使用者介面」中的 call 陳述式是一種變異,僅用於存取服務。執行時期通訊在此情況下是非同步的,這表示使用者可以在服務正在回應的同時,繼續與處理程式互動。
  2. 服務要求程式通常會將記錄傳遞至正在存取的服務。在本指導教學中,處理程式會傳遞廣域 inputRec 變數,並在相同記錄中接收從服務傳回的值。

新增 displayResults 函數

displayResults 函數是回呼函數,此函數會在服務將商業資料順利傳回至「多元使用者介面」處理程式之後立即執行。若要對此函數進行編碼,請在 calculateMortgage 函數之後新增下列各行:
function displayResults(retResult MortgageCalculationResult in)
   paymentLabel.text = MortgageLib.formatMoney(retResult.monthlyPayment as STRING);
   inputRec_form.publish();
   hideProcessImage();
end
註:
  • 使用來自新「EGL 程式庫」組件的 formatMoney 函數,將逗點和錢幣符號新增至付款金額。 因為您已建立 paymentLabel 變數但未涉及 MVC 架構,所以您必須自己處理格式化。
  • 如先前的附註所述,表單管理程式包括表單欄位,而這些表單欄位可包括控制器及其他宣告。publish 函數可在任何表單管理程式中使用,並逐個呼叫控制器專屬的 publish 函數,以執行下列動作:
    1. 從充當控制器模型的變數中擷取資料。
    2. 格式化該資料。
    3. 將格式化資料寫入充當控制器視圖的小組件。

    依照給定的事件順序,通常如下所示來呼叫表單層次的 publish 函數:在可從服務接收資料的回呼函數中呼叫。

撰寫異常狀況處理程式

如果服務呼叫導致發生錯誤,則不會呼叫通常的回呼函數。不過,如果已安排使用異常狀況處理程式(與此情況類似),則將呼叫該函數。

如下所示執行動作:

  1. displayResults 函數之後,新增下列程式碼:
    	// catch-all exception handler
    	private function handleException(ae AnyException in)
    		errorLabel.text = "Error calling service: " + ae.message;
    	end
    具有 private 修飾元的函數只能由該函數所在的 EGL 組件進行呼叫;在此情況下,就是由內含的處理程式進行呼叫。該函數會在您於前一節課程中建立的 errorLabel 小組件內放置文字。
  2. 立即更新 call 陳述式之前的 calculateMortgage 函數,如下所示:
    errorLabel.text = "";
    透過這種方式,您將在呼叫用於執行抵押計算的服務之前,清除 errorLabel 欄位。如果不新增該程式碼,則將顯示錯誤訊息(例如,暫時失去服務連線),即使已順利呼叫該服務,亦是如此。
  3. 用滑鼠右鍵按一下編輯器中的空白空間。按一下組織匯入項目 EGL 將為它可以解析的所有未定義符號新增 import 陳述式。
  4. 儲存檔案。如果在原始檔中看到錯誤,請將程式碼與第 5 課結束之後所完成之 MortgageCalculatorHandler.egl 的程式碼中的檔案內容進行比較。
  5. 解決任何錯誤之後,透過按 Ctrl+Shift+F 來重新格式化您的輸入,並再次儲存檔案。

測試計算機

現在,您已準備好測試計算機。

  1. 透過按一下編輯器底端的預覽標籤來切換至「預覽」視圖。 在「預覽」視圖中,您可以完全測試應用程式,包括使用者介面和服務,無論這些服務是部署在伺服器上,還是僅作為 EGL 原始碼進行提供。 這時,EGL 會顯示您在建立處理程式時所輸入的預設值。
  2. 按一下計算 這時,EGL 會顯示每月付款金額。
    每月付款金額出現在「付款金額」欄位中。
  3. 在第一個欄位中輸入一個字母。 與數個 EGL Dojo 小組件一樣,只要發生錯誤,即會顯示紅色標記,並會在相鄰的工具提示中顯示錯誤訊息。
    每月付款金額出現在「付款金額」欄位中。

    當小組件失去焦點時,會隱藏工具提示,當小組件再次獲得焦點時,會顯示工具提示。

  4. 變更三個欄位中任意欄位的值,然後再次按一下計算 這時,付款金額欄位會相應地變更。

課程檢查點

您瞭解了如何完成下列作業:
  • 在「多元使用者介面」編輯器的程式碼標籤中工作
  • 為可重複使用的函數建立「EGL 程式庫」組件
  • 使用「EGL 模型視圖控制器」架構
  • 從函數呼叫「EGL 服務」
  • 捕捉和處理錯誤

在下一節課程中,您將建立圓餅圖,以比較給定計算中的總計本金與總計利息。

< 上一個課程 | 下一個課程 >

意見