ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼

本文是鼠年第二篇文章,也是汪子熙公众号第201篇原创文章。

今天是鼠年大年初二,不知道昨天的大年初一,大家过得如何?

最近这段非常时期,像Jerry这类宅男,能够理直气壮地以“响应国家号召,不给国家和社会添乱”为理由宅在家里。

ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼
ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼

为了降低对病毒的恐惧感,让我们继续学习,分散下对疾病的注意力。

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

ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼

我们来动手研究一番。Jerry在2019猪年大年三十写的文章 SAP GUI和Windows注册表 曾经提到Windows系统的注册表,而ABAP Netweaver也有属于自己的注册表:TADIR和TRDIR. 无论在SE80或者是SE11事务码里创建的对象,在这两张表里都会留下一些痕迹。

创建一个最简单的ABAP类,包含public,protected和private方法和属性各一个,麻雀虽小,五脏俱全。

ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼

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

ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼

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

ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼

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

CCAU

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

ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼

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

ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼

CCDEF

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

ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼

此处维护的是ABAP类的局部定义,包括类的局部类,局部接口,局部类型定义等等。

也可以先进入SE24,然后点击Local Definitions/Implementations打开。

ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼

CCIMP

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

ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼

CI

类的私有区域定义。

ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼

CO

类的protected区域定义。

ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼

CU

类的公有区域定义。

ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼

CMXXX

CM代表Class Method,XXX是类的方法序号,基于16进制,从1开始递增,例如CM001存储类的第一个方法的实现代码,CM002代表第二个方法,以此类推。

例如,SE38里打开ZCL_ABAP_CLASS================CM001,看到的是第一个私有方法的源代码:

ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼

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

ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼

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

ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼

CCMAC

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

ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼

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

使用ABAP工具类CL_OO_CLASSNAME_SERVICE:

ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼

比如我想知道CL_CRM_BOL_CORE这个类所有方法对应的include名称,那么在工具类的GET_ALL_METHOD_INCLUDES打个断点,

然后SE24里打开CL_CRM_BOL_CORE,点击Source Code Based:

ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼

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

ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼

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

ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼

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

ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼

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

要获取更多Jerry的原创文章,请关注公众号"汪子熙":
ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼