介绍一种在ABAP内核态进行内表高效拷贝的方法
内表操作是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](https://github.com/i042416/JavaTwoPlusTwoEquals5/tree/master/src/corresponding
)上:
再来看Jerry用JavaScript如何实现这个工具类的。先看在JavaScript里消费工具类的代码,仍然是声明式编程熟悉的味道:
因为function是JavaScript世界里的一等公民,所以JavaScript的实现版本,能写出更原汁原味函数式编程的解法出来:
如果要拷贝JavaScript版本的工具类CL_JS_CORRESPONDING的实现代码,可以从Jerry这篇博客里获得:
CL_ABAP_CORRESPONDING, CL_JAVA_CORRESPONDING and CL_JS_CORRESPONDING
希望这个简单的例子,能让大家感受到命令式编程和声明式编程的差异,感谢阅读。
本文来自云栖社区合作伙伴“汪子熙”,了解相关信息可以关注微信公众号"汪子熙"。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
2019年常见的Linux面试题及答案解析,哪些你还不会?
Linux 面试题 1、绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示? 切换目录用什么命令?2、怎么查看当前进程?怎么执行退出?怎么查看当前路径?3、怎么清屏?怎么退出当前命令?怎么执行睡眠?怎么查看当前用户id?查看指定帮助用什么命令?4、Ls 命令执行什么功能? 可以带哪些参数,有什么区别?5、建立软链接(快捷方式),以及硬链接的命令。6、目录创建用什么命令?创建文件用什么命令?复制文件用什么命令?7、查看文件内容有哪些命令可以使用?8、随意写文件命令?怎么向屏幕输出带空格的字符串,比如”helloworld”?9、终端是哪个文件夹下的哪个文件?黑洞文件是哪个文件夹下的哪个命令?10、移动文件用哪个命令?改名用哪个命令?11、复制文件用哪个命令?如果需要连同文件夹一块复制呢?如果需要有提示功能呢?12、删除文件用哪个命令?如果需要连目录及目录下文件一块删除呢?删除空文件夹用什么命令?13、Linux 下命令有哪几种可使用的通配符?分别代表什么含义?14、用什么命令对一个文件的内容进行统计?(行号、单词数、字节数)15、Grep 命令有什么用? 如何忽略大小...
- 下一篇
ABAP和Java里的单例模式攻击
面向对象编程世界里的单例模式(Singleton)可能是设计模式里最简单的一种,大多数开发人员都觉得可以很容易掌握它的用法。单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。 然而在某些场景下,这种设计模式的单例特性会被破坏,看下面这个例子: ![clipboard1,1](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91c2VyLWltYWdlcy5naXRodWJ1c2VyY29udGVudC5jb20vNTY2OTk1NC82ODUzODMxMy02YmJkMTIwMC0wM2FkLTExZWEtOTkyYi1jYTEyOGE3NWUyMWQucG5n?x-oss-process=image/format,png) 代码的第三行,这个ABAP类实现了接口if_serializable_object,这意味着它可以被关键字CALL TRANSFORMATION进行序列化和反序列化操作。 使用下面的ABAP代码: ```ABAP DATA(lo_instance) = zcl_jerry_singleton=>get_instan...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Linux系统CentOS6、CentOS7手动修改IP地址
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS6,CentOS7官方镜像安装Oracle11G
- Windows10,CentOS7,CentOS8安装Nodejs环境