javascript
介绍一种在ABAP内核态进行内表高效拷贝的方法,和对应的Java和JavaScript版本的伪实现
內(nèi)表操作是ABAP開發(fā)人員幾乎在每個(gè)ABAP程序里都會(huì)遇到的。
看一個(gè)例子:有兩個(gè)行結(jié)構(gòu)不一樣的內(nèi)表,每個(gè)內(nèi)表的行結(jié)構(gòu)有三列,除了name這一列名字一致外,其他兩列的名稱都不同,下圖用紅色和藍(lán)色標(biāo)注出來。
如果要把內(nèi)表developer_list里的兩位開發(fā)人員Jerry和Tom的信息按照下圖的映射關(guān)系拷貝到內(nèi)表presale_list里:
常規(guī)做法當(dāng)然是用一個(gè)LOOP循環(huán),引入兩個(gè)臨時(shí)變量,先把內(nèi)表1逐行賦給臨時(shí)變量1,再把臨時(shí)變量1逐列賦給臨時(shí)變量2.
在ABAP 750版本里,提供了一個(gè)輔助類cl_abap_corresponding,能以聲明式編程的方式完成這個(gè)內(nèi)表復(fù)制任務(wù)。
通過工具類的create方法,第二行和第三行指定要進(jìn)行復(fù)制操作的源和目標(biāo)內(nèi)表,第四到六行告訴工具類內(nèi)表復(fù)制的列字段映射規(guī)則。之后第8行調(diào)用execute方法完成復(fù)制操作。
大家更喜歡哪一種方式?這個(gè)例子雖然簡(jiǎn)單,但包含了一個(gè)編程領(lǐng)域的基礎(chǔ)知識(shí)點(diǎn):命令式編程(Imperative Programming)和聲明式編程(Declarative Programming)。
第一種使用LOOP循環(huán)的解法是典型的命令式編程的例子,我們定義了兩個(gè)臨時(shí)變量,通過循環(huán)體內(nèi)的三條賦值指令,命令代碼去執(zhí)行以完成內(nèi)表拷貝。第二種解法, 作為應(yīng)用開發(fā)人員,我們只是向工具類做出聲明,我們想對(duì)哪兩個(gè)內(nèi)表根據(jù)什么樣的映射邏輯進(jìn)行拷貝。至于工作類如何執(zhí)行,應(yīng)用開發(fā)人員不操心,這就是聲明式編程。
當(dāng)然,即便是聲明式編程,工具類的代碼也總得有人實(shí)現(xiàn)。雙擊execute方法,發(fā)現(xiàn)是ABAP內(nèi)核態(tài)的C語言實(shí)現(xiàn)的。
對(duì)于SAP客戶和partners來說,無法看到這個(gè)ab_kmMvcdExecute內(nèi)核方法的源代碼,詳情參考Jerry的文章:聊聊C語言和ABAP。
大家可以試著自己用ABAP來模擬實(shí)現(xiàn)一個(gè)自己的CL_ABAP_CORRESPONDING. 這里Jerry提供一份Java版本的實(shí)現(xiàn)。
Java里萬物皆對(duì)象,所以我們分別定義Developer和Presale類:
創(chuàng)建兩個(gè)Java list來模擬ABAP里的內(nèi)表:
然后我的目的是,把第一個(gè)list里,Jerry和Tom這兩位開發(fā)者的name, focusLanguage和salary字段分別賦給第二個(gè)list對(duì)應(yīng)實(shí)例的name, focusArea和salaryPlusBonus字段,模擬一個(gè)公司內(nèi)部轉(zhuǎn)崗的操作。
同ABAP使用工具類的方式一樣,我聲明了兩條映射規(guī)則,分別是第二行的mapping實(shí)例1,將focusLanguage字段直接賦給focusArea字段,以及第5行的mapping實(shí)例2,將salary字段的值乘以2,再賦給salaryPlusBonus字段。最后調(diào)用execute方法完成賦值。為了便于ABAP開發(fā)人員同之前的ABAP內(nèi)表拷貝的例子進(jìn)行比對(duì),這里雖然是Java代碼,但是CL_MAPPING和CL_JAVA_CORRESPONDING這兩個(gè)類,我仍然用的是ABAP的命名規(guī)范,而非Java的駝峰式命名。
CL_JAVA_CORRESPONDING的實(shí)現(xiàn)如下:execute調(diào)用map, map調(diào)用mapEach,提取用戶指定的映射規(guī)則里的字段名,使用Java反射機(jī)制完成操作。
完整代碼位于Jerry的github上:
再來看Jerry用JavaScript如何實(shí)現(xiàn)這個(gè)工具類的。先看在JavaScript里消費(fèi)工具類的代碼,仍然是聲明式編程熟悉的味道:
因?yàn)閒unction是JavaScript世界里的一等公民,所以JavaScript的實(shí)現(xiàn)版本,能寫出更原汁原味函數(shù)式編程的解法出來:
如果要拷貝JavaScript版本的工具類CL_JS_CORRESPONDING的實(shí)現(xiàn)代碼,可以從Jerry這篇博客里獲得:
CL_ABAP_CORRESPONDING, CL_JAVA_CORRESPONDING and CL_JS_CORRESPONDING
希望這個(gè)簡(jiǎn)單的例子,能讓大家感受到命令式編程和聲明式編程的差異,感謝閱讀。
要獲取更多Jerry的原創(chuàng)文章,請(qǐng)關(guān)注公眾號(hào)"汪子熙":
總結(jié)
以上是生活随笔為你收集整理的介绍一种在ABAP内核态进行内表高效拷贝的方法,和对应的Java和JavaScript版本的伪实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 周鸿祎发内部信要求360全面拥抱人工智能
- 下一篇: 迈莎锐星际骑兵亮相上海车展:中国仅1台