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