智能方法適配

2024-03-07 18:37 更新

在實做Ajax的范例中,我們注意到Ajax.java中的代碼中沒有任何dorado的開發(fā)約定,它的樣子和我們業(yè)務(wù)層的代碼沒有什么差別:

@Expose
public String toUpperCase(String str) {
    return "input:\n" + str + "\n\n" + "output:\n"
            + str.toUpperCase();
}

 
@Expose
public int multiply(int num1, int num2) {
    return num1 * num2;
}

這是如何做到的呢?另外在multiply方法中dorado是怎么將我們的一個map對象分拆為num1和num2的呢?要解釋這幾個問題就有必要先了解一下Dorado提供的職能方法適配功能。所謂職能方法適配是基于"約定優(yōu)于配置"的設(shè)計思路而提供。這樣在很多情況下我們不需要方法具有Dorado特性,也不需要引入Dorado的開發(fā)規(guī)范。由Dorado自動判斷這個方法中的各個參數(shù)以及返回值的用途。這是一種職能化的處理邏輯。這帶給我們的好處:

  • 幾乎不需要引入任何Dorado的API。
  • 按照業(yè)務(wù)的需要而不是Dorado的需要來為表現(xiàn)層編寫代碼。
  • 可以令Dorado與后臺業(yè)務(wù)邏輯之間的粘合層代碼更加簡潔、易讀。

如Ajax范例中的toUpperCase,Browser向服務(wù)器端傳遞的參數(shù)是我們在action的parameter屬性中定義的,因為傳過來的是一個字符串,智能方法在適配的時候會發(fā)現(xiàn)toUpperCase方法的參數(shù)就是一個字符串類型的,這樣它就自動認為你想調(diào)用的方法就是toUpperCase,并將parameter中的值作為str中的值傳入。這個方法調(diào)用結(jié)束之后返回了一個字符串給外界,而ajax調(diào)用就自動的將這個返回值作為ajax調(diào)用的返回值,如toUpperCaseAction的onSuccess方法:

// @Bind #toUpperCaseAction.onSuccess
!function(self){
    dorado.MessageBox.alert(self.get("returnValue"));
}

在multiply范例中前臺傳入的是一個JSON對象,可以就認為是一個Map對象:

var parameter = {
    num1: nums[0],
    num2: nums[1]
};
action.set("parameter", parameter).execute(function(result) {
    dorado.MessageBox.alert(nums[0] + " * " + nums[1] + " = " + result);
});

這樣后臺就拿到一個Map參數(shù),讓后對ajax這個bean進行方法匹配,會發(fā)現(xiàn)其中沒有完全匹配的,這個時候職能方法適配會將parameters中的參數(shù)拆開為num1,num2,這樣就可以發(fā)現(xiàn)存在對應(yīng)的multiply方法,并進行調(diào)用。并將結(jié)果作為ajax調(diào)用的結(jié)果返回到前臺:

action.set("parameter", parameter).execute(function(result) {
    dorado.MessageBox.alert(nums[0] + " * " + nums[1] + " = " + result);
});

我們直接將這個result顯示出來。multiply范例體現(xiàn)的是智能方法適配過程中map自動拆解的功能。

適配算法

上面我們通過Ajax范例對智能方法的適配規(guī)則有了一些基本的了解,下面總結(jié)一下適配算法。 首先智能方法適配按照參數(shù)名進行適配:

  • 即Dorado根據(jù)參數(shù)名來確定每個參數(shù)的作用。
  • 相對嚴謹?shù)倪m配規(guī)則,但有時使不夠業(yè)務(wù)化。例如對于AjaxAction的后端方法,其參數(shù)名必須為parameter。

如果按照上面的規(guī)則,toUpperCaseAction對應(yīng)的Ajax方法就必須為如下的形式:

@Expose
public String toUpperCase(String parameter) {
    return "input:\n" + parameter + "\n\n" + "output:\n"
            + parameter.toUpperCase();
}

這種方式有時候可能并不滿足我們對業(yè)務(wù)方法的命名習(xí)慣,不利于Java代碼的閱讀。 按照參數(shù)類型進行適配 另外我們還可以根據(jù)參數(shù)的類型進行方法適配。即Dorado根據(jù)參數(shù)類型來確定每個參數(shù)的作用。它存在的問題是:當參數(shù)較為復(fù)雜時Dorado可能無法準確的判斷個參數(shù)的作用。 混合式的適配規(guī)則(尚未提供) 即現(xiàn)根據(jù)名稱規(guī)則進行一次適配,對于那些無法匹配的參數(shù)繼續(xù)嘗試通過類型規(guī)則進行適配。自動方法適配不會強行調(diào)用目標方法,當其認為適配可能存在歧義時會報錯而不會繼續(xù)執(zhí)行方法調(diào)用。 Map 對于Map類的參數(shù)自動方法適配會嘗試將其拆解,用其中的鍵值對與方法參數(shù)進行適配。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號