写点什么

ABAP 编程语言中 Class(类) 的设计原理剖析

作者:Jerry Wang
  • 2022 年 7 月 08 日
  • 本文字数:2072 字

    阅读完需:约 7 分钟

ABAP 编程语言中 Class(类)的设计原理剖析

在具体介绍 ABAP 这门编程语言的 Class(类) 的设计原理之前,先简单介绍一下 ABAP 编程语言本身。


ABAP 是 SAP 公司推出的一门高级编程语言,全称是 Advanced Business Application Program. 在使用 ABAP 编程语言之前,必须先安装 Application Server ABAP (下文简称 AS ABAP)作为 ABAP 系统的应用层。AS ABAP 提供了 ABAP 运行时框架,ABAP 程序在该框架中独立于平台执行。


AS ABAP 必须连接到数据库层或数据库系统,其核心数据集存储在标准数据库中。


基于 UI 的访问需要一个展现层(Presentation Layer)来显示 AS ABAP 用户界面(在 SAP GUI 或 Web 浏览器中)。


ABAP 应用服务器支持下列三种交互组件:

RFC 接口

这是 AS ABAP 的经典功能界面。远程函数调用是对远端(目标)系统中的函数的调用,而不是调用程序运行的本地系统中的函数。调用可以在不同的 AS ABAP 之间,也可以在 AS ABAP 和外部第三方系统之间进行。在 AS ABAP 中,通过功能模块(Function Module)实现各个功能。在外部系统中,专门编程的函数被称为其接口模拟函数模块。

互联网通讯管理器(ICM)

Internet 通信管理器 ICM (Internet Communication Manager)是 AS ABAP 的一个进程,允许它直接使用 HTTP、HTTPS 或 SMTP 与 Internet 通信。ICM 用于连接基于 Web 的表示组件,如 SAPUI5、Web Dynpro ABAP、BSP 等。ICM 还允许使用 AS ABAP 作为 Web 服务的客户机和服务器。使用 Internet 通信框架(ICF)的类和接口从 ABAP 程序访问 ICM。

ABAP 渠道(Channel)

ABAP 通道 是 AS 实例与 Internet 之间基于事件的通信框架。ABAP 消息通道(AMC)用于在不同 AS 实例的 ABAP 程序之间交换消息,而 ABAP 推送通道(APC)用于在 AS ABAP 与 Internet 之间使用 WebSocket 协议或 TCP 套接字协议进行双向通信。


ABAP Class 在上述提到的 ICM 和 ABAP Channel 里都有着广泛的应用。


ABAP 数据建模使得为定义在数据库上的业务应用程序创建数据模型成为可能:


ABAP Dictionary 是数据类型及其关系的持久存储库,它们是可见的,可以在所有其他开发对象中使用。ABAP 字典用于管理标准 AS ABAP 数据库的数据库表、视图和锁对象。ABAP 核心数据服务为 AS ABAP 实现了 SAP CDS 概念。独立于平台的 CDS DDL 和 CDS DCL 使得定义 CDS 实体(如 CDS 视图或 CDS 表函数)以及相关的 CDS 角色及其语义充实成为可能。


我们新建一个 ABAP 类之后,完成代码编写,第一次激活时,会看到这些以类的名称开头,中间跟着一大段 = 符号,以五个字符结尾的对象出现在待激活列表里。它们是什么鬼?



我们来动手研究一番。Jerry 在 2019 猪年大年三十写的文章 SAP GUI 和 Windows 注册表 曾经提到 Windows 系统的注册表,而 ABAP Netweaver 也有属于自己的注册表:TADIR 和 TRDIR. 无论在 SE80 或者是 SE11 事务码里创建的对象,在这两张表里都会留下一些痕迹。创建一个最简单的 ABAP 类,包含 public,protected 和 private 方法和属性各一个,麻雀虽小,五脏俱全。



激活之后,在注册表 TRDIR 里根据类的名字 ZCL_ABAP_CLASS 进行查询,得到如下记录:



由此可见,ABAP 里的类(Class), 技术上是通过若干可以通过 SE38 直接打开的 ABAP include 程序组成:



对于上述 TRDIR 里的记录,我们可以逐一用 SE38 打开,搞清楚它们到底代表什么含义。

CCAU

这个 AU 的含义可以用 ABAP Unit 来帮助记忆。



SE38 打开 include 程序之后,自动进入下面这个界面,发现 CCAU 程序存储的是这个类的单元测试代码。


CCDEF

DEF 代表 Definition(定义). SE38 里打开 ZCL_ABAP_CLASS================CCDEF,看到的是这个界面:



此处维护的是 ABAP 类的局部定义,包括类的局部类,局部接口,局部类型定义等等。也可以先进入 SE24,然后点击 Local Definitions/Implementations 打开。


CCIMP

IMP 代表 implementation(实现). SE38 打开 ZCL_ABAP_CLASS================CCIMP, 能看到局部类的实现。


CI

类的私有区域定义。


CO

类的 protected 区域定义。


CU

类的公有区域定义。


CMXXX

CM 代表 Class Method,XXX 是类的方法序号,基于 16 进制,从 1 开始递增,例如 CM001 存储类的第一个方法的实现代码,CM002 代表第二个方法,以此类推。例如,SE38 里打开 ZCL_ABAP_CLASS================CM001,看到的是第一个私有方法的源代码:



ZCL_ABAP_CLASS================CM002:



ZCL_ABAP_CLASS================CM003:


CCMAC

MAC 是 Macro(宏)的缩写,存储类的宏定义。



如何用代码的方式获得一个类的这些不同的 ABAP include 程序名称呢?使用 ABAP 工具类 CL_OO_CLASSNAME_SERVICE:



比如我想知道 CL_CRM_BOL_CORE 这个类所有方法对应的 include 名称,那么在工具类的 GET_ALL_METHOD_INCLUDES 打个断点,然后 SE24 里打开 CL_CRM_BOL_CORE,点击 Source Code Based:



断点立即触发,从调用栈能看出,为了在 Source Code 模式下显示出 ABAP 类的完整代码,需要把散落存储在各个 include 程序里的代码读取出来。



类方法和其 include 程序名称的对应关系一目了然。



在 ABAP Type Group SEOP 里,存储了本文介绍的以 CC 开头的 include 类型的常量定义。



相信阅读了本文之后,下次大家在各个场合里遇到以 CCXXX 结尾的这些 ABAP include,不会再觉得一头雾水了。

总结

本文首先介绍了 ABAP Class 在 ABAP AS 三大通讯模块中的应用,接着详细介绍了 ABAP Class 组成各部分的命名规范和使用方式。

发布于: 刚刚阅读数: 4
用户头像

Jerry Wang

关注

🏆InfoQ写作平台-签约作者🏆 2017.12.03 加入

SAP成都研究院开发专家,SAP社区导师,SAP中国技术大使。2007 年从电子科技大学计算机专业硕士毕业后加入 SAP 成都研究院工作至今。工作中使用 ABAP, Java, JavaScript 和 TypeScript 进行开发。

评论

发布
暂无评论
ABAP 编程语言中 Class(类)的设计原理剖析_服务器_Jerry Wang_InfoQ写作社区