智能方法適配

2024-03-07 18:37 更新

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

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

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

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

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

在multiply范例中前臺(tái)傳入的是一個(gè)JSON對(duì)象,可以就認(rèn)為是一個(gè)Map對(duì)象:

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

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

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

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

適配算法

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

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

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

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

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

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)