`
JerryWang_SAP
  • 浏览: 1055398 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

昨日万圣节ABAP怪兽级代码谜团,公布答案啦

阅读更多

首先非常感谢大家在周末还抽出宝贵的时间耗在Jerry昨天发布的文章 一段让人瑟瑟发抖的ABAP代码 上面。

虽然Jerry在文末开玩笑的声称,只有文章阅读量上千或者评论数超过50,才公布答案。其实这只是Jerry的玩笑,因为正如Jerry在之前一篇文章 5000粉丝数达成,感谢大家一如既往的支持 里提到,在微信自媒体泛滥的今天,大家能够在众多公众号中关注汪子熙公众号,并抽出时间来阅读Jerry或一本正经或胡说八道的文字,Jerry真的很感激,谢谢大家。

在分析ABAP代码谜题之前,Jerry还想讲一个故事。Jerry 2007年加入SAP成都研究院时,我老板的老板是E君,当时就已经是在SAP界打拼很多年的老江湖了。E君平时表情严肃的时候居多,做事雷厉风行,很有领导的范,包括Jerry在内的很多刚毕业入职的新人们都很害怕他(当然Jerry现在不怕了,哈哈)。

2008年的时候,Jerry还是标准的ABAP菜鸟一枚,有一天学到了如何使用ABAP发送邮件给一个Distribution List,并任意指定邮件的SendTo字段。Jerry那时觉得这个技巧很酷(当时的确够菜的 -_-),正好当时我在开发一个工具,需要向整个团队的DL汇报进度。于是Jerry在用邮件汇报进度的时候,没有采用在Outlook里编写邮件然后发送的方式,而是写了一段ABAP代码,把邮件发送给了整个团队。很多同事收到邮件后,因为SendTo字段为空,所以不知道这封邮件是谁发的。当时Jerry觉得这很酷。

后来E君把我叫到他的办公室谈工作上的事情时,特意提到了这封邮件,他说他不用猜都知道一定是我发的,然后问我为什么要这样做,听完我的解释之后,先说了句:“以后别这样。”然后给我分析了原因。从那以后,Jerry慢慢地开始懂得,作为一个SAP应用开发人员,再新再酷再吸引眼球的技术,如果不能为业务服务,不能为客户服务,那也make no sense at all.

回到题目本身。这道题不过是用于万圣节搞怪消遣的产物罢了,相信没有任何ABAP开发顾问会在实际工作者去模仿这种风格来编码。

Jerry给大家介绍这个谜题,目的不是在炫耀ABAP这门语言的一些奇技淫巧,而是觉得我们仍然可以从谜题本身找到一些积极的因素,比如借此弄清楚一些平时掌握得似是而非的ABAP语言特性。

(1) 从评论区能看出,很多朋友都找到了谜题的突破口,即 NOT=>NOT( NOT ). 这是典型的ABAP类静态方法调用的语法,因此说明,在名为NOT的INCLUDE里,包含了一个名为NOT的ABAP类,有一个名为NOT的静态方法。同时,这个静态方法调用的前面出现了OR这个布尔逻辑运算符,只能有一种情况才能通过语法检查,就是NOT静态方法的输出参数为RETURNING类型,然后该输出参数作为OR的操作数。

值得一提的是,很多其他编程语言都禁止使用关键字保留字来命名标识符或者类,而ABAP却没有这个限制,显得有点特立独行。

(2) 也有朋友在评论区提到,代码可执行部分以IF开头,但是却没有以ENDIF结尾。唯一的解释,就是在NOT这个include里,声明了包含ENDIF语句的宏,并把宏的名称取名为NOT.

(3) ABAP里感叹号的用法。

ABAP帮助文档里说的很清楚,!作为ABAP里的转义字符,能够告诉ABAP编译器,!后面紧跟的并不是关键字,而是普通的ABAP标识符。

给出的例子也很清晰,如果有人非要用CHANGING和USING作为形式参数的名称,只需要在前面加上感叹号即可。

而如果感叹号后面跟的并不是真的ABAP关键字,而是普通的标识符,那又会如何呢?

答案是,此时感叹号会直接被忽略。看下面的例子,加上感叹号的效果和不加一致。

(4) 现在我们已经知道了,题目中的!NOT,暗示大家在NOT include里,还定义了一个名为NOT的变量。

首先我们把谜题里迷惑人眼球的障眼法全部拿掉。

在有NOT参与的ABAP逻辑判断语句里,出现偶数个NOT,相当于一个NOT也未出现过(类似负负得正的原理),出现奇数个NOT,只相当于出现一个NOT.

所以题目中那多余的一系列NOT,就像《笑傲江湖》中衡山掌门莫大先生那套“衡山百变千幻云雾十三式”中的虚招一样,能让不明就里的对手眼花缭乱。

人称“琴中藏剑,剑发琴音”的莫大,凭借这手如梦如幻的剑法,在衡山城外击杀了嵩山十三太保之一的“大嵩阳手”费彬。即使武功强如费彬,也没弄看透莫大剑法中的虚招。而亲爱的ABAP顾问们,这道谜团中重复的NOT虚招,大家看透了没?

仔细观察代码中所有出现!NOT的地方,按照上述法则去除掉多余的NOT之后,能够提取出两个规律:

a. !NOT 前面至少有一个IF,OR或者AND
b. !NOT 后面直接结束,并未出现 IS INITIAL或者 > XXX, <> XXX等判断语句。

什么样的ABAP变量类型允许这种操作呢?

整型不行:

字符串类型不行:

而SELECTION-OPTIONS就可以。

这个SELECTION-OPTIONS是ABAP古董级的功能了,在SAPGUI下做Dynpro开发的顾问们会经常用,而SAP Cloud Platform ABAP编程环境下已经不再支持了。

上述四个语法点逐一突破后,如何编写NOT include的源码,思路也就清晰了。

源代码如下:

如果想复制粘贴这段代码,可以访问Jerry的github:

https://github.com/i042416/KnowlegeRepository/blob/master/ABAP/backup/NOT.include.abap

感谢阅读。

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

0
0
分享到:
评论

相关推荐

    ABAP OLE颜色代码

    ABAP OLE 颜色代码 ABAP OLE 颜色代码是指在 ABAP 编程语言中使用的颜色代码。这些代码用于在用户界面中显示不同的颜色,例如背景颜色、文字颜色、按钮颜色等。 在 ABAP 中,颜色代码通常以 šestnaestkovo ...

    sap abap query高级功能

    它提供了丰富的功能,使得开发人员可以构建复杂的数据查询,而无需编写大量的 ABAP 代码。在本文中,我们将深入探讨 SAP ABAP Query 的高级特性。 首先,ABAP Query 允许用户添加自定义字段和计算字段。这些字段的...

    下载ABAP程序源代码的程序.pdf

    下载ABAP程序源代码的程序 ABAP(Advanced Business Application Programming)是一种高级商业应用程序编程语言,主要用于SAP R/3系统中。ABAP语言具有强大的编程能力、灵活的数据类型、丰富的内置函数和强大的错误...

    SAP ABAP 代码备份下载到本地程序代码

    SAP ABAP 代码备份下载到本地程序代码

    ABAP开发教程及代码(含SAP各模块实例代码)

    SAP+ ABAP开发实用教程:顾问培训资料,含实例代码和教程,详细描述ABAP开发过程:数据表读法、程序规范、代码实例、调试方法以及ABAP开发环境和总体介绍、 ABAP语法示例 、ALV控件的使用、 实战Form设计 ,分基础、...

    SAP ABAP 1.4.4代码下载

    在SAP ABAP 1.4.4版本的代码下载中,我们可以深入探讨这个版本的特性和功能。 首先,SAP ABAP不仅是一种编程语言,还是一个完整的开发环境,它包含了编写、测试和调试代码的所有工具。在1.4.4这样的版本中,通常会...

    ABAP 代码下载备份 1.5.1

    ABAP 代码下载备份 1.5.1

    ABAP事务代码大全

    对于大家想学sap ABAP开发的来说,ABAP的T-Code是很重要的,但是,事务代码有很多,大家也不可能全部都能记住的,所以特吧ABAP事务代码列出来,大家可以参考的

    内含ABAP入门资源(11天学会ABAP)以级中级ABAP篇,高级ABAP资料

    ABAP,全称为Advanced Business Application Programming,是SAP公司开发的一种高级编程语言,主要用于构建企业级的业务应用程序。本资源包包含从入门到高级的ABAP学习材料,旨在帮助学习者在11天内掌握ABAP的基础,...

    ABAP源代码参考(适合初学者)

    在IT行业中,SAP ABAP(Advanced Business Application Programming)是一种广泛使用的编程语言,主要用于开发SAP企业级应用。本资源集合“ABAP源代码参考”是针对初学者的理想学习材料,包含了112份源代码实例,...

    ABAP调优-代码优化.docx

    ABAP调优是提高ABAP程序执行效率的关键技术,它涉及到代码优化的多个方面。以下是一些关于ABAP代码优化的重要知识点: 1. **优化Open SQL**:在编写Open SQL时,应尽量利用索引来提升查询性能。对于标准内表,可以...

    ABAP代码性能指导

    ### ABAP代码性能指导 #### 一、简介 在企业级应用开发中,特别是基于SAP系统的开发,ABAP(Advanced Business Application Programming)语言是非常重要的工具之一。为了提高ABAP程序的执行效率,确保系统响应...

    ABAP GIT 项目 AI SDK FOR ABAP 代码

    在这个“ABAP GIT 项目 AI SDK FOR ABAP 代码”中,我们将探讨如何在ABAP环境中集成人工智能(AI)功能,以及利用Git进行代码版本控制。 AI SDK for ABAP是SAP提供的一个软件开发工具包,它允许开发人员在ABAP平台...

    abap代码检查规范

    abap代码规范,高效abap、modern abap

    ABAP自开发程序下载源码

    ABAP自开发程序下载源码

    ABAP面试题大全含答案.pdf

    ABAP面试题最全合集(含答案)

    ABAP代码规范二例

    ABAP代码规范二例 内容节选: ******************************** 变量命名规则 Type Name:T_ Internal tables (global): gt_ Internal Tables (Local):it 工作区(structure): wa_ 全局变量: g_ 局部变量: l_ Ranges ...

    abap代码规范手册

    ### ABAP代码规范手册知识点概览 #### 一、标题:ABAP代码规范手册 - **主要内容概述**:本手册旨在提供一套全面且实用的ABAP编程规范,以确保开发人员能够编写出高质量、可维护性强的ABAP代码。手册覆盖了从基本...

    abap程序源代码导出到本地文件

    在SAP系统中,ABAP(Advanced Business Application Programming)是一种编程语言,用于开发企业级的应用程序。本主题涉及的知识点是“ABAP程序源代码的导出到本地文件”,这通常是一个重要的维护和备份过程,方便...

    ABAP351高级编程-动态编程.rar

    ABAP(Advanced Business Application Programming)是SAP系统中的一种编程语言,主要用于开发企业级的应用程序。在"ABAP351高级编程-动态编程.rar"这个压缩包中,我们聚焦于ABAP的高级主题——动态编程。动态编程是...

Global site tag (gtag.js) - Google Analytics