那些令人哭笑不得,看了想揍人的 ABAP 变量命名方式,强烈不推荐

简介: 那些令人哭笑不得,看了想揍人的 ABAP 变量命名方式,强烈不推荐

2000年刚上大一时,我就从学校电脑机房的因特网,知道了国际 C 语言混乱代码大赛这个奇葩赛事。

国际 C 语言混乱代码大赛(IOCCC, The International Obfuscated C Code Contest)是一项国际编程赛事,从 1984 年开始,每年举办一次,目的是评选出最有创意的,最让人难以理解的 C 语言代码。

赛事官网:https://www.ioccc.org/,上面能看到每一年获奖作品的源代码和评委点评。说实话我也很佩服这项赛事的评委们。

来看一些作品。

下面这段 C 语言代码,用来计算圆周率。

计算字符串 MD5 hash 的代码。

一个扫雷游戏的源代码:

使用奇葩的变量命名方式,是这些参赛选手使用的基本技巧之一。

说到变量命名,ABAP 帮助文档里明确提到,对于 ABAP 命名惯例,包括数据类型,变量名称,ABAP 类和 procedure 的命名,最多允许 30 个字符的长度,推荐只使用 A 到 Z 的大小写英文字母,数字和下划线。

然而还存在 #,%,¥,* 这些特殊的字符,它们又能不能出现在 ABAP 编程语言的变量命名中呢?

可以想象,如果搞一个 ABAP 混乱代码大赛,那么源代码里肯定少不了这些特殊字符的身影。

哪些特殊字符,可以出现在 ABAP 数据类型,变量,以及 Procedure 和参数名称里,哪些则不行?

看下面这两张表格就行了。表格怎么来的,我先卖个关子,在文末揭晓答案。

先介绍怎么阅读这两张表格。

表格一共 10 列,第二列是字符本身,第一列是字符的 ASCII 编码(16进制),第三,四,五,六这四列,分别代表该字符,是否能够出现在 ABAP 变量命名的最后一个字符位置,中间字符位置,第一个字符位置,以及名称第一个位置后紧跟下划线的四种情况。

第七列开始的四列,代表同样的排列组合,只是讨论的是这些变量命名方式,在 ABAP 类内是否合法。

光用文字描述可能有点抽象,我们来看实际的例子。

感叹号 !和 "

根据表格,这两个特殊符号,不允许出现在 ABAP 变量名的任何位置。

# 号

根据表格,# 号可以出现在变量名称的中间和末尾,因此下列代码是合法的,可以正常编译和运行。

DATA: a#  TYPE c VALUE 'c',
           b#c TYPE i VALUE 1.
WRITE: a#, b#c.

$ 美元符号

根据表格,这个符号要分类讨论。

在普通的 ABAP 报表里,$ 能够出现在变量名称的任意位置。下列代码可以正常编译并运行。

DATA: a$  TYPE c VALUE 'c',
           b$c TYPE i VALUE 1,
           $ type string  value 'jerry'.
WRITE: a$, b$c, $.

当在 ABAP 类的源代码中使用时,$ 不允许出现在 ABAP 变量的任意位置。

比如下列代码第 21 行,会遇到编译错误:

Names can consist only of the characters "A-Z, “0-9”, “_”, and “-” and they also cannot begin with a digit.

两种 ABAP 编程上下文中,$ 符号表现行为的截然不同。这种现象也能解释,在笔者的文章 ABAP 真的会过时吗?聊聊 ABAP 的过去,现在和未来 里提到:1979 年,SAP 发布了第二代 ERP 系统,即 SAP R/2. ABAP 在 SAP R/2 的开发过程中发挥了重要作用,伴随着 ABAP 调试器、屏幕编辑器的出现,俨然已成长为一个完备的集成开发环境。

而 ABAP 面向对象特性的完全成熟,公认的时间点则在 R/2 问世的 20 年之后,即 Java 诞生的五年之后。ABAP 面向对象的编程范式,引入了更为严格的语法检查,本文介绍的对待 $ 符号的处理就是范例之一。

百分符号 %

这个符号比 $ 更为特殊。

在传统的 ABAP 报表开发里,% 能用在 ABAP 变量名称的任何位置。

下列代码能够正常编译并执行。

DATA: % type int4 value 1,
      %% like % value 2,
      %%% like %%.
%%% = %% / %.
WRITE:/ %%%.

当用在 ABAP 类里时,%后面伴随着下划线的命名方式是合法的,如下图第 21 行所示:

但是去掉下划线后,%a 这种用法就不合法,会遇到和使用 $ 时一样的编译错误:

& 号

不允许出现在变量名称的中间位置和末尾,但是可以出现在变量名称的开头和下划线之前。

下列代码可以通过编译和执行。

DATA: &a  TYPE c VALUE 'a',
      &_b LIKE &a VALUE 'c',
      c   TYPE string.
c = &a && &_b.
WRITE:/ c.

* 号

可以出现在传统 ABAP 报表变量的任意位置。不允许出现在 ABAP 类的变量名称里。

下列代码合法,计算的是 1 乘以 2 的值,将结果存储到变量 *** 里,最后打印结果 2.

至于其他的特殊字符,? < > ^ 之类,大家可以根据表格自己去尝试,本文不再赘述。

最后解答一点,这个表格怎么绘制出来的?

答案是,报表 DEMO_CHARACTERS_IN_ABAP_NAMES 的执行产物。

执行这个报表,选择想查看命名规则的类型,比如本文的表格,就是选择 Data Objects 之后执行的输出。

这个报表的设计原理是,通过 96 次循环,逐一检测 96 个字符在不同编程上下文的语法检查情况。如果语法检查失败,就说明这个字符,ABAP 编译器不允许它出现在对应的位置。

语法检查通过 ABAP 关键字 SYNTAX-CHECK 完成,如下图图例 1 所示,这个关键字接受一个内表作为输入参数(图例2),内表包含的就是待检查的 ABAP 源代码。这个内表在图例 3 所示的 edit_and_check 方法里,通过 REPLACE ALL OCCURANCES OF 关键字,把待检测的符号(存储在变量 token 里),替换到源代码内表变量 source 里。

从表格的输出来看,对于 ABAP 面向对象的编程环境里,ABAP 变量名称只允许包含英文字母,数字和下划线,因此在变量名称可读性这一块上,不容易出现太大的问题。

对于那些仍然在传统 ABAP 报表领域从事维护工作的朋友们来说,尽管在这种环境下 ABAP 编译器对特殊符号使用的检查,要宽松得多,但建议大家还是自觉遵守只使用英文字母,数字和下划线的组合,不给自己和别人找麻烦。毕竟,大家身边的同事,没有国际 C 语言混乱代码大赛的评委们那么有耐心。

相关文章
|
1月前
ABAP 7.40 新语法介绍系列之一 - ABAP 变量内联声明(Inline Declaration)试读版
ABAP 7.40 新语法介绍系列之一 - ABAP 变量内联声明(Inline Declaration)试读版
28 0
|
6月前
关于 unicode ABAP 程序的变量名不允许出现特殊字符的问题
关于 unicode ABAP 程序的变量名不允许出现特殊字符的问题
28 0
|
6月前
|
BI
如何把 SAP ABAP 字符串变量的值下载成本地文件,以及文件路径 F4 Value Help 的实现方式试读版
如何把 SAP ABAP 字符串变量的值下载成本地文件,以及文件路径 F4 Value Help 的实现方式试读版
49 0
|
6月前
|
API
使用 SAP ABAP API 读取内表变量占用的 ABAP 内存空间大小
使用 SAP ABAP API 读取内表变量占用的 ABAP 内存空间大小
57 0
|
7月前
使用 SAP ABAP 编程语言调用 Windows10 操作系统的 Powershell 命名并打印出执行结果
使用 SAP ABAP 编程语言调用 Windows10 操作系统的 Powershell 命名并打印出执行结果
43 0
|
7月前
简单聊聊 ABAP 变量消耗的内存空间这个话题的试读版
简单聊聊 ABAP 变量消耗的内存空间这个话题的试读版
46 0
|
7月前
|
存储 JSON BI
SAP ABAP 字符串变量容易疏忽和混淆的一些知识点试读版
SAP ABAP 字符串变量容易疏忽和混淆的一些知识点试读版
32 0
简单聊聊 ABAP 变量消耗的内存空间这个话题的试读版
简单聊聊 ABAP 变量消耗的内存空间这个话题的试读版
SAP ABAP 字符串变量容易疏忽和混淆的一些知识点试读版
SAP ABAP 字符串变量容易疏忽和混淆的一些知识点试读版
68 0
|
1月前
|
存储 数据处理 开发者
ABAP 如何把 unicode 代码点转换成字符
ABAP 如何把 unicode 代码点转换成字符
19 0

热门文章

最新文章