介绍一种在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版本的伪实现的更多相关文章
- 【ABAP系列】SAP ABAP 取两个内表的交集 比较两个内表的不同
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 取两个内表的交 ...
- [SAP ABAP开发技术总结]内表操作
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- ABAP基础篇1 内表
内表类型 abap 内表类型有三种: 标准表(一般ABAP程序中用的最多就是这种表) 系统为该表的每一行数据生成一个逻辑索引,自己内部维护着行号(Index)的编码.表的键值不唯一,且没有按照表键自动 ...
- ABAP语法篇2 内表操作语法
VALUE MOVE-CORRESPONDING CORRESPOING FOR REDUCE GROUP BY FILTER VALUE语法: 结构赋值 ... VALUE dtype | #( ...
- ABAP中不修改内表参照的结构,给内表/结构体增加字段
Situation: DATA: itab TYPE STANDARD TABLE OF zsrsodtla_stru1, wa_itab TYPE zsrsodtla_str ...
- cpu内核态与用户态
1.操作系统需要两种CPU状态 内核态(Kernel Mode):运行操作系统程序,操作硬件 用户态(User Mode):运行用户程序 2.指令划分 特权指令:只能由操作系统使用.用户程序不能使用的 ...
- ABAP 内表 详解
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 一种用单片机AD采样方式来检测交流市电电压的方法
下面介绍一种用单片机AD采样的方式检测市电电压的方法 要检测交流市电的电压,通常有两种方法 一.通过频繁的采样后再求平均值来获得实际电压值 二.通过采样交流市电的峰值,再通过算法得出实际电压值 这里 ...
- Linux用户态与内核态通信的几种方式
本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. Linux 用 ...
随机推荐
- Openresty与Tengine
Tengine官方网站:http://tengine.taobao.org/index_cn.html OpenResty官方网站:http://openresty.org/ Openresty和Te ...
- conda进行python环境隔离
1.环境隔离的问题 在使用python时,常常遇到的问题: pip安装库A,依赖库B-2.1版本 pip安装库C,以来库B-3.1版本,安装会提示库B的版本冲突错误. 这种情况下就需要做环境隔离 co ...
- awk:for循环输出文件名
简单来说,有file1.txt, file2.txt, file3.txt file1.txt如下: 1 a 4 d d g file2.txt如下: 2 b g 6 9 0 file3.txt如下: ...
- Spring Boot入门学习,解决复杂的spring配置文件及jar包
转载:https://www.cnblogs.com/wmyskxz/p/9010832.html 总结 为何出了这样的框架? Spring Boot 是所有基于 Spring 开发的项目的起点.Sp ...
- CKA认证简介
- Jmeter做压力测试
1)首先双击bin/jmeter.bat 2)创建Thread Group 3)配置HTTP Request 4)配置Aggregate Report 5)配置并发数和并发时间 6)点击绿色按钮,执行 ...
- spark笔记 环境配置
spark笔记 spark简介 saprk 有六个核心组件: SparkCore.SparkSQL.SparkStreaming.StructedStreaming.MLlib,Graphx Spar ...
- openstack集群访问外部服务出现访问失败
场景描述: openstack私有云中的容器服务A(部署在openshift上)需要通过http访问阿里云中的B服务,中间需要经过openstack的nat网关,以及阿里云的lb.但在访问时发现访问失 ...
- 64位linux安装了32位jdk8报错怎么办-bash:/usr/local/jdk1.8/jdk1.8.0_181/bin/java:/lib/ld-linux.so.2:badELFinterpreter:Nosuch
-bash:/usr/local/jdk1.8/jdk1.8.0_181/bin/java:/lib/ld-linux.so.2:badELFinterpreter:Nosuch https://bl ...
- 【Python爬虫案例学习】python爬取淘宝里的手机报价并以价格排序
第一步: 先分析这个url,"?"后面的都是它的关键字,requests中get函数的关键字的参数是params,post函数的关键字参数是data, 关键字用字典的形式传进去,这 ...